属性

2013-02-20 34 views
0

我创建的两个属性之间有什么区别(即优势/劣势)?两者似乎都是正确的,但是在类中声明属性的最佳方式(实践)是什么?属性

[Serializable] 
public class MySample 
{ 
    public string String1 = string.Empty; 

    private string _string2 = string.Empty; 

    public string String2 
     { 
      get { return _string2 ; } 
      set { _string2 = value; } 
     } 
} 
+1

可能的重复http://stackoverflow.com/questions/450238/to-underscore-or-to-not-to-underscore-that-is-the-question – coder 2013-02-20 15:22:32

+0

如果你想,例如,举一个事件当财产发生变化时。由于您只能在set/get访问器中放置代码,因此您必须使用“String2”选项。 – Evelie 2013-02-20 15:24:49

+0

[Property(with no extra processing)vs public field](http://stackoverflow.com/questions/1272521/propertywith-no-extra-processing-vs-public-field) – nawfal 2014-07-17 20:37:21

回答

1

的最好方法是使用自动属性:如果你想从你只读取属性

public string String1 {get;set;} 

,但不能写:

这样

public string String1 {get; private set;} 

如果你想要一个你只能写入的属性,但不能读取:

public string String1 {set; private get;} 

一般来说,建议你不应该声明fieldspublic

public string _string1; /*bad idea*/ 
+0

您声明的只读属性只有财产是错误的。您缺少'private set;'只写属性也是如此。 – 2013-02-20 15:26:30

+0

@DanielHilgarth我现在好吗? – 2013-02-20 15:29:45

+0

现在编译。然而,公约表示,一个制定者应该总是放在吸气剂之后。顺便说一句:只写属性也是一个坏主意*,不应该使用。 – 2013-02-20 15:33:28

2

只有String2是一个属性。 String1只是一个公共领域,建议不要声明公共领域。

可以通过使用自动属性简化这样的简单属性的声明:

public string String { get; set; } 

字段和属性之间的主要区别是,字段直接访问,而属性是只读,并且经由get写入和set方法。当您如上所述声明自动属性时,编译器会自动为您生成这些方法getset,以及用于存储实际值的备用字段。

您还可以在getset方法中执行其他代码,这些方法通常用于更改通知和验证等方面。您可以将getset方法设置为不同的可见性,例如{ get; private set; },这是您没有字段的另一件事。

请注意,即使您的示例中String1String2的用法相同,它们也不是二进制兼容的。也就是说,如果您有一个使用字段的类,并且想要将该字段更改为属性,则需要重新编译引用该类的所有程序集。所以最好从头开始(至少是自动)属性。

0

String1是公共领域,而不是财产。这是不推荐,除非它是static readonly(和不可变的!),如String.Empty

即使一个字段现在很好(虽然可以说不是最先进的技术),但稍后将其更改为属性会打破您的类的二进制兼容性,因此是一个重大改变。

0

首先这是:

public string String1 = string.Empty; 

是一个领域,而不是财产。你通常应该避免公开领域。

第二个是有现场支持者的财产。如果您想在设置之前进行某种验证,这会很有用。或者可能在获取值之前进行某种惰性初始化(显然,对于更复杂的类型,或者如果不需要经常需要时间值的构造,延迟初始化会更好)。

第三个选项是一个自动财产,像这样:

public string String3 { get; set; } 

这编译像一个属性,因此,如果你改变你的代码是一个领域的支持属性添加额外的功能,然后将签名您类不必更改,并且任何使用该类的现有代码都不需要更新以调用属性而不是字段(因为它始终是属性)

0

第一个不是属性,而是一个领域。您在这里实施这些方式的方式实际上没有区别,但总的来说,属性会为您提供更多的权力。

What is the difference between a Field and a Property in C#?

通常的方法来实现在C#中的属性是:

public string String1 { get; set; } 
0

String1实际上是一个领域,而不是财产。我想你想一个自动实现的属性,如:

public string String1 { get; set; } 

String2是现场支持的特性。两者之间的一个主要区别是,您有机会通过初始化字段而不是初始化构造函数中的属性来初始化字段支持的属性。另一个重要的区别是,在检索或设置值(例如执行更改通知)时,您有机会在现场支持的属性中执行其他操作。