11

我一直在再次观看ASP.NET MVC Storefront视频系列,并看到了一些我以前从未注意到或关注过的东西。我注意到在各种方法的签名列表中有很多引用。这是一个例子:this

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> listand the 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. this在 C# 方法签名中实际引用和/或做什么?
  2. 是否有 VB.NET 等价物?



对问题 1 的回应:

所以我们已经明确地澄清了this 它实际上表示一个扩展方法,并且从给出的答案来看,似乎没有内联 VB 等价物。

我想补充一点,因为我提到了ASP.NET MVC Storefront视频,所以上面的 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

this 出现在那个地方意味着一个Extension Method

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 回答