【问题标题】:Why does the setter of a VB.NET property require a typed argument and why is it ByVal?为什么 VB.NET 属性的设置器需要类型化参数,为什么是 ByVal?
【发布时间】:2012-09-13 01:22:01
【问题描述】:

在 C# 中,属性的 setter value 关键字将自动与属性的类型相同。

例如,在 C# 中,value 的类型为 string

private string str = string.Empty;
public string MyText 
{
    get { return str; }
    set { str = value; }
}

如果我们将这个 sn-p 转换为 VB.Net,我们得到

Private str As String = String.Empty
Public Property MyText() As String
    Get
        Return str 
    End Get
    Set(ByVal value As String)
        str = value
    End Set
End Property

问题

  1. 为什么set有Set(ByVal value As String)这一行?不应该值类型 自动成为字符串。这边。

    Private str As String = String.Empty
    Public Property MyText() As String
        Get
            Return str 
        End Get
        Set
            str = value
        End Set
    End Property
    

    那有什么用?

  2. 我不能把BYVal改成ByRef(我试过了,报错),那还有什么用呢?

【问题讨论】:

  • 问得好,不知道为什么直接给它一个-1。
  • @AlastairPitts:可能是因为标题混乱。

标签: c# vb.net


【解决方案1】:

可以省略 (ByVal value As String) 部分。 Visual Studio 将继续添加它,但语言和编译器都不需要它。

您可以使用value 以外的参数名称。另请注意,从 VS2010 SP1 开始,您可以省略 ByVal 关键字。


示例:

Class Test

    Private str As String = String.Empty

    Public Property MyText() As String
        Get
            Return str 
        End Get
        Set
            str = value
        End Set
    End Property

    Public Property MyText2() As String
        Get
            Return str 
        End Get
        Set(something As String)
            str = something
        End Set
    End Property

End Class

【讨论】:

  • 嘿,如果我删除它,如你所说,Visual Studio 会自动添加它。
  • @NikhilAgrawal - VS 编辑器坚持添加它(类似地,如果您删除它,它将添加回 ByVal)。但是 Visual Basic 语言不需要这些东西。
  • @NikhilAgrawal 这并不意味着编译器需要它。
  • @Damien_The_Unbeliever (类似地,如果你删除它,它会重新添加 ByVal):自 VS2010 SP1 以来它不会再这样做了。
  • @BigYellowCactus - 啊。当我们开始使用 VS2010 时,我们开始从 VB -> C# 迁移以进行新的开发,所以我越来越少地使用新的 VS 来使用它
【解决方案2】:

我认为,它是 Visual basic 语法的一部分。如果OptionStrict 未打开,您可以省略数据类型。但如果指定类型,则必须与属性类型相同。

From MSDN - Set Statement (Visual Basic)

数据类型
如果 Option Strict 为 On,则为必需。 value 参数的数据类型。这 指定的数据类型必须与属性的数据类型相同 声明此 Set 语句的位置。

【讨论】:

    【解决方案3】:

    因为你允许在VB中更改参数的名称

    Public Property MyText() As String
        Get
            Return str
        End Get
        Set(ByVal val As String)
            str = val
        End Set
    End Property
    

    您不能将ByVal 更改为ByRef,因为属性参数只能按值传递。但 VB 有时倾向于陈述不可更改的事实。

    开发人员可以(理论上)让您拥有:

    Set(val)
    

    因为没有其他东西是可以改变的。但他们选择让属性的参数类似于Functions 和Subs 的参数。


    事实上,您根本没有 来指定参数。根据 VB 语言规范 (9.7.2):

    如果指定了参数列表,它必须有一个成员,该成员不能有除ByVal之外的修饰符,并且它的类型必须与属性的类型相同。该参数表示正在设置的属性值。如果省略参数,则隐式声明名为Value 的参数

    和(9.5.2):

    未指定ByRefByVal 的参数默认为ByVal

    【讨论】:

      【解决方案4】:

      如果值是 ByRef,Setter 将能够修改调用者的值。允许属性设置器产生这样的副作用是没有意义的。

      【讨论】:

        【解决方案5】:

        例如,您可以将 value 设为枚举并对其进行选择案例并以这种方式设置值。您不必将属性的 set 调用限制为仅传递相同的值类型,这是一个不错的功能

        【讨论】:

          猜你喜欢
          • 2011-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-10
          • 1970-01-01
          • 2019-08-07
          • 1970-01-01
          相关资源
          最近更新 更多