Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.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
C# 没有get的自动实现属性导致编译错误_C#_C# 6.0 - Fatal编程技术网

C# 没有get的自动实现属性导致编译错误

C# 没有get的自动实现属性导致编译错误,c#,c#-6.0,C#,C# 6.0,为什么一个有编译时错误,而另一个没有编译时错误? 这两者之间有什么有意义的区别吗?正因为如此,才决定采用这种方式?第二种方法不是自动实现的。在这个简单的例子中,编译器当然有可能发现您的属性实现被破坏了(因为setter不做任何事情),但很难涵盖“thisproperty is breaked”的所有可能情况,所以我想这就是为什么除了自动实现的属性之外,它们不会费事 例如,考虑这个,有效但奇怪的属性用法: public int MyWriteOnlyProperty1 { set; }

为什么一个有编译时错误,而另一个没有编译时错误?
这两者之间有什么有意义的区别吗?正因为如此,才决定采用这种方式?

第二种方法不是自动实现的。在这个简单的例子中,编译器当然有可能发现您的属性实现被破坏了(因为setter不做任何事情),但很难涵盖“thisproperty is breaked”的所有可能情况,所以我想这就是为什么除了自动实现的属性之外,它们不会费事

例如,考虑这个,有效但奇怪的属性用法:

public int MyWriteOnlyProperty1 { set; }      /* Error: Auto-Implemented properties must have get accessors.*/
public int MyWriteOnlyProperty2 { set { } }   // No error
或者在这个例子中,属性和你的例子一样坏,但是现在编译器很难知道。最好由开发者决定

private int _myValue;
public int MyWriteOnlyProperty2 { set { _myValue = value; } }

第二个不是自动实现的。在这个简单的例子中,编译器当然有可能发现您的属性实现被破坏了(因为setter不做任何事情),但很难涵盖“thisproperty is breaked”的所有可能情况,所以我想这就是为什么除了自动实现的属性之外,它们不会费事

例如,考虑这个,有效但奇怪的属性用法:

public int MyWriteOnlyProperty1 { set; }      /* Error: Auto-Implemented properties must have get accessors.*/
public int MyWriteOnlyProperty2 { set { } }   // No error
或者在这个例子中,属性和你的例子一样坏,但是现在编译器很难知道。最好由开发者决定

private int _myValue;
public int MyWriteOnlyProperty2 { set { _myValue = value; } }

第二个不是自动实现的。您正在使用空的主体显式实现setter。只有集合属性是不常见的,但它是有效的。编译器的任务不是告诉您实现应该是什么样子,所以空的主体是有效的

但是第一个案例没有任何意义。自动实现的属性使用不可访问的备份字段。有了它们,同时拥有
get
set
(具有相同或不同的可访问性)是非常有意义的。刚开始使用
get
(这在C#6.0中是有效的)听起来有点奇怪,但它确实有意义,因为实际上可以在构造函数中设置backing字段


但是刚刚设置了?这是没有用的,没有理由要写入无法读取的字段。(仅在构造函数中读取也没有意义。)

第二个不是自动实现的。您正在使用空的主体显式实现setter。只有集合属性是不常见的,但它是有效的。编译器的任务不是告诉您实现应该是什么样子,所以空的主体是有效的

但是第一个案例没有任何意义。自动实现的属性使用不可访问的备份字段。有了它们,同时拥有
get
set
(具有相同或不同的可访问性)是非常有意义的。刚开始使用
get
(这在C#6.0中是有效的)听起来有点奇怪,但它确实有意义,因为实际上可以在构造函数中设置backing字段


但是刚刚设置了?这是没有用的,没有理由要写入无法读取的字段。(仅在构造函数中读取也没有意义。)

可能第二个属性不再自动实现了……您可以比较MSIL以确定它的用途是什么?有意义的区别是尝试自动实现集合(编译器将创建一个无法访问的隐藏变量),另一个是显式不做任何事情,这很可能第二个属性不再自动实现…您可以比较MSIL以确定它的用途是什么?有意义的区别是,一个尝试自动实现集(编译器将创建一个无法访问的隐藏变量),另一种是显式不做任何事情,我认为不做任何事情是实现setter的有效方法。例如,属性可以表示与此类型无关的设置,但必须实现以满足接口要求。只有
集的属性并不奇怪。您将看到的一个常见位置是
密码
属性,该属性可以分配给但不能读取。Microsofts自己的设计指南指出,您不应该只对setter使用属性,因此我认为称之为怪异是安全的。如果您需要使用该模式,请定义一个方法。我认为不做任何事情是实现setter的有效方法。例如,属性可以表示与此类型无关的设置,但必须实现以满足接口要求。只有
集的属性并不奇怪。您将看到的一个常见位置是
密码
属性,该属性可以分配给但不能读取。Microsofts自己的设计指南指出,您不应该只对setter使用属性,因此我认为称之为怪异是安全的。如果需要使用该模式,请定义一个方法。