前言:
这是自己的不严谨造成的:(
印象的概念中,接口中都是一些方法的集合,通常自己也只会定义方法,但昨天看到一套代码的实现中,有定义了自动实现属性的部分,接口中不是不能定义数据成员吗?
C#3.0的AIP(自动实现属性),C#会自动生成一个private的私有关联字段,更简便的语法:
public interface ITest{
string msg{get;set;}
}
会有些不解,所以分析了一下IL代码:
上面的截图中,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图:
在App.cs类中,生成了两个字段,kkk是公共的字段,我自己定义的(应该设置成private),
<FFF>k__BackingField:private int32
这是由C#自动生成的私有关联字段。
所以这里突然间想到:
类是”定义“,而接口仅是”声明“。
所以属性在接口中仅仅是一个”声明”。也仅支持AIP自动实现属性。
这时,我让App.cs实现ITest接口后,我需要将ITest中声明的属性进行定义,这样再查看IL代码后,
自动生成的字段就会出现了。
温故而知新呐