C# 为什么VB.NET属性的setter需要类型化参数,为什么是ByVal?
在C#中,属性的setterC# 为什么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
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
问题
设置(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中使用它