簡體   English   中英

如何避免裝箱和 if 或 Switch 語句

[英]How to avoid boxing and if or Switch statements

假設我有以下對象:

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
   }

}

好吧,它既丑陋又無性能,是否有更好的方法可以使用泛型或任何其他方式?

您的值已經裝箱,因為它們存儲在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
    }
}

這樣你就開始封裝你的數據並確保它靠近使用它們的邏輯。 更好的方法是將屬性設置為私有只讀字段,這樣它們甚至對外不可見。

您可以嘗試在 C# 4.0 及更高版本中使用 dynamic 關鍵字,看看是否對您有幫助。 最好定義自己的類並創建不同類型的屬性,然后使用它們。

內存開銷將是最小的,您將避免所有拳擊懲罰。

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

暫無
暫無

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

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