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