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

时间:2020-03-06 14:57:01  来源:igfitidea点击:

我一直在学习C的基本知识,但是没有对它的解释很好:

var l = new List<string>();

我不知道&lt;string>在做什么,或者说是List在做魔术。我也看到过对象被扔到&lt;>标记中。

有人可以举例说明吗?

解决方案

这是.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>"并创建一个标志列表。