VB.NET:在 VB.NET 中,静态 T (C#) 是什么?

6

请考虑以下内容:

public static T GetValueOrDefault<T>(this IDataReader reader, string columnName)

 T returnValue = default(T);

我希望实现类似这个的方法来检查DBNull。我可以理解代码,但是不太明白VB.NET中的静态T是什么意思。有人能解释一下吗?

6个回答

12
在VB中,static相当于Shared。共享方法通常放在帮助类中,因为它们不需要类的实例来运行。
类型T表示这是一个泛型方法(这是VB 9和C# 3中的新功能)。泛型方法有效地将类型作为参数或返回泛型类型。
扩展方法也是VB 9/C# 3中的新功能。这允许您通过添加方法来扩展现有类型。您只需要一个可用于代码相同命名空间的共享方法,在VB中,代码必须在模块而不是普通类中。
模块是无法实例化的类(因此)仅具有共享方法。它使用Module关键字而不是class关键字声明。以下是VB中的代码。
(对于那些知道“底层”发生了什么的人,“将值类型设置为Nothing”奇怪地在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

非常接近,但您忘记展示扩展方法的语法。 - Joel Coehoorn
是的,感谢乔尔在代码片段中添加了被遗忘的属性。 - Christopher Edwards
2
此外,我认为Shared在这里无效,因为扩展方法必须在模块内部。 - ScottE
是的,@ScottE,你是正确的。尝试在Module中将“Shared”添加到方法会产生此错误:“无法声明模块中的方法为‘Shared’”。但当然,它们实际上是静态方法,因此C#要求将扩展方法声明为“static”。 - Shawn Kovac
自从我在VB.NET中测试了Shared是无效的,并且现在我已经100%确定它在VS 2010中也是无效的,所以我冒昧编辑了这个答案,从函数声明中删除了Shared - Shawn Kovac

1

他正在创建一个扩展方法。在C#中,这是通过创建一个静态方法(在Visual Basic中为Shared)来完成的。

在Visual Basic中创建扩展方法的机制似乎与在C#中的方式大不相同。您可能需要阅读有关扩展方法的MSDN条目,链接在此:http://msdn.microsoft.com/en-us/library/bb384936.aspx


1

以下是在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),因此我将其省略了。


谢谢,我一段时间前转到了C#,已经忘记了VB的所有内容。我已经修复好了。 - Nathan W
当您在模块中使用Shared时,VS会给出此错误:无法将模块中的方法声明为“Shared”。(我在VS 2010中进行了测试和验证。)我冒昧地从这个答案中删除了Shared - Shawn Kovac

0

你看到的不是“static T”,而是两个独立的部分。

  • public表示该方法为公开可见。
  • static表示该方法为静态方法。这意味着它是针对类而非实例运行的。
  • T - 是返回类型。

有关静态函数的更多信息。

VB.NET中的静态函数称为共享函数。

有关共享函数的更多信息。


我相信提问者想知道静态T在VB.Net中的等效写法。 - Samuel
哦,那真是让人困惑极了。 - Adam Peck
是的,他肯定可以在措辞上做得更好。 - Samuel
是的,至少有三个问题被同时提出了;-) - Arjan Einbu
嗨,抱歉造成困惑。 - Jack

0

C# 的 static 关键字与 VB 的 Shared 关键字相同。


不总是。扩展方法完全是另一回事。概念是相同的,但扩展方法的声明语法不同,因此在C#中,我们需要使用static关键字,并将第一个参数声明为this。但这两者在VB.NET中是不同的。但两者都需要extension属性。实际上,问题缺少这个扩展方法,但this关键字提示我们它确实是一个C#扩展方法(没有提供所需的extension属性)。 - Shawn Kovac
所以 C# 的 static 概念和 VB 的 shared 概念是相同的,但由于在声明扩展方法时语法差异很大,因此关键字不同。 :P 哦,如果两者之间有更多的一致性,这样一个更好的设计将会减少很多混乱啊。但它们是不同的编程语言,事实上,两种不同的编程语言没有任何理由需要任何相似之处。但这将非常有帮助。 耸肩 - Shawn Kovac

0
在你的例子中,T 是你的泛型方法中的类型参数。
在 VB 中:
Public Function GetValueOrDefault(Of T)(ByVal reader as IDataReader, ByVal columnName as string) as T

这意味着当您调用该方法时,您需要提供一个类型参数(告诉方法调用中T的类型)

不确定如何在VB中创建扩展方法。(这就是您第一个参数上的“this”关键字所表示的内容。)


接近了,但你忘记了“Public Function”,而且原始代码是扩展方法。 - Joel Coehoorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接