C # универсальная функция вопрос - PullRequest
6 голосов
/ 26 августа 2010

Как понять следующий код? Что означает «это» в прототипе обобщенной функции? Спасибо!

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

Ответы [ 6 ]

16 голосов
/ 26 августа 2010

this в данном контексте означает, что это метод расширения, поэтому вы можете использовать его «обычным» способом:

MyExtensions.MySingle(someSource)

или таким (иногда более приятным) способом:

someSource.MySingle()

Это возможно только в том случае, если метод static и относится к классу static.Кроме того, это не имеет ничего общего с общим аспектом метода - вы можете создавать методы расширения без общих аспектов, и у вас все еще есть this перед параметром.

Методы расширения, как следует из названия, используется для расширения уже существующих классов методами, если у вас нет доступа к источнику или если вы хотите, чтобы он использовался в широком наборе классов.Важно отметить, что вы не получаете доступ к закрытым и защищенным методам и т. Д., Например, когда вы наследуете класс, когда вы создаете метод расширения для типа.

Кроме того, для объекта inподробное объяснение:

Методы расширения (Руководство по программированию в C #)

7 голосов
/ 26 августа 2010

То, что это метод расширения , который становится допустимым методом для всех объектов типа T.

Это не имеет ничего общего с генериками.

2 голосов
/ 26 августа 2010

MySingle<T> определяется как метод расширения (MSDN) .

Это означает, что при использовании вы можете назвать это так:

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

Это идентично тому, чтобы называть это «стандартным» способом:

MyExtensions.MySingle("a string");

Когда вы вызываете его первым способом (как метод расширения), элемент, для которого он вызывается, передается в качестве первого параметра. Поэтому тип первого параметра определяет тип, для которого может быть вызван метод расширения, но, поскольку у вас есть открытый универсальный тип, он может вызываться для любого объекта.

Чтобы определить метод расширения, содержащий класс и сам метод должны быть объявлены static.

Методы расширения были добавлены в C # 3.0 и VB 9.0.

1 голос
/ 26 августа 2010

Да, это метод расширения, но, насколько я понимаю, он также спрашивает, что означает использование T (определение универсального типа) с ключевым словом "this" в сигнатуре метода.

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

1 голос
/ 26 августа 2010

Это метод расширения, this - это экземпляр, к которому применяется метод.

0 голосов
/ 26 августа 2010

Это указывает на то, что это метод расширения.Расширяемый тип - «Т».Все экземпляры 'T' будут иметь метод MySingle.

...