web-dev-qa-db-ja.com

メソッドパラメータで「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);
...
    }
}

BeginFormメソッドの最初のパラメーターの前にある「this」オブジェクトがパラメーターとして受け入れられていないように見えることに気づきました。実際のBeginFormメソッドは次のように機能します。

BeginForm(string actionName, string controllerName);

最初のパラメーターを省略します。しかし、実際には、その最初のパラメーターを何らかの形で隠された方法で受け取ります。この構造がどのように機能するかを説明してください。私は実際にMVC4インターネットサンプルを探索しています。ありがとうございました。

19
InGeek

これは、拡張メソッドがC#でどのように機能するかです。拡張メソッド機能を使用すると、既存の型をカスタムメソッドで拡張できます。メソッドのパラメーターのコンテキストでの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);

参照:

30
Yair Nevet

拡張方法:

既存のタイプを拡張するための「ボルトオン」方法。これらを使用すると、古い型をサブクラス化または再コンパイルすることなく、既存の型を新しい機能で拡張できます。たとえば、特定の文字列が数字であるかどうかを知りたい場合があります。または、コントロール用のASP.net WebFormsにShow()Hide()機能が必要な場合もあります。

例えば:

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);
    }
}

編集:詳細については、MSDNのドキュメントを参照してください: http://msdn.Microsoft.com/en-us/library /vstudio/bb383977.aspx これは@aushによって親切にリンクされました。

拡張メソッドに関する「C#InDepth」を読んで楽しんだ。ここに利用可能な抜粋があります: http://my.safaribooksonline.com/book/programming/csharp/9781935182474/extension-methods/ch10lev1sec

もちろん、この本をオンラインで購入することも、Googleを使用してすべてが内部でどのように機能するかを調査することもできます。

3
Jeremy