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
属性的设置器,您可以根据需要将其拆分为 FirstName
和 Surname
,然后同时设置它们。 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 中获取属性值