C#接口為什么可以”定義“屬性(Property)?

前言:
這是自己的不嚴(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)了。

溫故而知新吶

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容