[英]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.