Використання ключового слова "це" у формальних параметрах для статичних методів у C #


286

Я натрапив на кілька примірників коду C #, наприклад:

public static int Foo(this MyClass arg)

Я не зміг знайти пояснення того, що thisозначає ключове слово в даному випадку. Будь-які уявлення?


10
Окрім прийнятої відповіді, для методів розширення C # необхідно перевірити офіційну документацію MSDN .
вулкан ворон

4
Методи розширення зручні, але ми повинні бути обережними при їх створенні / використанні - вони можуть зламатися! Цитата із Загальних вказівок в офіційній документації MSDN : "Загалом, ми рекомендуємо застосовувати методи розширення скупо і лише тоді, коли вам доведеться. ... Використовуючи метод розширення для розширення типу, вихідний код якого ви не можете змінити, ви ризикуйте, що зміна в реалізації типу призведе до порушення вашого методу розширення. "
Кришна Гупта

Чи означає це, що це було б можливо? Тому що це я шукаю.
facepalm42

Відповіді:


274

Це метод розширення . Дивіться тут для пояснення .

Методи розширення дозволяють розробникам додавати нові методи до публічного контракту існуючого типу CLR, не потребуючи підкласу або перекомпіляції вихідного типу. Методи розширення допомагають поєднати гнучкість підтримки «набору качок», що є популярною сьогодні в динамічних мовах, та перевірку продуктивності та часу компіляції сильно набраних мов.

Методи розширення дають можливість використовувати різноманітні корисні сценарії та допомагають зробити реально потужну структуру запитів LINQ ....

це означає, що ви можете зателефонувати

MyClass myClass = new MyClass();
int i = myClass.Foo();

а не

MyClass myClass = new MyClass();
int i = Foo(myClass);

Це дозволяє будувати плавні інтерфейси, як зазначено нижче.


підкласифікація важка
Геррі

@Gerry - що ти маєш на увазі?
Преет Сангха

9
Вибачте, трохи сарказму - багато синтаксису в наші дні, здається, вирішують проблеми, які я навіть не знав, що це проблеми. Читання має бути дуже важливим пріоритетом.
Геррі

2
Якщо чесно @Gerry, це виглядає так, ніби ти перебуваєш у класичному Blub Paradox . Багато синтаксису в цей час вирішує проблеми, яких у вас немає, тому що ви не знали, що існує кращий спосіб, або ви не виконуєте таку задачу, для якої цей синтаксис приголомшливий. Більшість коментарів про те, що " це рішення в пошуках проблеми " насправді є прикладом " я не знаю, як працює ця функція, тому вона повинна бути марною ".
Мірддін Емріс

53

Процитоване повідомлення про блог Скотта Гу пояснює це чудово.

Для мене відповідь на питання є в наступному твердженні на цій посаді:

Зауважте, як статичний метод вище містить ключове слово "це" перед першим аргументом параметра рядка типу. Це повідомляє компілятору, що цей конкретний метод розширення слід додати до об'єктів типу "string". В рамках реалізації методу IsValidEmailAddress () я можу отримати доступ до всіх публічних властивостей / методів / подій фактичного рядкового екземпляра, про який викликається метод, і повернути true / false залежно від того, чи це дійсна електронна адреса чи ні.


9
Це має бути прийнятою відповіддю. Це єдина відповідь, яка насправді пояснює, яка фактична мета thisключового слова в підписі методу. Інші відповіді лише безпомилково кажуть "це метод розширення". Я ніколи не розумів, як методи розширення «прив’язуються» до типів, які вони розповсюджують, до прочитання цієї відповіді. Дякую!
Lews Therin

13

На додаток до пояснення Преет Сангха:
Intellisense відображає методи розширення синьою стрілкою (наприклад, перед "Зберегти <>"):

введіть тут опис зображення

Вам потрібна

using the.namespace.of.the.static.class.with.the.extension.methods;

щоб способи розширення відображалися та були доступними, якщо вони знаходяться в іншому просторі імен, ніж код, що використовує їх.



4

Я щойно дізнався про це днями: це ключове слово визначає, що метод є розширенням класу, який його обробляє. Отже, для вашого прикладу, MyClass матиме новий метод розширення під назвою Foo (який не приймає жодного параметра і повертає int; його можна використовувати, як і будь-який інший публічний метод).


1

"це" розширює наступний клас у списку параметрів

Отже, у підписі методу нижче "цей" поширюється на "Рядок". Рядок передається функції як нормальний аргумент методу. public static string [] SplitCsvLine (цей рядок String)

У наведеному вище прикладі "цей" клас розширює вбудований клас "String".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.