C#接口中自动实现属性的文档表述冲突及概念疑问
咱们先直接给结论:你在接口里写的public interface MyInterface { int Myproperty1 {get;set;} }不是自动实现属性,微软文档里的表述1并没有错误,核心是要区分「接口的属性契约」和「类/结构体的自动实现属性」这两个完全不同的概念。
1. 自动实现属性的本质是什么?
自动实现属性(比如类里的int MyProperty {get;set;})的核心是:编译器会自动帮你生成一个私有实例后备字段,用来存储属性的值——它本质是语法糖,替你省去了手动声明字段和写空逻辑访问器的麻烦。而这种自动生成的字段是属于类/结构体实例的,这一点很关键。
2. 接口里的{get;set;}到底是什么?
接口的核心是定义契约,它本身不能包含任何实例字段或实现逻辑。你在接口里写int Myproperty1 {get;set;},只是在告诉所有实现这个接口的类型:「你必须提供这个属性,而且这个属性必须同时有get和set访问器」——至于访问器怎么实现,是手动写逻辑还是用自动实现属性,完全由实现类决定。这正好对应文档里的表述2:接口中声明无主体的属性,意味着该属性的访问器必须由每个实现该接口的类型来实现。
3. 为什么文档说「不能在接口中声明自动实现属性」?
因为自动实现属性依赖编译器生成私有实例字段,而接口是不允许有实例字段的——接口里的属性根本没有存储的地方,自然不可能是自动实现属性。你看到的接口里的{get;set;}只是访问器的声明,不是实现,和类里的自动实现属性有着本质区别。
举个例子对比就清楚了:
- 类中的自动实现属性:
public class MyClass { // 编译器自动生成私有字段,这是自动实现属性 public int MyProperty { get; set; } } - 接口中的属性声明:
public interface MyInterface { // 只是契约,要求实现类必须有get和set,无任何实现或字段 int MyProperty { get; set; } } // 实现类可以用自动实现属性来满足契约 public class MyImpl : MyInterface { public int MyProperty { get; set; } // 这里才是自动实现属性 }
这样一看,文档的表述就完全通顺了:接口里的无主体属性不是自动实现属性,只是契约;自动实现属性只能存在于类/结构体中,因为它们需要实例字段来存储值。
内容的提问来源于stack exchange,提问作者Rajeev Verma

