12

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

例如,在 C# 中,类型valuestring

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

如果我们将此片段转换为 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. 我无法更改BYValByRef(我试过了,它给出了错误),那还有什么用呢?

4

5 回答 5

9

可以省略(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
于 2012-09-12T07:37:09.717 回答
2

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

来自 MSDN - Set 语句 (Visual Basic)

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

于 2012-09-12T07:30:52.870 回答
2

因为你可以在 VB 中更改参数的名称

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

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

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

Set(val)

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


实际上,您根本不必指定参数。根据 VB 语言规范 (9.7.2):

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

和(9.5.2):

未指定ByRefByVal默认为的参数ByVal

于 2012-09-12T07:36:05.597 回答
1

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

于 2012-09-12T07:38:20.400 回答
0

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

于 2012-09-12T17:22:01.807 回答