VB.Net 属性 - 公共获取,私有集

Posted

技术标签:

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

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

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

【问题讨论】:

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

以上是关于VB.Net 属性 - 公共获取,私有集的主要内容,如果未能解决你的问题,请参考以下文章

在值中搜索字符串并在 VB.NET 中的 LINQ to XML 中获取属性值

在 GraphQL/Relay 中处理隐私

用于 SQL Server 和 VB.NET 应用程序的 MultipleActiveResultSets

如何实现具有公共属性但私有设置方法的多个接口?

在 JavaScript 中的公共方法中获取私有方法值

在 VB.NET 中拖放并获取文件路径