How to understand the following code? What does "this" mean in the generic function prototype? Thanks!
public static class MyExtensions
{
public static MyStream<T> MySingle<T>(this T source)
{
return new MyStream<T>(source);
}
}
Что это метод расширения , который становится допустимым методом для всех объектов типа T.
Он не имеет ничего общего с дженериками.
Это указывает на то, что это метод расширения. Расширяемый тип — «T». Все экземпляры 'T' будут иметь метод MySingle.
this
в данном контексте означает, что это метод расширения, поэтому вы можете использовать его либо «обычным» способом:
MyExtensions.MySingle(someSource)
, либо таким (иногда более приятным) способом:
someSource.MySingle()
Это возможно, только если метод является статическим
и находится в классе статическом
. Кроме того, это не имеет ничего общего с общим аспектом метода - вы можете создавать методы расширения без общих аспектов, и у вас все еще есть this
перед параметром.
Методы расширения, как следует из названия, используются для расширения уже существующих классов с помощью методов, если у вас нет доступа к источнику или если вы хотите, чтобы он использовался в широком наборе классов. Важно отметить, что вы не получаете доступ к закрытым и защищенным методам и т. д., например, когда вы наследуете класс, когда вы создаете метод расширения для типа.
Кроме того, для подробного объяснения:
Это метод расширения, это
экземпляр, к которому применяется метод.
MySingle
определяется как метод расширения (MSDN).
Это означает, что при использовании вы можете вызывать его следующим образом:
MyStream<string> stringStream = "a string".MySingle();
Это идентично вызову его "стандартным" способом:
MyExtensions.MySingle("a string");
Когда вы вызываете его первым способом (как метод расширения), элемент для которого он вызывается, передается в качестве первого параметра. Таким образом, тип первого параметра определяет тип, для которого может быть вызван метод расширения, но, поскольку у вас есть открытый универсальный тип, его можно вызывать для любого объекта.
Чтобы определить метод расширения, содержащий его класс и сам метод должны быть объявлены статическими
.
Методы расширения были добавлены в C# 3.0 и VB 9.0.
Да, это метод расширения, но, насколько я понимаю, он также спрашивает, что означает использование T (определение универсального типа) с ключевым словом this в сигнатуре метода.
Это означает, что метод расширения будет действительным методом для всех объектов каждого класса и типа структуры в вашем проекте.