11

ASP.NET MVCストアフロントのビデオシリーズをもう一度見ていて、今まで気づかなかったり、注意を払ったりしたことがないものを見ました。thisさまざまなメソッドのシグネチャリストに多くの参照があることに気づきました。1つの例を次に示します。

public static Category WithCategoryName(this IList<Category> list, string categoryName)   
{
    return 
    (
        from s in list
        where s.Name.Equals(categoryName, StringComparison.InvariantCultureIgnoreCase)
        select s
    )
    .SingleOrDefault();
}

私はすぐに署名のIList<Category> listとを理解しstring categoryNameましたが、何をするのか混乱してthisいました。

それで、95%VBの人である私は、コードをお気に入りのコンバーターにポップして、次のようにしました。

<System.Runtime.CompilerServices.Extension>
Public Shared Function WithCategoryName(list As IList(Of Category), categoryName As String) As Category

    Return 
    (
        From s In list 
        Where s.Name.Equals(categoryName, StringComparison.InvariantCultureIgnoreCase)
        Select s
    )
    .SingleOrDefault()

End Function

まず第一に、なぜ<System.Runtime.CompilerServices.Extension>含まれているのか完全にはわかりませんが、おそらくそれは単なるコンバーターですが、ご覧のとおりthis、前述のと関係がない限り、私が知ることができるものには変換されませんでした<System.Runtime.CompilerServices.Extension>

したがって、質問は次のとおりです。

  1. thisC#メソッドシグネチャで実際に何を参照および/または実行しますか?
  2. VB.NETに相当するものはありますか?



質問1への回答:

this したがって、実際には拡張メソッドを示していること、および与えられた回答から、インラインVBに相当するものはないように思われることを明確にしました。

ASP.NET MVCストアフロントのビデオについて触れたので、上記のC#の例は彼のCategoryFiltersクラスから抜粋したものです。これが、パイプとフィルターまたはパイプライン方法論として参照されたものを実装する方法であると思います。



質問2への回答:

VB.NETの拡張メソッドの処理方法は次のようなものだと思います。

Imports System.Runtime.CompilerServices 

Public Module StringExtensions 

    <Extension()> _ 
    Public Function IsNullOrBlank(ByVal s As String) As Boolean 
       Return s Is Nothing OrElse s.Trim.Length.Equals(0) 
    End Function 

End Module
4

3 に答える 3

11

それが拡張メソッドです。thisは、それがタイプの拡張メソッドであることを指定します。このthis <parameter>場合、IList<Category>

ここにはVB.NETに相当するものがありますが、これは属性であり、キーワードではありません。

拡張メソッドは、適用するタイプを知る必要があります。これはジェネリックスで明らかであることに注意してください。拡張メソッド:

public static string GetNameOf(this List<Category> category) { return ""; }

以外では利用できませんList<Category>

于 2012-04-19T15:27:53.313 に答える
7

その場所に表示されるこれは、拡張メソッドを意味します。

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static int WordCount(this String str)
        {
            return str.Split(new char[] { ' ', '.', '?' }, 
                             StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }   
}

このコードの後、プログラム内の任意の文字列オブジェクトがこの関数を使用できます。

int count = "Hello world".WordCount();  //count would be equal 2

言い換えると、これは、アクセス権がない、または変更や派生が許可されていないタイプの機能を拡張する方法です。

于 2012-04-19T15:30:32.020 に答える
6

これにより、拡張メソッドが作成されます。

VB.Netにはこれに対応する構文がないため、属性を自分で適用する必要があります。

于 2012-04-19T15:27:23.933 に答える