【问题标题】:VB.Net Properties - Public Get, Private SetVB.Net 属性 - 公共获取,私有集
【发布时间】:2010-11-30 13:34:00
【问题描述】:

我想我会问...但是有没有办法让属性的 Get 部分作为公共可用,但将集合保持为私有?

否则我想我需要两个属性或一个属性和一个方法,只是觉得这样会更干净。

【问题讨论】:

  • 是的,我希望有一个像 C# 一样简洁的版本:public bool HasValue { get; private set; }
  • 如果您愿意,您还可以扩展 C# 声明吗?例如,对于 VB.NET 中 Name 属性的设置器,您可以根据需要将其拆分为 FirstNameSurname,然后同时设置它们。 C# 可以做到这一点,还是上面的声明可以做到?
  • @DavidGard 你可以在 C# 中走得尽可能远,就像在 VB.NET 中一样......但也可以走得更短,这很方便

标签: vb.net properties scope


【解决方案1】:

我发现将property 标记为readonly 比上述答案更干净。我相信 vb14 是必需的。

Private _Name As String

Public ReadOnly Property Name() As String
    Get
        Return _Name
    End Get
End Property

这可以浓缩为

Public ReadOnly Property Name As String

https://msdn.microsoft.com/en-us/library/dd293589.aspx?f=255&MSPPError=-2147217396

【讨论】:

  • 这应该是更新的答案。它也可能没有支持字段msdn.microsoft.com/en-us/library/…
  • 我知道支持字段不是必需的。我认为 id 包括完整的支持字段。更新了答案以包含不带支持字段的示例。谢谢
【解决方案2】:

我不确定 Visual Studio 的最低要求版本是多少,但是在 VS2015 中你可以使用

Public ReadOnly Property Name As String

它对于公共访问是只读的,但可以使用 _Name 私下修改

【讨论】:

  • Yes 似乎是仅在 Visual Studio 2015 中添加的功能 请参阅msdn.microsoft.com/en-us/library/dd293589(v=vs.140).aspx - 并将“需要标准语法的属性定义”部分与文章的 VS 2013 版本进行比较 - 和您会注意到 ReadOnly 属性在 VS2013 中需要它,但在 VS2015 中不需要
  • “ReadOnly”的问题是你不能在类中设置属性。当您将集合标记为受保护或私有时,您可以在类中对其进行设置,这提供了很好的控制水平。我希望您可以指定两个范围,例如“Public Private Property Name As string”作为简写。
  • @Brain2000 如答案中所述,您可以使用属性名称前的下划线在类中设置属性。可悲的是智能感知不知道这一点。
  • 要添加到@Breeze 答案和评论...您还可以添加一个接受值的公共方法,然后可以使用支持字段设置 ReadOnly 属性。
【解决方案3】:

如果你使用的是 VS2010 或更高版本,那就更简单了

Public Property Name as String

您完全免费获得私有属性和获取/设置!

查看这篇博文:Scott Gu's Blog

【讨论】:

  • 是的,但您没有私人套装。 OP 想要一个自动实现的 ReadOnly 属性,你可以在类中设置它。你提出了一个有趣的观点。您可以拥有ReadOnly 公共属性,但使用场景_Name 私有属性来设置它。但是,如果您想在Set 中添加任何可能效果不佳的行为。您可能会弄乱它并通过编辑它来扩展您的答案:)
【解决方案4】:

还有一个值得一提的调整:我不确定这是 .NET 4.0 还是 Visual Studio 2010 的功能,但如果您同时使用这两种功能,则无需声明 setter/mutator 代码块的参数:

Private _name As String

Public Property Name() As String
    Get
        Return _name
    End Get
    Private Set
        _name = value
    End Set
End Property

【讨论】:

    【解决方案5】:
        Public Property Name() As String
            Get
                Return _name
            End Get
            Private Set(ByVal value As String)
                _name = value
            End Set
       End Property
    

    【讨论】:

      【解决方案6】:

      是的,很简单:

      Private _name As String
      
      Public Property Name() As String
          Get
              Return _name
          End Get
          Private Set(ByVal value As String)
              _name = value
          End Set
      End Property
      

      【讨论】:

      • 供参考,此功能在 .Net Framework v2.0 发布的同时被引入 VB。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      相关资源
      最近更新 更多