类中的属性

时间:2013-02-20 15:19:13

标签: c#

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

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

   private string _string2 = string.Empty;

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

7 个答案:

答案 0 :(得分:5)

只有String2property,另一个是公开field

有关详细信息,请参阅Difference between Property and Field in C# .NET 3.5+,但如果有疑问,则应使用属性而非公共字段。

如果这似乎是太多的打字,那么你会很高兴知道以下是等价的

public string String2 { get; set; }

请参阅auto-properties

答案 1 :(得分:2)

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

您可以使用自动属性简化这类简单属性的声明:

public string String { get; set; }

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

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

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

答案 2 :(得分:1)

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

像这样:

public string String1 {get;set;}

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

public string String1 {get; private set;}

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

public string String1 {set; private get;}

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

public string _string1; /*bad idea*/

答案 3 :(得分:0)

String1是公共字段,而不是属性。这是不推荐,除非它是static readonly(和不可变的!),如String.Empty

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

答案 4 :(得分:0)

首先是:

public string String1 = string.Empty;

是一个字段,而不是属性。你通常应该避免公开领域。

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

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

public string String3 { get; set; }

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

答案 5 :(得分:0)

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

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

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

public string String1 { get; set; }

答案 6 :(得分:0)

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

public string String1 { get; set; }

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