C#中的“”语法是什么

我一直在学习C#的基础知识,但没有得到一个很好的解释:

var l = new List(); 

我不知道正在做什么,或者它是正在做魔术的List 。 我也看到对象被抛出在标签内。

有人可以用例子向我解释这个吗?

这是C#的通用语法。

基本概念是它允许您使用Type占位符并在编译时替换实际的实际类型。

例如,旧的方式:

 ArrayList foos = new Arraylist(); foos.Add("Test"); 

通过使ArrayList存储System.Objects列表(所有.NET的基本类型)。

因此,当从列表中添加或检索对象时,CLR必须将其强制转换为对象,基本上真正发生的是:

 foos.Add("Test" as System.Object); string s = foos[1] as String. 

这会导致演员表现受到性能损失,而且它也不安全,因为我可以这样做:

 ArrayList listOfStrings = new ArrayList(); listOfStrings.Add(1); listOfStrings.Add("Test"); 

这将编译得很好,即使我在listOfStrings中放入一个整数。

generics改变了所有这一切,现在使用Generics我可以声明我的集合所期望的类型:

 List listOfIntegers = new List(); List listOfStrings = new List(); listOfIntegers.add(1); // Compile time error. listOfIntegers.add("test"); 

这提供了编译时类型的安全性,并避免了昂贵的铸造操作。

尽管存在一些高级边缘情况,但您利用它的方式非常简单。 基本概念是通过使用类型占位符使您的类类型不可知,例如,如果我想创建一个通用的“添加两件事”类。

 public class Adder { public T AddTwoThings(T t1, T t2) { return t1 + t2; } } Adder stringAdder = new Adder(); Console.Writeline(stringAdder.AddTwoThings("Test,"123")); Adder intAdder = new Adder(); Console.Writeline(intAdder.AddTwoThings(2,2)); 

有关generics的更详细解释,我不能通过C#推荐CLR一书。

这是generics – 它是一种类型参数化的forms。 在你的例子中,它正在引用一个字符串列表 – 列表只会包含字符串:编译器会对它进行处理(相当多),就好像API文档中提到的“T”实际上都是“字符串”。 因此,您只能向其添加字符串,如果使用索引器,则无需转换为字符串等。

说实话,在网上论坛上给出generics详细的报道几乎是不可能的。 (在深度的C#中,我将近50页讨论generics。)但是,如果使用该function的名称,您应该处于更好的位置以了解更多信息。 MSDN “C#Generics简介”可能是一个很好的起点。

在SO上询问有关generics的具体问题可能会产生良好的结果 – 我只是不认为它可以在一个问题/答案中真正涵盖。

这是.NET Generics。 <>中的类型表示列表中包含的元素的类型。

使用ArrayList你必须在里面投射元素……

 int x = (int)myArrayList[4]; 

使用List,您可以避免该步骤,因为编译器已经知道该类型。

 int x = myList[4]; 

.NET 2.0及更高版本中提供了generics。

这些都是generics。 您正在创建一个仅包含字符串的List。 你也可以说

 List 

并获得一个只包含int的列表。

generics是一个很大的话题,对于这里的单个答案来说太大了。

那些被称为generics(特别是List是generics类)。

从MSDN读取

  • generics(C#编程指南)
  • C#generics简介
  • .NET Framework中的generics

这是仿制药的行动。 常规List存储Object类型的项。 这需要在类型之间进行转换 这也允许您将任何类型的项目存储在列表的一个实例中。 当您遍历该列表中的项目时,您无法确定它们是否都属于某种类型(至少在没有强制转换每个项目的情况下)。 例如,假设你创建一个这样的列表:

 List listOfStrings = new List(); 

什么都不能阻止某人做这样的事情:

 listOfStrings.add(6); //Not a string 

通用列表允许您指定强类型列表。

 List listOfStrings = new List(); listOfStrings.add("my name"); //OK listofStrings.add(6); //Throws a compiler error 

这里有一个更全面的例子Generics

<>用于泛型。 在您的具体示例中,这意味着List是一个字符串列表,而不是一个int列表。

generics用于允许类型通用。 它在集合中使用了ALOT来允许它们采用不同的类型,这样它们就可以像普通数组一样运行,并且仍然捕获在编译时分配的无效类型。 基本上它允许一个类说“我需要与某个特定类型T相关联,但我不想硬编码该类型的确切内容,并让用户选择它。”。 例如,一个简单的数组可能看起来像:

 public class MyArray { private T[] _list; public MyArray() : this.MyArray(10); public MyArray(int capacity) { _list = new T[capacity]; } T this[int index] { get { return _list[index]; } set { _list[index] = value; } } } 

在这里,我们有一个类型为T的私有列表,可以像普通数组一样使用我们的类访问。 我们不关心它是什么类型,它与我们的代码无关。 但是任何使用该类的人都可以使用它,比如说MyArray来创建一个字符串列表,而其他人可能会将它用作MyArray并创建一个标志列表。