【问题标题】:ReadOnly Property or property with private set I should use in vb.net?我应该在 vb.net 中使用只读属性或私有集的属性?
【发布时间】:2012-02-19 18:08:40
【问题描述】:

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

public String Name{ get; private set; }

但是当我在 VB.NET 中尝试时,我很震惊,因为提到的 here 不支持它,我必须写如下:

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

或者:

Private _Name as String
Public Property Name as String
   Get
      return _Name
   End Get
   Private Set(value as String)
      _Name = value
   End Set
End Property

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

编辑

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

【问题讨论】:

    标签: c# .net vb.net properties


    【解决方案1】:

    请注意,如果您使用的是 Roslyn 编译器(.NET 4.6 及更高版本,VS.NET 2015+),那么即使使用简短的 VB.NET 形式

    Public ReadOnly Property Name as String
    

    在没有私有变量的情况下,类的构造函数仍然可以为只读属性赋值。您甚至可以将该属性作为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
    

    这个班级的DotNetFiddle

    【讨论】:

      【解决方案2】:

      第一个属性声明ReadOnly 使该属性根本无法修改。第二个Private Set 允许在您正在使用Me.Name = "str" 的类中修改属性。

      在这两种情况下,仍然可以使用 _Name = "str" 在类中更改基础值。

      【讨论】:

        【解决方案3】:

        在ReadOnly 的情况下,只有那些有权访问底层变量的人才能通过直接应用此类更改来更改底层值(例如,同一类中的元素)。在后一种情况下,Private Set - 这几乎相同 - 类范围内的元素可以更改基础值,但可以通过属性来做到这一点。

        首选哪个是间接的:属性的一个优点是,您可以像方法一样在应用更改时涉及进一步的实现(尽管应该避免副作用,但您可能会“验证”并接受异常,因为实例)。如果在设置值时总是有其他事情要做,这与设置值密切相关,您可以在此属性设置器中执行此操作,而不是必须在您执行的任何地方编写该实现代码set.

        【讨论】:

          【解决方案4】:

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

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

          Me.Name = "new value"
          

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

          【讨论】:

            猜你喜欢
            • 2012-07-06
            • 1970-01-01
            • 1970-01-01
            • 2010-11-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-12
            • 2011-01-22
            相关资源
            最近更新 更多