Что означает ключевое слово '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.
Спасибо.
Ответы
Ответ 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.