请考虑以下内容:
public static T GetValueOrDefault<T>(this IDataReader reader, string columnName)
T returnValue = default(T);
我希望实现类似这个的方法来检查DBNull。我可以理解代码,但是不太明白VB.NET中的静态T是什么意思。有人能解释一下吗?
请考虑以下内容:
public static T GetValueOrDefault<T>(this IDataReader reader, string columnName)
T returnValue = default(T);
我希望实现类似这个的方法来检查DBNull。我可以理解代码,但是不太明白VB.NET中的静态T是什么意思。有人能解释一下吗?
static
相当于Shared
。共享方法通常放在帮助类中,因为它们不需要类的实例来运行。Imports System.Runtime.CompilerServices
<Extension()> _
Public Shared Function GetValueOrDefault(Of T)(ByVal reader As IDataReader, ByVal columnName As String) As T
Dim returnValue As T = Nothing
End Function
他正在创建一个扩展方法。在C#中,这是通过创建一个静态方法(在Visual Basic中为Shared)来完成的。
在Visual Basic中创建扩展方法的机制似乎与在C#中的方式大不相同。您可能需要阅读有关扩展方法的MSDN条目,链接在此:http://msdn.microsoft.com/en-us/library/bb384936.aspx
以下是在VB中该方法的样子:
Imports System.Runtime.CompilerServices
<Extension()> _
Public Shared Function GetValueOrDefault(Of T)(ByVal reader As IDataReader, ByVal columnName As String) as T
Dim returnvalue As T = Nothing
End Function
我不确定如何在VB中执行 default(T),因此我将其省略了。
Shared
时,VS会给出此错误:无法将模块中的方法声明为“Shared”。(我在VS 2010中进行了测试和验证。)我冒昧地从这个答案中删除了Shared
。 - Shawn KovacC# 的 static 关键字与 VB 的 Shared 关键字相同。
static
关键字,并将第一个参数声明为this
。但这两者在VB.NET中是不同的。但两者都需要extension
属性。实际上,问题缺少这个扩展方法,但this
关键字提示我们它确实是一个C#扩展方法(没有提供所需的extension
属性)。 - Shawn Kovacstatic
概念和 VB 的 shared
概念是相同的,但由于在声明扩展方法时语法差异很大,因此关键字不同。 :P 哦,如果两者之间有更多的一致性,这样一个更好的设计将会减少很多混乱啊。但它们是不同的编程语言,事实上,两种不同的编程语言没有任何理由需要任何相似之处。但这将非常有帮助。 耸肩 - Shawn KovacPublic Function GetValueOrDefault(Of T)(ByVal reader as IDataReader, ByVal columnName as string) as T
这意味着当您调用该方法时,您需要提供一个类型参数(告诉方法调用中T的类型)
不确定如何在VB中创建扩展方法。(这就是您第一个参数上的“this”关键字所表示的内容。)
Module
中将“Shared”添加到方法会产生此错误:“无法声明模块中的方法为‘Shared’”。但当然,它们实际上是静态方法,因此C#要求将扩展方法声明为“static”。 - Shawn KovacShared
是无效的,并且现在我已经100%确定它在VS 2010中也是无效的,所以我冒昧编辑了这个答案,从函数声明中删除了Shared
。 - Shawn Kovac