2011-04-17 61 views

回答

7

通常,一个属性是由可变支持反正。即使你有这样一个自动执行的属性:

public string Name { get; set; } 

仍然有一个变量在幕后。不是所有属性都支持变量(例如DateTime.Now),但绝大多数都是。

你几乎应该总是使用一个属性来访问另一个类型的数据,而不是暴露变量。 (换句话说,这些变量本身应该是私有的。)这样你就可以将类与它的实现分离开来了......一个类如何存储其数据应该只涉及类本身。

如果你只有史以来指一块类本身中的数据,你并不真正需要的特性可言,除非你想,当你改变它,或者类似的东西来进行验证。

你通过属性暴露一个变量之前值得思维缜密 - 如果你只是做这一切的时候,你失去了一定的封装;类型通常不应该是只是是由其他代码操纵的数据的集合。他们应该使用它们中的数据来公开更高级别的操作。这有点难以描述,我并不是说不好,本身 - 只是如果你不小心,它们可能会被过度使用。

3

一般来说,最好是创建公共属性和私有变量。

有几个理由有公共变量。

[其中需要性质的实例,是设置对象属性,并且还提高事件以通知变化的订户。

+0

它与Jon Skeet的回答几乎相同..更清楚:) – 2011-04-17 06:22:46

+1

@Shekhar_Pro:假设这是恭维...谢谢! – 2011-04-17 06:26:00

+0

+1 o是啊...... :) – 2011-04-17 06:29:03

1

可能有很多的情况下,有使用变量和性能之间的差异。 通常变量用于类的内部工作,而类不应暴露变量,换句话说,属性将从其他类访问。

另外一些代码生成和工具要求您定义变量或属性。例如在XAML(WPF和Silverlight)中,您必须公开变量以获取依赖项属性。

另外,由于属性代码被用于获取或设置它们甚至可以被用于提供对存储在其他地方的东西,而不是内部类变量的值来执行。例如,您可以定义一个属性,允许将一段UI绑定到文本文件的内容。

0

您不'必须'使用字段而不是属性,字段在运行时实际上更快。

但是,一般来说,你会想要在你的类上定义实例变量作为属性。这可以让你做一些你无法用字段做的额外的事情。

  1. 可只读或只写
  2. 可以包含在类似的方法
  3. 可以有副作用接口。

你的类的接口可以使许多事情更容易,包括测试和保持。

public interface IStudentGroup { 
    List<string> NameList { get; } 
} 

副作用是最有用的功能之一。假设你有一个名为Items的属性包含一个集合。如果它是空的,你可能希望它自动初始化。例如:

private List<string> namesList; 
public List<string> NameList { 
    { 
    get { 
     if (namesList == null) namesList = new List<string>(); 
     return namesList; 
    } 
} 
0

只是为了完整性,我想(从msdn)添加

性能不应该是计算复杂或产生副作用

所以对于计算复杂的操作或有副作用的情况下,写GetX(), SetX()方法代替使用属性

属性获取者应该是没有任何先决条件的简单操作。如果一个getter可能抛出一个异常,可以考虑重新设计这个属性作为一个方法。此建议不适用于索引器。由于参数无效,索引器可能会引发异常。