【问题标题】:VB.NET: What is static T (C#) in VB.NET?VB.NET:什么是 VB.NET 中的静态 T (C#)?
【发布时间】:2009-01-22 00:29:18
【问题描述】:

考虑:

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

 T returnValue = default(T);

我想实现类似this 的东西来检查DBNull。我可以很好地遵循代码,但我不太明白 VB.NET 中的静态 T 是什么。谁能解释一下?

【问题讨论】:

    标签: c# .net c#-to-vb.net


    【解决方案1】:

    相当于static在VB中的Shared。共享方法通常放在 Helper 类中,因为它们不需要类的实例即可运行。

    类型 T 表示这是一个泛型方法(这是 VB 9 和 C# 3 中的新功能)。泛型方法有效地将类型作为参数或返回泛型类型。

    扩展方法也是 VB 9/C# 3 中的新方法。这些方法允许您通过添加方法来扩展现有类型。您所需要的只是一个与您的代码在同一命名空间中可用的 Shared 方法,而在 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
    

    【讨论】:

    • 非常接近,但是您忘记显示扩展方法语法。
    • 是的,感谢您在代码 sn -p Joel 中添加了被遗忘的属性。
    • 另外,我认为 Shared 在这里无效,因为扩展方法必须在 Modules 内。
    • 是的,@ScottE,你是对的。尝试将“共享”添加到 Module 中的方法会产生此错误:“模块中的方法无法声明为“共享”。”但当然,它们确实是静态方法,因此 C# 要求将扩展方法声明为 static
    • (因为我测试了“共享”在 VB.NET 中无效,并且我现在 100% 确定它在 VS 2010 中无效,所以我冒昧地编辑了这个答案以删除Shared 来自函数声明。)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这是该方法在 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 的一切。我已经修好了。
      • 当您在 Module 中的方法上使用 Shared 时,VS 会出现此错误:模块中的方法不能声明为“共享”。 (我在 VS 2010 中对此进行了测试和验证。)我冒昧地从这个答案中删除了Shared
      【解决方案4】:

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

      【讨论】:

      • 并非总是如此。扩展方法是完全不同的动物。 概念是一回事,是的。但是关于如何声明扩展方法的语法不同,因此在C#中,我们需要static关键字,第一个参数声明为this。但是这两者在 VB.NET 中是不同的。两者都需要extension 属性。问题实际上是缺少这种扩展方法,但是 this 关键字提示我们它确实是 C# 扩展方法(没有提供所需的 extension 属性)。
      • 所以 C# static concept 和 VB shared concept 是一回事。但是关键字并不相同,因为在声明扩展方法时 syntax 有很大不同。 :P 哦,如果两者之间有更多的一致性,那么这样一个更好的设计如何会减少很多混乱。但它们是不同的编程语言,说实话,两种不同的编程语言根本不需要任何相似之处。但这会很有帮助。 耸耸肩
      【解决方案5】:

      您示例中的 T 是通用方法中的类型参数。

      在 VB 中:

      Public Function GetValueOrDefault(Of T)(ByVal reader as IDataReader, ByVal columnName as string) as T
      

      意味着当你调用方法时,你提供一个类型参数(告诉方法调用的 T 类型)

      但不确定创建扩展方法的 VB 语法。 (这就是第一个参数上的“this”关键字所表示的。)

      【讨论】:

      • 关闭,但是你忘记了“Public Function”,原来是扩展方法。
      【解决方案6】:

      您看到的不是“静态 T”,而是两个独立的部分。

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

      更多关于static function的信息。

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

      更多关于shared functions的信息。

      【讨论】:

      • 相信提问者想知道VB.Net等价于静态T。
      • 哦,这真是令人困惑。
      • 是的,他当然可以更好地表达他的问题。
      • 是的,一次至少有 3 个问题被问到 ;-)
      • 嗨,很抱歉造成混乱。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多