專案中用到乙個類,他有乙個儲存資料的屬性value,這個屬性有個比較奇怪的地方就是,他的型別,是無法預先估計的,會隨著軟體的擴充套件而變化,
也就是我們常說的動態型別。
二、分析問題 這個問題解決方法很容易就可以看出有2種:
1、使用object基類
使用這種方式能夠解決問題,但是會引起裝箱、拆箱等影響效能的低效操作,不可取;
2、使用泛型類
使用泛型類也是能夠解決問題的,但是在所有使用該物件時指出具體的型別,而這個會讓上層使用該類時因具體類不同而不好組織,也不可取;
三、解決問題
為了避免傷處麻煩,我採用了泛型類 + 泛型方法的模式來解決問題,簡單的說,就是
1、把value的型別抽象出來做成乙個類,我們稱他為dynamicvalue,這個類含有datatype來儲存value的資料型別,並提供了泛型方法getvalue和
setvalue來讀寫value的值。
2、在從dynamicvalue上,派生乙個泛型類dynamicvalue,用來實際儲存資料。
使用這個方法的好處就是,避免了使用object會產生的裝箱、拆箱動作,封裝了泛型類的具體型別變化,更加容易管理和使用了。
四、具體實現看下面的**:
///
/// 動態資料型別
///
public class dynamicvalue
///
/// 獲取值之泛型方法
///
/// 值型別
///
/// 值
///
public t getvalue()
return default(t);
}///
/// 設定值之泛型方法
///
/// 值型別
/// 待複製引數
///
/// false:設定失敗
/// true:設定成功
///
public bool setvalue(t value)
return false;}}
///
/// 動態資料型別之泛型類
///
///
public class dynamicvalue: dynamicvalue
///
/// 建構函式
///
public dynamicvalue()
: this(default(t))
///
/// 建構函式
///
///
public dynamicvalue(t value)
}五、測試**
class program
}class testvalue
public override string tostring()
}六、測試結果
型別正確,返回應有的值
12.3
型別不匹配,返回default(t),即:值型別為0,引用型別為null
型別不匹配,返回default(t),即:值型別為0,引用型別為null
0型別正確,返回應有的值
value = 0
press any key to exit..
泛型 泛型類 泛型方法 泛型擦除
1 是什麼?一種允許我們在不確定引數型別時候使用的型別。例如我不知道a方法應該會傳string還是int,我就用個泛型先佔坑。2 為什麼要用泛型?泛型可以在編譯期自動確定具體型別,檢查型別是否匹配,可以提高 的重用率,減少冗餘編碼。3 泛型與object的區別?像上面說的我不知道方法a的引數型別,其...
泛型類泛型方法
泛型定義 操作的資料型別被指定為乙個引數,將原來的具體資料資料型別引數化。泛型類 1.泛型引數必須是引用資料型別 2.不能 new t 例如可以 this.element t new object 來強制轉換 3.不能 new t 4建立例項物件時忘寫 t 預設為object 例如 myarrayl...
泛型類,泛型方法,泛型介面
泛型,就是一種不確定的資料型別。如果在類後面加上 這個類就變成了泛型類。這個 t可以使用任意的字母代替。表示定義了一種不確定的資料型別,這種不確定的資料型別必須在使用這個類 比如建立物件 的時候才能確定下來。如果希望縮小泛型的範圍,延後泛型的確定時間,讓泛型在呼叫方法的時候確定,那麼我們可以使用泛型...