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),
k__BackingField:private int32
这是由C#自动生成的私有关联字段。

所以这里突然间想到:

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

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

温故而知新呐

你可能感兴趣的:(C#接口为什么可以”定义“属性(Property)?)