C#接口为什么可以”定义“属性(Property)?

前言:
这是自己的不严谨造成的:(

印象的概念中,接口中都是一些方法的集合,通常自己也只会定义方法,但昨天看到一套代码的实现中,有定义了自动实现属性的部分,接口中不是不能定义数据成员吗?

C#3.0的AIP(自动实现属性),C#会自动生成一个private的私有关联字段,更简便的语法:

public interface ITest{
    string msg{get;set;}
}

会有些不解,所以分析了一下IL代码:


image.png

上面的截图中,C#自动为我们生成了get_msg和set_msg两个方法。
下面的msg: instance string() 则是属性的定义:

.property instance string msg()
{
  .get instance string ITest::get_msg()
  .set instance void ITest::set_msg(string)
} // end of property ITest::msg

但并没有看到私有字段的定义,所以我在Class中定义了同样一个属性:

public class App : MonoBehaviour {

    public int FFF { get; set; }

    public int kkk;
    public int KKK {
        get {
            return kkk;
        }
        set {
            kkk = value;
        }
    }

}

定义一个自定义属性和普通的属性,我们看下IL图:


image.png
image.png

在App.cs类中,生成了两个字段,kkk是公共的字段,我自己定义的(应该设置成private),
<FFF>k__BackingField:private int32
这是由C#自动生成的私有关联字段。

所以这里突然间想到:

类是”定义“,而接口仅是”声明“。
所以属性在接口中仅仅是一个”声明”。也仅支持AIP自动实现属性。

这时,我让App.cs实现ITest接口后,我需要将ITest中声明的属性进行定义,这样再查看IL代码后,
自动生成的字段就会出现了。

温故而知新呐

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容