敬畏每一行程式碼,敬畏每一份託付
從開發第一個系統,一直在使用泛型。那麼為什麼要使用泛型呢?或者說泛型有什麼好處。
先來看官方的的解釋:
泛型類和泛型方法同時具備可重用性、型別安全和效率,這是非泛型類和非泛型方法無法具備的。 泛型通常用與集合以及作用於集合的方法一起使用。 .NET Framework 2.0 版類庫提供一個新的名稱空間 System.Collections.Generic,其中包含幾個新的基於泛型的集合類。
建議面向 .NET Framework 2.0 及更高版本的所有應用程式都使用新的泛型集合類,而不要使用舊的非泛型集合類如 ArrayList。
有關更多資訊,請參見 .NET Framework 類庫中的泛型
首先第一句話,就清晰的告訴大家了,使用泛型就是這麼好,重用,型別安全,效率。那麼泛型為什麼就有這麼些好處了呢。
可重用性:
現在我們要返回兩個資訊,一種是字串型別的資訊,一種是數值型別的資訊。
不使用泛型的話我們可以這麼做,直接新增兩個方法,一個返回字串,另一個返回數值型別 。
public string getString(string stringMessage)
{
return stringMessage;
}
public int getIng(int intMessage)
{
return intMessage;
}
而使用泛型的話:只需要一個方法,很簡單T就是我們泛型 public T getWord<T>(T t)
{
return t;
}
當然了,有些人說了字串和數值可以相互轉換,一個方法也可以,拜託了,這只是個例子,平常使用的話,泛型多用於IList。而且強制轉換容易出執行時的問題。好的,問題來了,強制轉換,說到強制轉換,可以可以說下List,這就說到接下來的泛型的兩個優點:型別安全和高效率。
型別安全:
List裡面可以新增各種資料型別,它可以說是個異類集合。但是它容易資料型別轉換時的執行時錯誤,也就是說型別不安全。
這得說到List的實現方式了。在List中可以放各種各樣的資料型別,不論你push中的元素是什麼東東,統統的變為Object型別。而且值型別向Object轉換時,還得采取裝箱操作,拿出來還得拆箱操作,很容易出現InvalidCastException異常,這有說到了程式設計師的習慣,對於獲取的資料,判null的操作是很必要的。
引用型別向Object的轉換應該不用什麼消耗資源的操作。畢竟所有的物件都繼承Object型別嘛。這一點小編還不太瞭解呢。這點還望大家都多多指點。
但是如果list中的物件不是某個子類物件的例項,那麼強制型別轉換就會出現錯誤,型別安全就會出現問題了。看下面的一段程式碼,某個程式設計師一不小心寫成了Message類的強制轉換。這就出問題了呀
class Program
{
static void Main(string[] args)
{
System.Collections.ArrayList list = new System.Collections.ArrayList();
PersonModel person = new PersonModel();
person.Age = 23;
person.Name ="張三";
list.Add(person);
PersonModel pserson2 = new PersonModel();
if(list[0].GetType() == typeof(PersonModel)){
//某個程式設計師,一不小心寫成了Message類的強制轉換
Message message = (Message)list[0];
}
Console.WriteLine(pserson2);
Console.Read();
}
}
class PersonModel
{
string name;
public string Name
{
get { return name; }
set { name = value; }
}
int age;
public int Age
{
get { return age; }
set { age = value; }
}
public override string ToString()
{
return this.name + "," + this.age;
}
}
class MessageModel
{
}
而泛型呢,泛型解決了型別轉換的根本問題,第一它用不著型別的強制轉換。第二泛型集合一旦聲明瞭是何種資料型別的集合,就不再允許其他型別加進去List。最後一旦出現型別轉換的錯誤時,無需執行,編譯就通不過。
看下面的使用泛型強制PersonModel的泛型集合,在編譯時就提示錯誤
List<PersonModel> personList = new List<PersonModel>();
personList.Add(person);
Message message2 =(Message)personList[0]; //提示錯誤,型別轉換通不過
高效率
最後還有效率的問題。很簡單,泛型集合一旦聲明瞭是何種資料型別的集合,就只能新增何種資料型別。新增去也不會轉換成Object,它是執行時動態的獲取型別引數。也就是說沒有裝箱和拆箱這些操作。減少了處理器的資源浪費。
總結:泛型是一種思想,也是一種技術,動態的獲取引數型別,讓程式設計更加的靈活。那麼問題來了,怎麼實現動態的獲取引數型別呢?毫無疑問,使用反射。