Что означает «это», когда используется в качестве префикса для параметров метода? - PullRequest
6 голосов
/ 10 июня 2009

Я уверен, что ответ очевиден, и мне немного стыдно, что я на самом деле не знаю ответа, но рассмотрим следующий пример кода, который я взял, читая «Professional ASP.NET MVC 1.0». :

public static class ControllerHelpers
{
    public static void AddRuleViolations(this ModelStateDictionary modelState, IEnumerable<RuleViolation> errors)
    {
        foreach (RuleViolation issue in errors)
            modelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
    }
}

Я понимаю, что делает этот статический метод, но я не понимаю, для какой цели служит слово "this" в сигнатуре метода. Может ли кто-нибудь просветить меня?

Ответы [ 5 ]

17 голосов
/ 10 июня 2009

Это новая функция C # 3.0, которая называется метод расширения .

Это означает, что вы добавляете новый метод в ваши объекты ModelStateDictionary. Вы можете назвать это как обычный метод:

yourModelStateDictionary.AddRuleViolations( errors );

Смотрите, что первый параметр (параметр this) пропущен. Он назначает только ModelStateDictionary в качестве допустимой цели для вашего метода расширения.

Подсказка в том, что вы можете сделать это с любым классом - даже с закрытыми или сторонними классами, такими как классы .Net Framework (например, для объекта или строки).

1 голос
/ 10 июня 2009

Это сигнатура метода расширения. Это означает, что «AddRuleViolations» будет обрабатываться как метод расширения ModelStateDictionary.

Из MSDN.

Методы расширения позволяют вам «добавить» методы существующих типов без создание нового производного типа, перекомпиляция или иное изменение оригинальный тип. Методы расширения особый вид статического метода, но они называются так, как будто они были методы экземпляра для расширенного типа. Для клиентского кода, написанного на C # и Visual Basic, нет очевидного разница между вызовом метод расширения и методы, которые на самом деле определены в типе.

1 голос
/ 10 июня 2009

Это означает, что рассматриваемый метод является «методом расширения» и может вызываться так, как если бы он был методом самого класса. Смотрите эту статью .

0 голосов
/ 10 июня 2009

Добавляет метод расширения ко всем экземплярам ModelStateDictionary.

0 голосов
/ 10 июня 2009
...