我指的是Microsoft的文档-https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/auto-implemented-properties。它们指出,当get或set内部不需要额外的逻辑时,自动实现的属性基本上是没有主体的属性。因此CCD_ 1是一个自动实现的属性。本文件还说明了以下几点
声明1:"不能在接口中声明自动实现的属性。自动实现的属性声明私有实例支持字段,接口可能不声明实例字段">
但我可以在接口中声明自动实现的属性,如下所示
CCD_ 2。我们不能在接口中声明自动实现的属性,这和上面的说法不冲突吗。
然后,Microsoft文档中写道:声明2:"在不定义主体的情况下声明接口中的属性会声明具有访问器的属性,该访问器必须由实现该接口的每个类型实现">
我不明白什么是声明一个没有正文的属性,它不是自动实现的属性吗?如果是,那么第一个语句是否正确?
问题重要编辑: 我很抱歉,我错误地发布了带有此链接的问题:https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/interface-properties.虽然我打算提及以下链接:https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/auto-implemented-properties.我现在用正确的链接更新了我的问题。
MSDN从未说过类似";所有没有主体的属性都是自动实现的属性";。他们可能会说";自动实现的属性不具有主体";,但后者并不意味着前者。MSDN并没有自相矛盾。
接口中没有实体的属性是abstract
,而自动实现的属性是非抽象的、没有实体的以及类/结构中的属性。
因此,public MyInterface { int MyProperty1 {get;set;} }
中的MyProperty1
不是一个自动实现的属性,而是一个抽象的属性。
我不明白什么是声明没有正文的属性
这就像在接口中声明两个没有实体的方法:
public MyInterfaceWithTwoMethods {
int GetMyProperty1();
void SetMyProperty1(int value);
}
只是在C#中使用属性更为惯用。
您可以使用自动实现的属性实现MyInterface
:
public class MyImpl : MyInterface {
public int MyProperty1 { get; set; }
}
尽管看起来只是在重复MyInterface
中所写的内容,但这与实现MyInterfaceWithTwoMethods
类似:
public class MyImpl : MyInterfaceWithTwoMethods {
private int myProperty1;
int GetMyProperty1() => myProperty1;
void SetMyProperty1(int value) { myProperty1 = value; }
}
您还可以使用自动实现的属性实现MyInterface
而不是:
public class MyImpl : MyInterface {
public int MyProperty1 {
get => 1;
set { Console.WriteLine("foo"); }
}
}