"this" C# 方法签名中指的是什么,是否有 VB.NET 等效项?



我一直在再次观看 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> liststring 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 店面视频,上面的 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

这是一个扩展方法。this指定它是this <parameter>类型的扩展方法,在您的情况下为 IList<Category> .

这里有一个 VB.NET 等价物,尽管它是一个属性,而不是一个关键字。

扩展方法需要知道要应用到的类型,请注意,这在泛型中很明显。扩展方法:

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

除了List<Category>之外,任何其他内容都不可用。

出现在

那个地方表示扩展方法。

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

换句话说,这是一种扩展您无权访问或不允许更改或派生的类型的功能的方法。

这将创建一个扩展方法。

VB.Net 没有相应的语法,因此您需要自己应用该属性。

最新更新