Я натрапив на кілька примірників коду C #, наприклад:
public static int Foo(this MyClass arg)
Я не зміг знайти пояснення того, що this
означає ключове слово в даному випадку. Будь-які уявлення?
Я натрапив на кілька примірників коду C #, наприклад:
public static int Foo(this MyClass arg)
Я не зміг знайти пояснення того, що this
означає ключове слово в даному випадку. Будь-які уявлення?
Відповіді:
Це метод розширення . Дивіться тут для пояснення .
Методи розширення дозволяють розробникам додавати нові методи до публічного контракту існуючого типу CLR, не потребуючи підкласу або перекомпіляції вихідного типу. Методи розширення допомагають поєднати гнучкість підтримки «набору качок», що є популярною сьогодні в динамічних мовах, та перевірку продуктивності та часу компіляції сильно набраних мов.
Методи розширення дають можливість використовувати різноманітні корисні сценарії та допомагають зробити реально потужну структуру запитів LINQ ....
це означає, що ви можете зателефонувати
MyClass myClass = new MyClass();
int i = myClass.Foo();
а не
MyClass myClass = new MyClass();
int i = Foo(myClass);
Це дозволяє будувати плавні інтерфейси, як зазначено нижче.
Процитоване повідомлення про блог Скотта Гу пояснює це чудово.
Для мене відповідь на питання є в наступному твердженні на цій посаді:
Зауважте, як статичний метод вище містить ключове слово "це" перед першим аргументом параметра рядка типу. Це повідомляє компілятору, що цей конкретний метод розширення слід додати до об'єктів типу "string". В рамках реалізації методу IsValidEmailAddress () я можу отримати доступ до всіх публічних властивостей / методів / подій фактичного рядкового екземпляра, про який викликається метод, і повернути true / false залежно від того, чи це дійсна електронна адреса чи ні.
this
ключового слова в підписі методу. Інші відповіді лише безпомилково кажуть "це метод розширення". Я ніколи не розумів, як методи розширення «прив’язуються» до типів, які вони розповсюджують, до прочитання цієї відповіді. Дякую!
На додаток до пояснення Преет Сангха:
Intellisense відображає методи розширення синьою стрілкою (наприклад, перед "Зберегти <>"):
Вам потрібна
using the.namespace.of.the.static.class.with.the.extension.methods;
щоб способи розширення відображалися та були доступними, якщо вони знаходяться в іншому просторі імен, ніж код, що використовує їх.
Вони є методами розширення . Ласкаво просимо у цілий новий вільний світ . :)
Я щойно дізнався про це днями: це ключове слово визначає, що метод є розширенням класу, який його обробляє. Отже, для вашого прикладу, MyClass матиме новий метод розширення під назвою Foo (який не приймає жодного параметра і повертає int; його можна використовувати, як і будь-який інший публічний метод).
"це" розширює наступний клас у списку параметрів
Отже, у підписі методу нижче "цей" поширюється на "Рядок". Рядок передається функції як нормальний аргумент методу. public static string [] SplitCsvLine (цей рядок String)
У наведеному вище прикладі "цей" клас розширює вбудований клас "String".