Что означает ключевое слово 'this' в параметре метода? - программирование
Подтвердить что ты не робот

Что означает ключевое слово 'this' в параметре метода?

namespace System.Web.Mvc.Html
{
    // Summary:
    //     Represents support for HTML in an application.
    public static class FormExtensions
    {
        public static MvcForm BeginForm(this HtmlHelper htmlHelper, string actionName, string controllerName);
...
    }
}

Я заметил, что объект 'this' перед первым параметром в методе BeginForm, похоже, не принимается в качестве параметра. Похоже, в реальных методах BeginForm функции:

BeginForm(string actionName, string controllerName);

опуская первый параметр. Но он фактически получает этот первый параметр как-то скрытым образом. Не могли бы вы объяснить мне, как работает эта структура. Я действительно изучаю интернет-образец MVC 4. Спасибо.

4b9b3361

Ответ 1

Вот как работают методы расширения на С#. Функция Extension Methods позволяет расширять существующие типы с помощью настраиваемых методов. Ключевое слово this [TypeName] в контексте параметров метода - это type, которое вы хотите расширить с помощью ваших собственных методов, this используется как префикс, в вашем случае HtmlHelper - это type для расширения и BeginForm - это метод, который должен расширять его.

Взгляните на этот простой метод расширения для типа string:

public static bool BiggerThan(this string theString, int minChars)
{
  return (theString.Length > minChars);
}

Вы можете легко использовать его на объекте string:

var isBigger = "my string is bigger than 20 chars?".BiggerThan(20);

Литература:

Ответ 2

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

A "bolt on" способ расширения существующего типа. Они позволяют расширить существующий тип с помощью новых функций без необходимости подкласса или перекомпилировать старый тип. Например, вам может потребоваться узнать, была ли определенная строка номером или нет. Или вы можете иметь функцию Show() Hide() в ASP.net WebForms для элементов управления.

Пример:

public static class MyExtensionMethods
{
    public static void Show(this Control subject)
    {
        subject.Visible = true;
    }
    public static bool IsNumeric(this string s)
    {
        float output;
        return float.TryParse(s, out output);
    }
}

Edit: Для получения дополнительной информации вы можете увидеть документацию MSDN по адресу: http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx, который был любезно связан с @aush.

Мне нравилось читать "С# In Depth" относительно методов расширения. Здесь есть выдержка: http://my.safaribooksonline.com/book/programming/csharp/9781935182474/extension-methods/ch10lev1sec3

Конечно, вы можете купить книгу онлайн, или вы можете просто провести некоторое исследование того, как все это работает под капотом, используя Google.