"this"在C#方法签名中引用了什么,是否有VB.NET等价物?

Cod*_*ick 8 c# vb.net signature c#-to-vb.net

我一直在看的ASP.NET MVC的店面视频系列再次和看到的东西,我从来没有注意到或祈祷,任何关注前.我注意到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();
}
Run Code Online (Sandbox Code Playgroud)

我立刻就明白了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
Run Code Online (Sandbox Code Playgroud)

首先,我不完全确定为什么<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
Run Code Online (Sandbox Code Playgroud)

Ada*_*rth 10

这是一种扩展方法.该this指定它是一个扩展方法this <parameter>类型,在你的情况,IList<Category>.

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

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

public static string GetNameOf(this List<Category> category) { return ""; }
Run Code Online (Sandbox Code Playgroud)

除了以外的任何其他内容都不会提供List<Category>.


Tig*_*ran 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;
        }
    }   
}
Run Code Online (Sandbox Code Playgroud)

在此代码之后,程序中的任何字符串对象都可以使用此函数,例如

int count = "Hello world".WordCount();  //count would be equal 2
Run Code Online (Sandbox Code Playgroud)

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


SLa*_*aks 6

这会创建一个扩展方法.

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