0

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

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

   private string _string2 = string.Empty;

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

7 回答 7

5

只有String2一个是属性,另一个是公共字段

有关详细信息,请参阅C# .NET 3.5+ 中的属性和字段之间的区别,但如果有疑问,您应该使用属性而不是公共字段。

如果这看起来输入太多,那么您会很高兴知道以下内容是等价的

public string String2 { get; set; }

查看自动属性

于 2013-02-20T15:21:48.283 回答
2

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

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

public string String { get; set; }

字段和属性之间的主要区别在于字段是直接访问的,而属性是通过getset方法读取和写入的。当您像上面那样声明自动属性时,编译器会自动为您生成这些getset方法,以及用于存储实际值的支持字段。

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

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

于 2013-02-20T15:21:44.993 回答
1

最好的方法是使用自动属性:

像这样:

public string String1 {get;set;}

如果您想要一个仅从中读取但不写入的属性:

public string String1 {get; private set;}

如果您想要一个仅写入但不读取的属性:

public string String1 {set; private get;}

通常建议您不要声明fieldspublic

public string _string1; /*bad idea*/
于 2013-02-20T15:21:14.900 回答
0

String1是公共领域,而不是财产。除非它是(并且是不可变的!),否则不建议这样做,例如.static readonlyString.Empty

即使一个字段现在很好(尽管可能不是最先进的),稍后将其更改为属性会破坏类的二进制兼容性,因此是一个重大更改。

于 2013-02-20T15:22:31.657 回答
0

第一个是:

public string String1 = string.Empty;

是一个字段,而不是一个属性。您通常应该避免创建公共字段。

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

第三个选项是自动属性,如下所示:

public string String3 { get; set; }

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

于 2013-02-20T15:22:36.987 回答
0

第一个不是属性,而是字段。你在这里实现这些的方式,实际上没有区别,但总的来说,属性给你更多的权力。

请参阅 C# 中的字段和属性有什么区别?

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

public string String1 { get; set; }
于 2013-02-20T15:23:03.590 回答
0

String1实际上是一个字段,而不是一个属性。我想您想要一个自动实现的属性,例如:

public string String1 { get; set; }

Your String2 is a field-backed property. One of the main differences between the two is that you have the opportunity to initialize the field-backed property by initializing the field instead of initializing the property in the constructor. Another important difference is that you have the opportunity in the field-backed property to do other things when the value is retrieved or set, such as performing change notification.

于 2013-02-20T15:24:06.367 回答