如何正确定义类属性?

时间:2010-07-09 18:52:15

标签: c# c#-3.0 properties automatic-properties

在项目中定义新类时,这样做的正确/最佳实践是什么? 在过去,我创建了类:

  public class MyClass
  {
      public string FirstName  {get; set;}
      public string LastName  {get; set;}
  }

通常我会使用这样的类来创建项目中的集合。

然而,随着我继续学习并阅读有关c#sharp的更多信息,我看到了将类定义为:

的示例
    class MyClass //not set to public
    {
        private string  _firstName; //first defined as fields
        private string _lastName;

        public string FirstName  // then defined as properties 
        {
            get { return  _firstName; }
            set { _firstName = value; }
        }
        public string LastName
        {
            get { return _lastName; }
            set { _lastName = value; }
        }
    }

第一种方法在定义上是否不正确,或者这是C#中可接受的速记版本?作为最佳实践,您应该首先使用私有字段定义类,然后使用get / set为值将它们定义为属性吗?

我问,因为我在C#中自学,我正在努力改进并且更好地理解正确的开发方法,并且那里的一些示例和教程只是陈述方法而没有一个可靠的解释为什么一种方法是首选的(或者应该完成另一个。

提前致谢

4 个答案:

答案 0 :(得分:16)

你的第一个例子:

public class MyClass
{
    public string FirstName  {get;  set;}
    public string LastName  {get;  set;}
}

具体是Auto-Implemented Properties,在c#3.0中引入。这两种格式都不对。第一个更像是“速记”。

对于更复杂的类型,有时使用旧样式仍然有用,并且只显示私有变量中的某些属性或值,例如:

public class MyClass
{
    private Dictionary<int, List<string>> _someInternalDictionary;

    public int MyValuesCount
    {
        get
        {
            return _someInternalDictionary.Values.Count;
        }
    }

}

一个粗略的例子,但希望你能得到我的想法。

答案 1 :(得分:14)

第一个示例中的简写语法(自动实现的属性)是在C#3.0中引入的,在此之前无效。编译器实际上将它们转换为带有支持字段的完整表单。

在C#3.0之前,定义属性的唯一正确方法是使用支持字段。

即使使用C#3.0,如果要在属性中包含任何逻辑,也需要将它们转换为使用支持字段。

简而言之 - 对于哑属性(无效的属性),请使用自动属性。它们使您的代码更简单,更易于阅读和转换。

答案 2 :(得分:5)

您所拥有的两个类在功能和功能方面实际上是相同的。

自动属性语法(第一个类)的目的是基本上为您提供一种快速方式来声明与您显示的第二个类基本相同的内容。

我会坚持使用第一个版本,直到你需要将代码添加到getter或setter方法(比如验证属性的新值)。

自动属性语法的目的是双重的,它部分被添加以便于Linq,并且部分添加以便更容易确保声明属性,而不是公共字段。

如果使用自动属性(同样是第一个版本)声明一个类,则根据您的代码编译的所有其他程序集将知道您的类将这些内容声明为属性,而不是字段。如果您以后决定需要添加代码,例如验证,则不必重新编译那些其他程序集,因为它们仍然可以找到属性。

答案 3 :(得分:0)

您还可以使用Access Modifier来获取和设置...

public {ReturnType} MyProperty { {Access Modifier}get; {Access Modifier}set; }

我认为您已经了解Access Modifier