Вопрос об универсальной функции C #

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);
    }
}
6
задан Jonathan Sterling 25 August 2010 в 20:52
поделиться

6 ответов

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

Он не имеет ничего общего с дженериками.

7
ответ дан 8 December 2019 в 03:51
поделиться

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

0
ответ дан 8 December 2019 в 03:51
поделиться

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

MyExtensions.MySingle(someSource)

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

someSource.MySingle()

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

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

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

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

16
ответ дан 8 December 2019 в 03:51
поделиться

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

1
ответ дан 8 December 2019 в 03:51
поделиться

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

Это означает, что при использовании вы можете вызывать его следующим образом:

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

Это идентично вызову его "стандартным" способом:

MyExtensions.MySingle("a string");

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

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

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

2
ответ дан 8 December 2019 в 03:51
поделиться

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

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

1
ответ дан 8 December 2019 в 03:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: