2010-08-25 79 views
6

如何理解下面的代码?泛型函数原型中的“this”意味着什么?谢谢!C#通用函数问题

public static class MyExtensions 
{ 
    public static MyStream<T> MySingle<T>(this T source) 
    { 
     return new MyStream<T>(source); 
    } 
} 

回答

7

它是一种extension method,变成T类型

它无关,与仿制药的所有对象的有效方法。

+3

有关'this'关键字与泛型无关的好处。 – Oded 2010-08-25 20:52:47

16

this在此上下文中意味着它是一个扩展方法,从而既可以使用它的 “正常” 方式:

MyExtensions.MySingle(someSource)

或该(有时更好)的方法:

someSource.MySingle()

这只有在方法为static且处于static类中时才可能。此外,它与该方法的通用方面无关 - 您可以在没有泛型方面进行扩展的方法,并且您仍然在参数前面有this

如名称所示,扩展方法用于在方法中扩展已存在的类,前提是您无法访问源代码或者希望通过广泛的类来使用扩展方法。重要的是要注意,你不能访问私有和受保护的方法等,就像你从类中派生出来的那样,当你在一个类型上进行扩展的时候。

另外,对于进行了深入的解释:

Extension Methods (C# Programming Guide)

1

这是一个扩展方法,this是实例,该方法被应用到。

0

这表明它是一种扩展方法。被扩展的类型是'T'。 'T'的所有实例都有方法MySingle。

2

MySingle<T>定义为extension method (MSDN)

这意味着在使用,你可以这样调用:

MyStream<string> stringStream = "a string".MySingle(); 

这是相同的称其为“标准”的方式:

MyExtensions.MySingle("a string"); 

当你调用它的第一种方式(作为扩展方法),其被调用的项目作为第一个参数传递。因此,第一个参数的类型定义了可以调用扩展方法的类型,但由于您有一个开放的泛型类型,因此可以在任何对象上调用它。

要定义扩展方法,必须声明包含类和方法本身static

C#3.0和VB 9.0中增加了扩展方法。

1

是的,这是一个扩展方法,但据我了解他也问在方法签名中使用T(泛型类型定义)和“this”关键字是什么意思。

这意味着扩展方法对于项目中每个类和结构类型的所有对象都是有效的方法。