【问题标题】:How to properly define class properties?如何正确定义类属性?
【发布时间】:2010-07-09 18:52:15
【问题描述】:

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

  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#,我正在努力改进并更好地理解正确的开发方法,并且那里的一些示例和教程只是陈述了方法,而没有明确解释为什么首选一种方法(或者应该这样做)。

提前致谢

【问题讨论】:

  • 在第二个示例中,_lastname 字段后不应有右大括号。那应该在类定义的末尾。属性仍然在类块中定义。 (除非我对 c# 不了解)

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


【解决方案1】:

你的第一个例子:

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;第一个对于愚蠢的属性来说更方便,如果你发现自己需要逻辑,可以很容易地转换为第二个。
  • 甚至更好:第一个“哑”可以在编译时自动重写为 INotifyPropertyChanged,即 PostSharp
【解决方案2】:

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

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

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

简而言之 - 对于愚蠢的属性(那些什么都不做的),使用自动属性。它们使您的代码更简单、更易于阅读并且可以转换。

【讨论】:

  • 感谢您提及转换自动属性的潜在步骤。我还想补充一点,将这些值发布为自动属性意味着您可以稍后将它们更改为手动支持的属性,而不会破坏二进制级别的接口。相反,公共字段 (ick!) 与同名公共属性的二进制不兼容。
【解决方案3】:

实际上,您拥有的两个类在功能和特性上是相同的。

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

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

自动属性语法的目的是双重的,部分添加是为了方便 Linq,部分添加是为了更容易确保您声明属性,而不是公共字段。

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

【讨论】:

  • 您能否详细说明自动属性如何促进 LINQ?我自己看不到这种联系。
  • 它们是作为匿名类型包的一部分添加的。
  • 说实话我也不知道 :) 我只知道添加它们是为了让编译器能够更轻松地处理匿名类型。
【解决方案4】:

您也可以使用访问修饰符来获取和设置...

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

我假设您已经了解Access Modifier

【讨论】:

    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多