CSharp - 为什么 VB.Net 属性的setter需要类型化参数,为什么它是ByVal的?

  显示原文与译文双语对照的内容
0 0

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

例如,在C# ,type的 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

Questions

  1. 为什么设置处于这一行 Set(ByVal value As String)? 不应该值类型自动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( 我试过,将给出错误),则使用,它也是什么?

时间:原作者:7个回答

0 0

可以省略(ByVal value As String)部分。 Visual Studio让添加这条不需要,但它仍认为该语言也不是编译器。

可以使用参数名以外 value. 还请注意,由于VS2010 SP1,可以省略 ByVal关键字。


Example :

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
原作者:
0 0

我认为其Visual Basic中的语法的一部分。 文件就会省略了数据类型。 OptionStrict尚未打开电视机, 但是,如果指定了类型,则必须将其与属性的类型相同。

From MSDN设置Statement ( Visual Basic )

数据类型
如果Option取出Strict是On 。 value参数的类型的数据。 type参数指定必须是相同的数据类型属性声明" Set声明的位置。

原作者:
0 0

因为你 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)

因为其他没有任何alterable 。 但是他们选择了使属性的参数类似的参数。 Functions 和 Subs 。


其实你根本不来指定参数。 依照" VB语言规范( 9 .7 。2 ) :

如果指定了参数列表,它必须有一个成员,该成员必须具有无修改者除外 ByVal,并且其类型必须与属性的类型相同。 该参数表示要设置的属性值。 如果省略该参数,参数名为 Value会被视为隐含声明

和( 9 .5 。2 ) :

参数未指定 ByRefByVal默认为 ByVal.

原作者:
0 0

如果该值是ByRef,Setter能够修改调用者的值。 审判,以允许在属性setter这样会引起副作用。

原作者:
0 0

你可以做一个enum和是一个select case值并将值设置为这个游戏实例那边 你不必将属性设置呼叫限制为只传递相同的值类型,也是不错的特性

原作者:
...