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


69

我想我会问...但是有没有办法让属性的Get部分可以公开使用,而又可以将其设为私有?

否则,我想我需要两个属性或一个属性和一个方法,只是认为这样做会更清洁。


2
是的,我希望有一个像C#一样简洁的版本:public bool HasValue { get; private set; }
Jeff B

如果愿意,还可以扩展C#声明吗?例如,对于NameVB.NET中属性的设置器,可以将其拆分为FirstName和(Surname如果需要),然后同时进行设置。C#可以做到这一点吗,还是上面的声明是您可以做到的?
David Gard 2014年

@DavidGard您可以在VB.NET中使用C#进行扩展,但是也可以简化很多,这非常方便
Breeze

Answers:


118

是的,很简单:

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

2
有关信息,此功能是在发布.Net Framework v2.0的同时引入到VB的。
罗兰·肖

25

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

Public ReadOnly Property Name As String

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


1
是,似乎是仅在Visual Studio 2015中添加的功能。请参阅msdn.microsoft.com/zh-cn/library/dd293589(v=vs.140).aspx-并比较“需要标准语法的属性定义”部分VS 2013版本”,您会注意到VS2013中需要ReadOnly属性,而VS2015中需要ReadOnly属性
James S

2
“ ReadOnly”的问题在于,即使在类内部也无法设置属性。当您将集合标记为受保护或私有时,可以在类中进行设置,从而提供良好的控制级别。我希望您可以指定两个范围,例如“ Public Private Property Name As string”。
Brain2000 '17

6
如答案中所述,@ Brain2000可以在类中使用属​​性名称前面的下划线设置属性。可悲的是,Intellisense对此一无所知。
微风

要添加到@Breeze答案和注释中,您还可以添加一个带有值的公共方法,然后可以使用后备字段设置ReadOnly属性。
内森

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

6

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

Private _name As String

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

4

我发现将标记propertyreadonly比上面的答案更干净。我相信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/zh-cn/library/dd293589.aspx?f=255&MSPPError=-2147217396


1
这应该是更新的答案。它也有可能不支持字段msdn.microsoft.com/en-us/library/...
EvilDr

我知道不需要支持字段。我认为id包括完整性的支持字段。更新了答案,以包括没有后备字段的示例。谢谢
亚当H

-4

如果您使用的是VS2010或更高版本,则比这更容易

Public Property Name as String

您可以获得私人财产,并且完全免费获取/设置!

请参阅此博客文章:Scott Gu的博客


6
是的,但是您没有私人套装。OP希望ReadOnly可以在类中设置与自动实现的属性等效的属性。但是,您提出了一个有趣的观点。您也许可以拥有ReadOnly公共财产,但可以使用场景_Name私有财产来进行设置。但是,如果您有任何行为要放进去,Set那可能效果不佳。您可能会弄乱它,并通过编辑来扩大答案:)
Jeff B
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.