2010-07-09 86 views
12

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

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

通常我会使用一个类如这一个项目中创建集合。

但是我继续学习和了解更多关于C#锐利我看到类被定义为例子:

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 value将其定义为属性?

我问,因为我是在C#中自学的,我正在尝试改进,以及更好地理解正确的开发方法,并且有一些样例和教程只是简单地陈述方法,没有一个明确的解释, (或应该完成)。

感谢您的第一个例子提前

+0

在第二个示例中,_lastname字段后面不应该有大括号。这应该在类定义的末尾。属性仍然在类块中定义。 (除非我不知道c#的东西) – 2010-07-09 18:57:56

回答

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

} 

粗的例子,但希望你明白我的理念。

+5

+1;第一种方法对愚蠢的属性更方便,如果你发现自己需要逻辑,可以很容易地转换成第二种。 – tzaman 2010-07-09 18:58:32

+0

@tzaman:说得好。我的想法确切。 – 2010-07-09 19:01:51

+0

甚至更​​好:第一个“哑”可以在编译时自动重写为即INotifyPropertyChanged,即PostSharp – quetzalcoatl 2013-07-09 07:41:32

13

的简写语法(自动实现的属性)引入C#3.0中,并没有之前那么有效。编译器实际上将它们转换为带有后备字段的完整表单。

在C#3.0之前,定义属性的唯一正确方法是使用后备字段。即使使用C#3.0,如果要在属性中使用任何逻辑,则需要将它们转换为使用后备字段。

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

+0

感谢您提到转换自动属性的潜在步骤。我还想补充说,将这些值作为自动属性发布意味着您可以稍后将它们更改为手动支持的属性,而不会破坏二进制级别的接口。相反,公共领域(ick!)与同名公共属性不是二进制兼容的。 – 2010-07-09 18:58:49

4

你所拥有的两个课程在功能和功能上实际上是相同的。

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

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

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

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

+0

你能否详细说明自动属性如何促进LINQ?我没有看到自己的联系。 – LukeH 2010-07-09 19:02:10

+0

它们是作为匿名类型包的一部分添加的。 – 2010-07-09 19:03:26

+1

好吧,我仍然不明白为什么Linq需要它们。嗯...... – 2010-07-09 19:05:12

0

您也可以使用访问修饰符get和set ...

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

我假设你已经拥有的知识Access Modifier