2008-09-14 69 views
78

在过去,我们声明如下特性:如何访问自动实现的属性的支持变量?

public class MyClass 
{ 
    private int _age; 

    public int Age 
    { 
      get{ return _age; } 
      set{ _age = value; } 
    } 
} 

现在我们可以这样做:

public class MyClass 
{ 
    public int Age {get; set;} 
} 

我的问题是,我怎么能访问在使用这个标志的自动创建私有变量?

我宁愿访问私有变量而不是公共访问者'年龄'。有没有默认的符号来访问私有变量,或者它是不可能的?

+10

这种访问私人与公共访问者的情况有什么区别?我认为最好的做法是从声明类的逻辑中访问公共访问器。如果您添加一些逻辑到存取器,您不想更改所有代码。 – 2008-09-14 20:52:21

+0

@ spoon16你可以给我一个添加逻辑到存取器的例子,并且必须改变你的所有代码。我不太了解这部分。 – Ogen 2014-12-21 03:17:32

回答

2

你不能,它是一种语言功能,而不是IDE功能。说实话,我更喜欢IDE为你添加私有变量。我同意,班级内部不得不使用公共入口点访问自己的变量,这有点奇怪。因此我不会使用这个新功能。

10

发生的事情是一个私有成员变量的注入在幕后,与<前缀> k__AutomaticallyGeneratedPropertyField#

C# 3.0 Automatic Properties explained

虽然有可能直接使用私有成员,这是非常hacky和不必要的。

12

此语法通常称为“语法糖”,这意味着编译器会采用该语法并将其转换为其他语言。在您的例子中,编译器将生成的代码看起来是这样的:

[CompilerGenerated] 
private int <Age>k_BackingField; 

public int Age 
{ 
    [CompilerGenerated] 
    get 
    { 
     return this.<Age>k_BackingField; 
    } 
    [CompilerGenerated] 
    set 
    { 
     this.<Age>k_BackingField = value; 
    } 

即使知道了这一切,你可以可能访问支持字段直接,但那种失败使用自动属性的目的。我在这里说的可能是因为你依赖于在C#编译器的未来版本中随时可能发生变化的实现细节。

23

您对自动属性的使用意味着您不需要获取/设置属性的任何获取/设置逻辑,因此私有备份变量不是必需的。

如果您的班级中有任何复杂的逻辑,请勿使用自动属性。正常情况下,只需去private int _age和普通的getter/setter即可。

IMO,自动性能更适合于快速实现一次性对象或临时数据胶囊状:

public class TempMessage { 
    public int FromID { get; set; } 
    public int ToID { get; set; } 
    public string Message { get; set; } 
} 

如果你并不需要太多的逻辑。

+0

为什么向您的类中添加复杂的逻辑会影响您是否在该类中使用了自动属性? – 2008-09-14 20:46:37

+0

更多的一致性...如果你有复杂的逻辑,那么你会想要从每个OO实践的私人支持变量中访问它......如果你使用自动属性,那么......在访问这些内容时会有不一致属性。因为有些会有下划线的前缀,有些则不会。 – chakrit 2008-09-18 22:31:40

92

新的自动属性的目的是为了减少需要编写的样板代码的数量,当你只有一个简单的属性,在get或set中不需要任何特殊的逻辑。

如果你想获得这些属性使用私有成员,这通常有几个原因:

  • 你需要的不仅仅是一个简单的get/set更多 - 在这种情况下,你应该避免使用此成员的自动属性。
  • 你想要避免通过获取或设置的性能打击,并直接使用成员 - 在这种情况下,如果真的出现性能问题,我会感到惊讶。简单的获取/设置成员非常容易嵌入,并且在我的(不可否认的有限的)测试中,我没有发现使用自动属性和直接访问成员之间的区别。
  • 您只希望具有公共读取权限(即只是'get'),并且该类直接写入成员 - 在这种情况下,您可以在自动属性中使用私有集合。即

    public class MyClass 
    { 
        public int Age {get; private set;} 
    }

这通常包括大多数为希望直接得到由自动属性中使用的支持字段的原因。

7

你不应该,而且你不太可能需要。如果您需要访问该属性,只需使用公共属性(例如this.Age)即可。支持公共财产的私人领域没有什么特殊之处,比财产优先使用它只是迷信。