2017-11-03 72 views
0

我在默認配置中使用最新版本的Visual Studio Community 2017與所有最新的更新。是由編譯器優化的類上的硬編碼數組?

我在寫一個處理具有不同屬性的項目的系統。它們可能包含任何屬性組合,每個屬性都需要一個或多個數據成員和獨特的功能來處理它們。爲了讓我(或任何開發人員)快速實現新功能並減少必須編寫的代碼量,我使用了繼承。

問題是,提供數據和函數的每個子類都需要某些基本上是靜態的數據,但c#不允許重寫靜態成員。我的解決辦法是重寫基類成員,只是硬編碼的數據在他們的getter方法,像這樣:

public class BaseClass 
{ 
    public abstract string name { get; } 
    public abstract Color color { get; } 
    public abstract string[] info { get; } 
    public abstract OtherClass[] otherClasses { get; } 
} 

public class SubClass : BaseClass 
{ 
    public override string name { get { return "flip flops"; } } 
    public override Color color { get { return Color.FromArgb(255, 0, 255, 255); } } 
    public override string[] info { get { return new string[] { "a", "b", "c" }; } } 
    public override OtherClass[] otherClasses { 
     get { 
      return new otherClass[] { 
       new OtherClass("hard"), 
       new OtherClass("coded"), 
       new OtherClass("data") } 
     } 
    }; 
} 

正如你可以看到一些成員是值類型,有些是類,有些是數組類。我擔心的是,如果我有1000個SubClass實例,則運行時環境將爲每個類創建每個成員的唯一實例。這是完全不必要的,因爲每個數據都是相同的。顏色是一個結構體,因此是一個值類型,所以我不確定它是否會有不同的反應。

我試着(並且)解決了已經使用另一個類的問題。 SubClassData存儲成員,並且每個SubClass引用通過類構造函數分配的SubClassData。 SubClassData類存儲在一個大的靜態數組中。首先,使用它可以在構造中將錯誤的SubClassData分配給子類。更重要的是,這種模式將數據從感覺完全不自然的功能中分離出來。我認爲這些問題根本上是同樣的問題。

目前我正在使用顯示的第一種方法來實現該功能。我不確定這是否是微型優化,無論c#是否處理此問題,或者是否有更好的設計模式來實現此目的,但所有反饋都將得到讚賞:)

+0

你的實例屬性獲取器可以返回私有靜態成員。值類型將被複制,但這是價值類型的要點。 – Blorgbeard

+0

訪問每個成員時將創建唯一值。運行時絕對不會優化數組的創建,因爲它不能證明有人不會修改其中一個數組(在這種情況下,成員將不再返回預期的元素)。這是避免返回可變集合的一個原因。 –

回答

2

您可以簡單地返回公共數據你已經定義了靜態和私人的獲取者:

public class SubClass : BaseClass 
{ 
    private const string _name = "flip flops"; 
    private static readonly Color _color = Color.FromArgb(255, 0, 255, 255); 
    private static readonly string[] _info = new string[] { "a", "b", "c" }; 
    private static readonly OtherClass[] _otherClasses = new otherClass[] { 
     new OtherClass("hard"), 
     new OtherClass("coded"), 
     new OtherClass("data") 
    }; 

    public override string name { get { return _name; } } 
    public override Color color { get { return _color; } } 
    public override string[] info { get { return _info; } } 
    public override OtherClass[] otherClasses { get { return _otherClasses; } } 
} 
+0

我曾試過這個,但因爲某些數據傳遞給OtherClass引用SubClass的成員,所以它不適合我。解決的辦法是在SubClass中的一個單獨的私有數組中定義SubClass的靜態成員(如你所做的那樣),並在適當的地方使用它們來設置每個子類中的OtherClass。我應該已經意識到這一點,但感謝您的正確解決方案:) – MushyShaman