Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在C#3.0中自定义自动属性_.net_C# 3.0_Properties_Automatic Properties - Fatal编程技术网

.net 如何在C#3.0中自定义自动属性

.net 如何在C#3.0中自定义自动属性,.net,c#-3.0,properties,automatic-properties,.net,C# 3.0,Properties,Automatic Properties,在C#3.0之前,我们是这样做的: class SampleClass { private int field; public int Property { get { return this.field } set { this.field = value } } } 现在我们这样做: class SampleClass { public int Property { get; set; } } (看,妈!没有字段!) 现在,如果我想自定义Getter或Setter,字段

在C#3.0之前,我们是这样做的:

class SampleClass
{
   private int field;
   public int Property { get { return this.field } set { this.field = value } }
}
现在我们这样做:

class SampleClass
{
   public int Property { get; set; }
}
(看,妈!没有字段!)
现在,如果我想自定义Getter或Setter,字段必须是显式的,就像在C#2.0中一样。没有自定义的快捷方式(访问修饰符除外)。

是的,自动属性的目的是提供一种在将来添加自定义的方法,而不会影响类的现有用户。这通常意味着添加一个私有/受保护的备份字段。

使用C#3.0和自动属性,您仍然可以更改访问级别:

class SampleClass
{
   public int Property { get; private set; }
}

您也不能使用自动属性指定只读字段,也不能使用变量初始值设定项(尽管我已经看到一些建议使用的语言扩展允许使用这些属性)


您可以将自动属性设置为虚拟,但这意味着对类中属性的任何访问都可以调用子类型实现。

通常,所有字段都应该是私有的,以便进行良好的封装。如果你想让子类型访问这个字段,你应该有一个公共getter和protectedsetter(或其变体)作为备用-如果你使用BinaryFormatter和更改auto-props,要非常小心;它并不健壮: