C#中的" <>"语法是什么
我一直在学习C的基本知识,但是没有对它的解释很好:
var l = new List<string>();
我不知道<string>
在做什么,或者说是List
在做魔术。我也看到过对象被扔到<>
标记中。
有人可以举例说明吗?
解决方案
这是.NET泛型。 <>中的类型表示列表中包含的元素的类型。
使用ArrayList,我们必须将元素强制转换为内部...
int x = (int)myArrayList[4];
使用List可以避免该步骤,因为编译器已经知道类型了。
int x = myList[4];
.NET 2.0和更高版本中提供了泛型。
这些是泛型。我们正在制作仅包含字符串的列表。你也可以说
List<int>
并获得仅包含整数的列表。
泛型是一个巨大的话题,对于此处的单个答案来说太大了。
这些被称为泛型(特别是List是泛型类)。
从MSDN读取
- 泛型(C#编程指南)
- C#泛型简介
- .NET Framework中的泛型
它是泛型,是类型参数化的一种形式。在示例中,它使l指向一个字符串列表,该列表将仅包含字符串:编译器(相当多地)将其视为API文档提到" T"的任何地方,实际上却说" string"。因此,我们只能向其中添加字符串,并且如果使用索引器,则无需强制转换为字符串等。
老实说,在网上论坛上提供仿制药的详细报道几乎是不可能的。 (在Cin Depth中,我花了近50页谈论泛型。)但是,有了功能的名称,我们应该可以找到更多的位置。 MSDN" CGenerics简介"可能是一个很好的起点。
在SO上询问有关泛型的特定问题可能会产生良好的效果,我只是认为在一个问题/答案中并不能真正解决这个问题。
这是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中,这也可以正常编译。
泛型改变了这一切,现在可以使用泛型声明我的集合期望的Type:
List<int> listOfIntegers = new List<int>(); List<String> listOfStrings = new List<String>(); listOfIntegers.add(1); // Compile time error. listOfIntegers.add("test");
这提供了编译时类型的安全性,并避免了昂贵的转换操作。
我们可以利用这种方式非常简单,尽管有一些先进的优势案例。基本概念是使用类型占位符使类类型不可知,例如,如果我想创建一个通用的"添加两件事情"类。
public class Adder<T> { public T AddTwoThings(T t1, T t2) { return t1 + t2; } } Adder<String> stringAdder = new Adder<String>(); Console.Writeline(stringAdder.AddTwoThings("Test,"123")); Adder<int> intAdder = new Adder<int>(); Console.Writeline(intAdder.AddTwoThings(2,2));
对于泛型的更详细的解释,我不能推荐足够的本书通过C#编写CLR。
这是通用的。常规列表存储对象类型的项目。这需要在类型之间进行转换。这也将允许我们将任何种类的项目存储在列表的一个实例中。当我们遍历该列表中的项目时,我们无法确定它们是否都是某种类型的(至少不是在不强制转换每个项目的情况下)。例如,假设我们创建了一个像这样的列表:
List listOfStrings = new List();
没有什么可以阻止某人做这样的事情:
listOfStrings.add(6); //Not a string
通用列表将允许我们指定强类型列表。
List<string> listOfStrings = new List<string>(); listOfStrings.add("my name"); //OK listofStrings.add(6); //Throws a compiler error
这里有一个更详尽的例子
<>用于泛型。在特定示例中,这意味着列表是字符串列表,而不是整数列表。
泛型用于允许类型成为泛型。它在Collections中使用ALOT来允许它们采用不同的类型,以便它们可以像正常数组一样工作,并且仍可以捕获在编译时分配的无效类型。基本上,它允许类说"我需要与某个特定的类型T关联,但是我不想确切地编码该类型是什么,然后让用户选择它"。例如,一个简单的数组可能看起来像:
public class MyArray<T> { 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 <string>"来创建字符串列表,而其他人则可以将其用作" MyArray <bool>"并创建一个标志列表。