Почему мы используем "this" в методах расширения?

Я хочу спросить, почему мы используем ключевое слово "this" перед параметром в методе расширения (язык С#)............ как эта функция:

    public static int ToInt(this string number)
    {
        return Int32.Parse(number);
    }

Я знаю, что мы должны использовать его, но я не знаю почему.

Ответ 1

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

Ответ 2

Для информации значение this в качестве контекстного ключевого слова здесь в основном заключается в том, что он избегает введения нового ключевого слова. Всякий раз, когда вы вводите новое ключевое слово, вы рискуете сломать код, который использовал бы его как имя переменной/типа. this имеет несколько полезных функций:

  • он достаточно близко, чтобы указать, что это относится к методу экземпляра
  • это существующее ключевое слово...
  • ... это было бы незаконным при использовании в этом месте

Это означает, что код существующий не будет разбит.

Помимо выбора this в качестве ключевого слова, это просто удобный синтаксис для компилятора и более удобный, чем добавление [Extension] вручную. Без этого, это будет просто статический метод без какого-либо особого поведения.

Ответ 3

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

Это определение для метода:

public static int ToInt(string number) //non extension

Необходимо отличить от этого:

public static int ToInt(this string number) //extension

В противном случае у вас будет intellisense, содержащий все статические методы в статическом классе во включенных пространствах имен, очень нежелательно.

Ответ 4

В основном потому, что С# spec определяет метод расширения. См. раздел 10.6.9

10.6.9 Методы расширения

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

Ответ 5

Чтобы идентифицировать метод как метод расширения. Как еще мог компилятор узнать?

Ответ 6

Это просто синтаксис, выбранный для указания метода расширения. Здесь интересная точка зрения на различия синтаксиса метода расширения между С# и vb.net: Метод расширения Различия между С# и VB.NET