C# 为什么VB.NET属性的setter需要类型化参数,为什么是ByVal?

C# 为什么VB.NET属性的setter需要类型化参数,为什么是ByVal?,c#,vb.net,C#,Vb.net,在C#中,属性的settervalue关键字将自动与属性的类型相同 例如,在C#中,value的类型是string private string str = string.Empty; public string MyText { get { return str; } set { str = value; } } 如果我们将此代码段转换为VB.Net,我们将得到 Private str As String = String.Empty Public Property MyT

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

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

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
问题

  • 为什么set有这一行
    设置(ByVal值作为字符串)
    ?不应该使用值类型 自动生成字符串。这边走

    Private str As String = String.Empty
    Public Property MyText() As String
        Get
            Return str 
        End Get
        Set
            str = value
        End Set
    End Property
    
    那有什么用

  • 我无法将
    BYVal
    更改为
    ByRef
    (我尝试过,它给出了错误),那么这又有什么用呢


  • 我认为,它是VisualBasic语法的一部分。如果未启用
    选项STRICT
    ,则可以省略数据类型。但如果指定类型,则该类型必须与属性类型的类型相同

    数据类型
    如果“选项严格”处于启用状态,则为必填项。值参数的数据类型。这个 指定的数据类型必须与属性的数据类型相同 声明此Set语句的位置

    因为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)
    
    因为没有什么是可以改变的。但是他们选择使属性的参数类似于
    函数
    s和
    s的参数


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

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

    和(9.5.2):

    不指定
    ByRef
    ByVal
    的参数默认为
    ByVal

    您可以省略
    (ByVal值作为字符串)
    部分。VisualStudio将继续添加它,但该语言和编译器都不需要它

    您可以使用
    以外的参数名。还要注意,自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
    

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

    您可以将值设置为枚举,然后对其执行一个select大小写,然后以这种方式设置值。您不必将属性的set调用限制为只传递相同的值类型,这是一个很好的功能

    好问题,不知道为什么会直接给它-1。@AlastairPitts:可能是因为标题混乱。嘿,如果我删除它,正如您所说,Visual Studio自动添加它。@NikhilAgrawal-VS编辑器坚持添加它(同样,如果删除它,它将添加回
    ByVal
    )。但是Visual Basic语言不需要这些东西。@NikhilAgrawal这并不意味着编译器需要它。@Damien_the_unsiver(类似地,如果删除它,它将添加ByVal):自VS2010 SP1以来,它将不再这样做。@BigYellowCactus-啊。当我们开始使用VS2010时,我们开始从VB->C迁移到新的开发环境中,所以我越来越少地在新的VSs中使用它