2010-04-04 2 views
14

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

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

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

+1

Я бы лично предпочел Атрибут. Что-то вроде [Extends (typeof (foo)], а затем имеет неявную переменную с именем value, аналогичную свойствам. Она была бы более выразительной и не требовала повторного использования существующего ключевого слова. Просто мое личное мнение. – John

+0

Скотт Гензельман имеет хорошую статья, которая объясняет важность ключевого слова «this». http://www.hanselman.com/blog/HowDoExtensionMethodsWorkAndWhyWasANewCLRNotRequired.aspx – Zaffiro

ответ

9

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

+1

И поэтому вам не нужно было пометить метод ExtensionAttribute, как в VB.Net. –

+2

C# имеет более вкусный синтаксический сахар, и именно поэтому мне это нравится. –

0

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

1

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

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

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

Необходимо, чтобы можно было отличить от этого:

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

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

1

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

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

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

6

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

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

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

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

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