Метод расширения - нужно использовать это ключевое слово? - PullRequest
1 голос
/ 07 апреля 2011

Я добавил метод расширения в ASP.NET System.Web.UI.Page. Каждая страница в моем приложении наследуется от этого класса.

Однако я не могу просто получить доступ к методу расширения. Я должен набрать this.MyMethod(); вместо того, чтобы просто использовать MyMethod(). Я думал, что методы / атрибуты this изначально были в области видимости по умолчанию. Что я не понимаю? Или это нюанс методов расширения?

Ответы [ 3 ]

5 голосов
/ 07 апреля 2011

Я думал, что методы / атрибуты этого были по сути в области по умолчанию.

Они есть.Но методы расширения не методы this в области по умолчанию;они являются статическими методами, доступными через синтаксический сахар, предоставленный компилятором в качестве любезности.

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

this.ExtensionMethod();

... - это то же самое, что:

SomeStaticClass.ExtensionMethod(this);

this необходимо передать как параметр to ExtensionMethod.Первый способ, описанный выше, компилятор просто делает это за вас.

Естественно, они могли бы реализовать вещи иначе, так что компилятор "вводит" методы расширения, а также члены класса в область видимости по умолчанию;они просто решили не делать этого.Лично мне это нравится;но я думаю, это субъективный вопрос.В любом случае, если вам не нравится вводить this, это всего лишь небольшое раздражение, верно?

2 голосов
/ 07 апреля 2011

это нюанс методов расширения?

Да, это так. (Как объяснили другие.)

Если вы хотите использовать метод без какой-либо квалификации, то вы можете просто создать класс, который наследуется от Page и включает ваш метод (конечно, за исключением первого параметра). Затем сделайте так, чтобы каждая страница в вашем приложении наследовала вашу новую пользовательскую страницу.

0 голосов
/ 07 апреля 2011

Чтобы использовать метод расширения, вы должны объявить:

using Namespace.Where.Extension.Method.Is.Located

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

...