前言:
這是自己的不嚴(yán)謹(jǐn)造成的:(
印象的概念中,接口中都是一些方法的集合,通常自己也只會定義方法,但昨天看到一套代碼的實(shí)現(xiàn)中,有定義了自動實(shí)現(xiàn)屬性的部分,接口中不是不能定義數(shù)據(jù)成員嗎?
C#3.0的AIP(自動實(shí)現(xiàn)屬性),C#會自動生成一個private的私有關(guān)聯(lián)字段,更簡便的語法:
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是公共的字段,我自己定義的(應(yīng)該設(shè)置成private),
<FFF>k__BackingField:private int32
這是由C#自動生成的私有關(guān)聯(lián)字段。
所以這里突然間想到:
類是”定義“,而接口僅是”聲明“。
所以屬性在接口中僅僅是一個”聲明”。也僅支持AIP自動實(shí)現(xiàn)屬性。
這時,我讓App.cs實(shí)現(xiàn)ITest接口后,我需要將ITest中聲明的屬性進(jìn)行定義,這樣再查看IL代碼后,
自動生成的字段就會出現(xiàn)了。
溫故而知新吶