12

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

  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

4 回答 4

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;
        }
    }

}

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

于 2010-07-09T18:55:19.243 回答
14

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

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

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

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

于 2010-07-09T18:54:55.137 回答
5

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

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

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

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

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

于 2010-07-09T18:57:09.043 回答
0

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

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

我假设您已经了解Access Modifier.

于 2010-07-10T09:15:16.197 回答