簡體   English   中英

C# - 財產澄清

[英]C# - Property Clarification

根據定義:

有財產說的例子

當我宣布

 string SayHello { get; set; }  

在界面內

它在內部被掛鈎為get_SayHello( ) ,set_SayHello() (當我反匯編時,我可以看到get和set方法)。

編輯:這就是我的理解。由於我是C#的新手,我正在尋求你的幫助。

你在一個有點錯誤的假設上操作,屬性需要一個支持字段。 是的, 大多數屬性使用支持字段,但這當然不是必需的。 我可以實現你的接口沒有支持字段,如下所示

class C1 : IFoo {
  public string SayHello {
    get { return "Say Hello"; }
    set { }
  }
}

接口中的屬性聲明表明任何實現類必須具有此類方法( get_SayHelloset_SayHello但定義為屬性),但未指定它們的實現方式。 也就是說,界面說明你可以做什么,但現在如何完成(所以你可以得到SayHello “字符串”,你可以設置SayHello “字符串”)。 因此,具體來說:在接口中定義屬性不會說明支持字段。

此外,屬性必須具有支持字段是一種誤解。 以下不是:

class Example {
    public string SayHello {
        get {
            return "Hello, World!"; 
        } 
        set { }
    }
}

屬性只是可通過類字段語法訪問的方法。 因為它們是方法而不是字段,所以它們是可定義的接口。

正如賈里德所說,該物業並不一定需要任何存儲地點......但我相信你還在過度思考它。

想象一下你的界面實際上是:

public interface IFoo
{
   string get_SayHello();
   string set_SayHello(string value);
}

只是界面中的方法。 你覺得這樣嗎? 如果是這樣,那真正的所有屬性,以及一些元數據將這些方法聯系在一起。 與領域無關......只是方法。

實現者可能想要使用一個字段,但這與接口完全分開。

在接口中聲明此類屬性只是意味着您定義的實現接口的任何類都需要實現該屬性。 這些類可以以您認為合適的任何方式自由實現該屬性(作為自動屬性,或通過其他更復雜的方法)。

將界面中的屬性更改為以下內容:

string SayHello { get; }

實現類只需要實現該屬性的getter。 但是在接口級別沒有進行存儲分配。

我的問題仍然是屬性需要一些存儲位置

事實並非如此。 你可以在getter / setter中做任何你想做的事。 通過在界面中聲明屬性,您只需強制實施者提供getter和/或setter。

並非所有.NET語言都具有屬性的概念。 因此接口還必須定義屬性的get_和set_版本,以便任何.NET語言都可以使用該類型。 這可能會增加您的困惑。

接口內部的聲明只是告訴您在該接口的實例上可以存在哪些成員。 它不會告訴您它們的實現方式或保存位置。

我認為你已經將界面的概念與類的概念混淆了。 您不實例化接口,而是實現它們的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM