0

我是 C# 的新手,来自 PHP。一切几乎都清楚了,除了我不知道构造 Interface/Collection <>的确切含义。

我已经将 <> 用于“类型定义”,但它究竟意味着什么。我这样使用它:

class TaskComparer : IEqualityComparer<Task> ...
class TaskQueue : ConcurrentQueue<Task> ...

等等你有没有看到任何关于这个的文章?请张贴链接。谢谢你。

4

5 回答 5

5

它被称为“泛型”,它是一种(如您所说)定义类型参数的方法。这是 MSDN 上的介绍性文章:http: //msdn.microsoft.com/en-us/library/ms172192.aspx

作为此实用程序的一个简单示例,请考虑存储库模式。

public interface IRepository<T> {
    public void Add (T obj);
    public IEnumerable<T> GetAll();
}

通过正确的实现,现在您可以拥有任何类型实体的存储库接口。

public void someMethod(IRepository<Person> personsRepo) 
{
    IEnumerable<Person> persons = personsRepo.GetAll();
    // ...
}
于 2012-06-12T06:02:21.133 回答
2

您很可能是指泛型

于 2012-06-12T06:02:24.910 回答
2

标识符 < 类型定义 >

标识符后面的块表示从泛型类型定义构造的类型。

这个这个定义是递归的:你可以从其他泛型类型构造泛型类型:就像你可以拥有数组的数组一样,你可以构造列表列表、字典列表等等。

此外,您可以使用类似的构造来构建泛型函数,除了您使用泛型函数的名称来代替类型或接口名称。

您可以构建自己的泛型类型和函数定义,并直接或通过反射访问它们。这个概念非常强大,因为它将强类型扩展到从其他类型构建的类型。

于 2012-06-12T06:02:44.940 回答
0

在集合的情况下,它定义了集合内的数据类型。这只是一种提高类型安全性的方法。一个小例子:

ArrayList<Integer> test = new ArrayList<Integer>();

test.Add(1); // will work
test.Add("2");  //will throw an exception, String cannot be cast to int
于 2012-06-12T06:05:09.840 回答
0

请阅读其他人提供的有关泛型的文章;不过,我在这里给你一个快速的介绍。

比如说,我们想编写一个 id 函数(准确地返回它的输入)。这应该适用于每种类型,对吧?所以,我们天真的方法是使用object

object id(object x) {
    return x
}

但是,这object每次都会返回 - 您必须在之后转换才能取回您的“具体”类型,如下所示int x = (int)id(12):泛型解决了这个问题。它们允许您对类型进行参数化以保持完全相同

T id2<T> (T x) {
    return x
}

查看类型签名,您可以看到此版本接受any T并返回相同 T(替换Tint,您会看到)。

我希望这能给你一个快速的概述。另外,请阅读有关约束的信息。

于 2012-06-12T06:12:38.830 回答