DUPLICATE:
What is cool about generics, why use them?
我的基本问题与标题相同。但我想知道更多可以通过C#泛型世界启发我的东西。
谢谢! Aakash
答案 0 :(得分:4)
使用泛型列表而不是ArrayList的一个原因是ArrayList接受任何类型的对象,如果您只想存储给定类型的对象,这可能会导致运行时错误泛型。
示例:
var numbers=new ArrayList();
numbers.Add(1);
numbers.Add("abcd"); //This will compile!
int theNumber=(int)numbers[1]; //This will cause an exception
使用通用列表时,确保列表中只存储了所需的类型:
var numbers=new List<int>();
numbers.Add(1);
numbers.Add("abcd"); //This will NOT compile
答案 1 :(得分:0)
一个简单的解释。
当你有一个整数列表时,你只想确保程序的某些部分在其中添加一个字符串。使用泛型,您告诉编译器您决定在列表中只有整数(或任何类型),这样可以确保您不违反自己的法则。
您可以说,在代码中表达您的意图是另一种语言(和运行时)功能。这允许工具为您提供支持。
答案 2 :(得分:0)
除了Konamiman和Stefan的答案之外,在处理价值类型时使用通用集合也可以避免装箱/拆箱的成本。
每次向非泛型集合添加值类型时,都需要将其装箱,然后在从集合中删除它时需要将其取消装箱(假设您要执行任何类型特定的操作)用它)。
ArrayList myList = new ArrayList();
myList.Add(42); // box
myList.Add(DateTime.Now) // box
myList.Add(3.14) // box
int x = (int)myList[0]; // unbox
DateTime y = (DateTime)myList[1]; // unbox
double z = (double)myList[2]; // unbox
答案 3 :(得分:0)
正如之前的海报所说,使用通用集合有一个编译时安全方面;他们可以在编译时捕获一些愚蠢的错误(这比运行时更好)。
然而,还有一些其他理由更喜欢它们:
List<int>
商店的等价方法的代码要慢一些。例如:
object x = "5";
var intlist = new List<int>();
intlist.Add((int)x); //fails early; compiler requires this cast
//...perhaps much later...
foreach(int num in intlist)...
var arraylist = new ArrayList();
arraylist.Add(x); //this is OK though a cast would be advisable
//...perhaps much later...
foreach(int num in arraylist) ... //fails late
由于检测到故障的点从原始编码错误中进一步消除,因此延迟故障比早期故障更难调试。