C#中的"<>"语法是什么

Óla*_*age 6 .net c#

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

var l = new List<string>();
Run Code Online (Sandbox Code Playgroud)

我不知道<string>它在做什么,或者它List是否正在做魔术.我也看到过< >标签中抛出的对象.

有人可以用例子向我解释一下吗?

Fly*_*wat 24

这是C#的通用语法.

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

例如,旧的方式:

ArrayList foos = new Arraylist();
foos.Add("Test");
Run Code Online (Sandbox Code Playgroud)

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

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

foos.Add("Test" as System.Object);
string s = foos[1] as String.
Run Code Online (Sandbox Code Playgroud)

这会导致演员的性能下降,而且它也不安全,因为我可以这样做:

ArrayList listOfStrings = new ArrayList();
listOfStrings.Add(1);
listOfStrings.Add("Test");
Run Code Online (Sandbox Code Playgroud)

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

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

List<int> listOfIntegers = new List<int>();
List<String> listOfStrings = new List<String>();

listOfIntegers.add(1);

// Compile time error.
listOfIntegers.add("test");
Run Code Online (Sandbox Code Playgroud)

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

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

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));
Run Code Online (Sandbox Code Playgroud)

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

  • AddTwoThings示例已在SO上多次覆盖,并且无效. (2认同)

Jon*_*eet 5

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

说实话,在网上论坛上提供泛型详细报道几乎是不可能的.(在深度的C#中,我花了近50页来讨论泛型.)然而,凭借该功能的名称,您应该处于更好的位置以了解更多信息.MSDN "C#Generics简介"可能是一个很好的起点.

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