【问题标题】:C# Automatic properties to wrap private fields?C# 自动属性来包装私有字段?
【发布时间】:2013-07-09 11:50:49
【问题描述】:

我可以通过 C# 中的自动属性封装私有字段吗?当我使用 C# 属性时,我当然可以封装私有字段。

private string owner;
public string Owner
{
  get { return owner; }
  set { owner=value;}
}

当我使用自动属性时会发生什么?

public string Owner { get; set; }

那样我只与属性本身交互,对吗?有没有办法使用自动属性来封装私有字段?它是如何工作的?

【问题讨论】:

  • 如果你想减少输入然后创建私有字段并按'ctrl+r'和'ctrl+e'

标签: c# properties private encapsulation


【解决方案1】:

有没有办法使用自动属性来封装私有字段?

是的;这正是自动实现的属性。简单地说:编译器为你声明了这个字段——你永远不会直接看到这个字段。也许这里真正的问题应该是:

如果我使用自动实现的属性,我可以直接访问底层字段吗?

答案是:不;只需访问该属性。在 JIT 内联之后,您将永远不会知道其中的区别无论如何

【讨论】:

  • 如果成员属于结构类型,或者代码需要将其作为ref 参数传递给任何对象,则差异可能很大。
【解决方案2】:

没有办法按照你的要求去做。

自动属性定义了一个字段,但它是隐藏的,并在编译时创建。

如果问题是打字并且您正在使用 Visual Studio

只需在编辑器中键入 propfull 并双击 TAB,Visual Studio 将自动在其中创建一个属性和一个字段,其中包含您指定的名称。

【讨论】:

    【解决方案3】:

    私有字段是在编译时创建的,具有唯一的名称,它在幕后使用。实现了自动属性,因此如果您在 setter 上添加验证,您的类型接口不会改变。然后,在您的班级中,您应该引用公共财产。这样,当您将验证添加到 setter 时,您的类将没有特权来通过验证过程(如果要实现的话)。

    【讨论】:

      【解决方案4】:

      C# 中的默认属性编译为具有公共 getter 和 setter 的私有字段。

      这个

      public string Name{get;set;}
      

      编译成这样:

      private string name
      public string Name
      {
          get
          {
              return name;
          }
          set
          {
              name = value;
          }
      }
      

      (其实并没有,变量名不同,使用了accessor/mutators,但本质上是一样的)

      【讨论】:

        【解决方案5】:

        对象向外界呈现的方式有所不同,具体取决于值是否公开为:

            public string Owner { get; set; }
        

        这是一个属性,或者

            public string Owner;
        

        这是一个字段。

        如果您有一个私有变量,则不需要自动属性,因为它是类中的字段还是属性对您来说并不重要。如果您以后确实想在外部公开它,那就是您开始编写如下代码的时候:

            private string myPrivateValue;
        
            public string myPrivateValueAsProperty {
                get { return myPrivateValue; }
                set { myPrivateValue = value; }
            }
        

        【讨论】:

          【解决方案6】:

          您提供的两段代码都是相同的,并且在您的情况下具有相同的效果。但是,可以使用本地私有属性或者更确切地说带有支持字段的属性来提供默认值。

          private string owner = "I am the Owner";
          public string Owner
          {
            get { return owner; }
            set { owner=value;}
          }
          

          此外,如果要在内部进行任何验证,则使用支持字段。

          private string owner = "I am the Owner";
          public string Owner
          {
            get { return owner; }
            set 
            { 
                  if(!string.IsNullOrEmpty(value))
                        owner=value;
            }
          }
          

          它们有时也用于通知财产。

          private string owner = "I am the Owner";
          public string Owner
          {
            get { return owner; }
            set 
            { 
                 owner=value;
                 NotifyPropertyChanges("Owner");
            }
          }
          

          希望对你有帮助。

          【讨论】:

            【解决方案7】:

            有趣。顺便说一句,在 VB.NET 中,您还可以从简写的属性声明中获得自动生成的私有字段,但是您可以直接访问它们并与之交互(如果你想要/需要的话):

            ...
                Public Property PropertyName As Object = Nothing
            
                Sub New()
                    _PropertyName = "123"
                End Sub
            ...
            

            自动生成的私有字段名称是总是带有下划线前缀的属性名称。 (注意:它不是 _camelCased,它与 _PropertyName 的大小写相同。)

            【讨论】:

              猜你喜欢
              • 2012-02-11
              • 1970-01-01
              • 2023-03-13
              • 2016-03-23
              • 1970-01-01
              • 2011-06-17
              • 2010-09-29
              • 2014-02-26
              相关资源
              最近更新 更多