2010-08-25 4 views
6

Как понять следующий код? Что означает «это» в прототипе родовой функции? Благодаря!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

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» в сигнатуре метода.

Это означает, что метод расширения будет действительным методом для всех объектов каждого класса и типов структуры в вашем проекте.

Смежные вопросы