如何正确定义类属性?

rlc*_*ews 12 c# properties automatic-properties c#-3.0

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

  public class MyClass
  {
      public string FirstName  {get; set;}
      public string LastName  {get; set;}
  }
Run Code Online (Sandbox Code Playgroud)

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

然而,随着我继续学习和阅读有关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; }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

我问,因为我在C#自学,我正在努力改进,以及更好地理解正确的开发方法,一些样本和教程只是简单地陈述方法没有一个可靠的解释为什么一种方法是首选(或应该是完成)另一个.

提前致谢

KP.*_*KP. 16

你的第一个例子:

public class MyClass
{
    public string FirstName  {get;  set;}
    public string LastName  {get;  set;}
}
Run Code Online (Sandbox Code Playgroud)

特别是在c#3.0中引入的Auto-Implemented Properties.这两种格式都不对.第一个更像是"速记".

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

  • +1; 第一个对于哑属性来说更方便,如果你发现自己需要逻辑,可以很容易地转换成第二个属性. (5认同)

Ode*_*ded 14

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

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

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

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


ang*_*son 5

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

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

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

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

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