【问题标题】:Auto Property with public getter and private setter具有公共 getter 和私有 setter 的自动属性
【发布时间】:2012-12-29 19:29:12
【问题描述】:

注意:这不是VB.NET equivalent of C# property shorthand?重复这个问题是关于如何在 VB 自动属性的 getter 和 setter 上拥有不同的访问权限;例如 public getter 和 private setter那个问题是关于自动属性的语法(并没有提到这个问题)。


我正在尝试将自动属性(public getter 和 private setter)从 C# 转换为 VB.NET。

但转换后 VB.NET 维护一个私有字段。

C#代码

class DemoViewModel
{
    DemoViewModel (){  AddCommand = new RelayCommand(); }

    public ICommand AddCommand {get;private set;}
}

code converter 等效的VB.NET 是

Class DemoViewModel
Private Sub New()
    AddCommand = New RelayCommand()
End Sub

Public Property AddCommand() As ICommand
    Get
        Return m_AddCommand
    End Get
    Private Set
        m_AddCommand = Value
    End Set
End Property
Private m_AddCommand As ICommand
End Class

VB.NET 代码生成私有支持字段。

是否可以在源代码(如 c#)中去掉这个后退字段?怎么样?

如果没有这个特性,VB.NET 源码就会有很多这样的冗余。

【问题讨论】:

  • 我想忽略可能的重复。我错过了私人二传手的信息。

标签: vb.net


【解决方案1】:

使用 VB.NET,如果您希望 为 Get 和 Set 过程指定不同的可访问性,则 您不能使用自动实现的属性,而必须使用标准或扩展的属性语法。

阅读 MSDN:https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/procedures/auto-implemented-properties


如果 getter 和 setter 具有相同的可访问性,例如都是Public,那么你可以使用自动属性语法,例如:

Public Property Prop2 As String = "Empty"

【讨论】:

  • 注意:在 MSDN 链接中,说明在这种情况下不能使用自动属性语法的部分是“需要标准语法的属性定义”,特别是“为 Get 和 Set 指定不同的可访问性过程。例如,您可能希望将 Set 过程设为 Private,将 Get 过程设为 Public。"
【解决方案2】:

在 VB.NET 中是

Public ReadOnly Property Value As String

然后要访问私有设置器,请在属性名称前使用下划线

Me._Value = "Fred"

【讨论】:

    【解决方案3】:

    由于上述答案成立,您可以引入公共道具来公开私人道具。这可能不是一个很好的解决方案,但仍然比扩展的属性语法更少代码

    Private Property internalprop as object
    Public Readonly Property exposedprop as Object = internalprop
    

    【讨论】:

      猜你喜欢
      • 2017-06-27
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多