Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该在vb.net中使用只读属性还是带有私有集的属性?_C#_.net_Vb.net_Properties - Fatal编程技术网

C# 我应该在vb.net中使用只读属性还是带有私有集的属性?

C# 我应该在vb.net中使用只读属性还是带有私有集的属性?,c#,.net,vb.net,properties,C#,.net,Vb.net,Properties,我喜欢.NET自动属性,在C中,通过将set部分声明为private来声明readonly属性非常容易: public String Name{ get; private set; } 但是,当我在VB.NET中尝试此功能时,我震惊地发现它不受上述支持,我必须按如下方式编写: Private _Name as String Public ReadOnly Property Name as String Get return _Name End Get End Prope

我喜欢.NET自动属性,在C中,通过将
set
部分声明为
private
来声明
readonly
属性非常容易:

public String Name{ get; private set; }
但是,当我在VB.NET中尝试此功能时,我震惊地发现它不受上述支持,我必须按如下方式编写:

Private _Name as String
Public ReadOnly Property Name as String
   Get
      return _Name
   End Get
End Property
或:

VB.NET
中的这些声明之间有什么区别,首选哪种声明?为什么

编辑


哪一个会影响编译时、运行时或性能?

第一个块只允许您获取Name的值。您不能设置名称

第二个块允许您在类中设置Name的值。例如:

Me.Name = "new value"

我会选择选项1,因为第二个选项冗长而不提供任何实际值。

只读
的情况下,只有那些有权访问基础变量的人可以通过直接应用这种更改来更改基础值(例如,同一类中的元素)。在后一种情况下,
Private Set
——这基本相同——类范围内的元素可以更改基础值,但可以通过属性来更改


首选哪一个是间接的:属性的一个优点是,您可以像方法一样,在应用更改时涉及到进一步的实现(尽管应该避免副作用,例如,您可以“验证”和采取例外)。如果在设置值时总是有其他事情要做,这与设置值密切相关,则可以在此属性设置器中执行,与在执行
设置时必须在任何地方编写该实现相反,第一个属性声明
ReadOnly
使其无法修改属性。第二个
私有集
允许在您使用的类中修改属性
Me.Name=“str”


在这两种情况下,仍然可以使用
\u Name=“str”

在类中更改基础值。请注意,如果您使用的是Roslyn编译器(.NET 4.6及更高版本,VS.NET 2015+),则即使使用了简短的VB.NET表单

Public ReadOnly Property Name as String
在没有私有变量的情况下,类的构造函数仍然可以为readonly属性赋值。您甚至可以将该属性作为
ByRef
参数传递给其他函数

Public Class SomeClass
    Public ReadOnly Property Name1 As String
    Public ReadOnly Property Name2 As String
    Public Sub New()
        PrivSub(Name1)
        Name2 = Name1 & " is now"
    End Sub
    Private Sub PrivSub(ByRef n As String)
        n = System.DateTime.UtcNow.ToLongDateString()
    End Sub
End Class
这一类的

Public Class SomeClass
    Public ReadOnly Property Name1 As String
    Public ReadOnly Property Name2 As String
    Public Sub New()
        PrivSub(Name1)
        Name2 = Name1 & " is now"
    End Sub
    Private Sub PrivSub(ByRef n As String)
        n = System.DateTime.UtcNow.ToLongDateString()
    End Sub
End Class