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> 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
Run Code Online (Sandbox Code Playgroud)
首先,我不完全确定为什么<System.Runtime.CompilerServices.Extension>被包括在内,也许只是转换器,然而,正如你所看到的,this除非与上述内容有关,否则我没有转换成任何东西<System.Runtime.CompilerServices.Extension>.
所以问题是:
this在C#方法签名中实际引用和/或做什么?所以我们已经明确说明this 事实上它确实表示一种扩展方法,而且根据给出的答案,它似乎没有内联VB等价物.
我想补充一点,因为我提到了ASP.NET MVC店面视频,上面的C#示例是从他的CategoryFilters课程中提取的.我假设这是你如何实现被称为管道和过滤器或管道方法的内容.
我假设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>.
出现在那个地方的 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)
换句话说,这是一种扩展您无权访问或不允许更改或派生的类型的功能的方法。