2014-04-05 36 views
-1

假設我有以下對象:如何避免拳擊和if或switch語句

object[] objs = new object[3]{ "this is sample string", 42L, 1}; 

,我想做點什麼各個對象的數組中像

foreach (object o in objs) 
{ 
    /// logic here 
    mylogic(); 
} 

現在mylogic()只會採取對象參數所以有拳擊正在進行,但我們需要能夠根據對象的類型做些事情,所以我們會這樣做:

public void dosomething(object obj) 
{ 
    // one way 
    if(obj.GetType() == typeof(string)) 
    { 
     // string specific something 
    } 
    // another way 
    if(obj is long) 
    { 
     // long specific something 
    } 

} 

嗯,它的醜陋和非性能,是否有更好的方式可能使用泛型或任何其他方式?

+2

在對象上開始醜陋[] objs = new object [3] – Paparazzi

回答

1

您的值已裝箱,因爲它們存儲在object[]。所以當你將它們傳遞給採用object參數的方法時,不會發生額外的拳擊。

object[]是我的目標,我的焦點 - 是否真的有必要代表您的數據?你真的不知道他們的結構?定義一個類(或結構體)來保存數據,並且包含作用於數據的方法 - 然後在設計和編譯時知道每個字段或屬性的類型,您可以使用它這些信息在更多的代碼中。你的情況可能是這樣的:

class Container 
{ 
    public string StringProperty { get; set; } 
    public long LongProperty { get; set; } 
    public int IntProperty { get; set; } 

    public void DoSomething() 
    { 
     // string specific something with StringProperty 
     // long specific something with LongProperty 
     // int specific something with IntProperty 
    } 
} 

你開始封裝您的數據並確保它靠近使用它們的邏輯方式。更好的做法可能是將這些屬性變成私有的只讀字段,所以它們甚至在外部看不到。

0

您可以嘗試在C#4.0及更高版本中使用動態關鍵字來查看是否可以幫助您。最好是定義你自己的類並製作不同類型的屬性,然後使用它們。

內存開銷會很小,你會避免所有的拳擊處罰。

0

IMO,在這種情況下,應該問一個問題:代碼設計有什麼問題嗎?包含不同類型對象的數組的想法是什麼?他們代表什麼?可能是你需要一個單獨的類,持有這些不同的對象...