类中的属性

本文关键字:属性 | 更新日期: 2023-09-27 18:00:13

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

[Serializable]
public class MySample
{
   public string String1 = string.Empty;
   private string _string2 = string.Empty;
   public string String2 
        {
            get { return _string2 ; }
            set { _string2 = value; }
        }
}

类中的属性

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

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

如果这看起来太多的打字,那么你会很高兴地知道以下是等效的

public string String2 { get; set; }

请参阅自动属性

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

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

public string String { get; set; }

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

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

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

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

像这样:

public string String1 {get;set;}

如果你想要一个只从中读取而不写入的属性:

public string String1 {get; private set;}

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

public string String1 {set; private get;}

通常建议您不要将fields声明为public:

public string _string1; /*bad idea*/

第一个是:

public string String1 = string.Empty;

是字段,而不是属性。您通常应该避免公开字段。

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

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

public string String3 { get; set; }

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

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

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

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

public string String1 { get; set; }

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

public string String1 { get; set; }

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

String1是一个公共字段,而不是属性。这是不推荐的,除非它是static readonly(并且是不可变的!),就像String.Empty一样。

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