3

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

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

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

public string Owner { get; set; }

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

4

7 回答 7

2

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

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

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

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

于 2013-07-11T09:16:02.697 回答
0

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

    public string Owner { get; set; }

这是一个财产,或

    public string Owner;

这是一个领域。

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

    private string myPrivateValue;

    public string myPrivateValueAsProperty {
        get { return myPrivateValue; }
        set { myPrivateValue = value; }
    }
于 2013-07-11T09:21:24.470 回答
0

您给出的两段代码都是相同的,并且在您的情况下会产生相同的效果。但是,可以使用本地私有属性或将其称为带有支持字段的属性来提供默认值。

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");
  }
}

希望能帮助到你。

于 2013-07-11T09:22:27.223 回答
0

没有办法做到你所要求的。

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

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

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

于 2013-07-11T09:13:24.100 回答
0

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

于 2013-07-11T09:13:51.370 回答
0

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

这个

public string Name{get;set;}

编译为:

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

(实际上并没有,变量名称不同,它使用访问器/突变器,但本质上它们是同一件事)

于 2013-07-11T09:14:50.327 回答
0

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

...
    Public Property PropertyName As Object = Nothing

    Sub New()
        _PropertyName = "123"
    End Sub
...

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

于 2018-07-06T21:48:50.550 回答