假设我有以下对象:
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
}
}
它的丑陋和非表现,是否有更好的方式使用泛型或任何其他方式?
答案 0 :(得分: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
}
}
这样你开始封装你的数据并确保它靠近使用它们的逻辑。更好的方法可能是将属性设置为私有只读字段,因此它们甚至不可见于外部。
答案 1 :(得分:0)
您可以尝试在C#4.0及更高版本中使用动态关键字,看看它是否对您有所帮助。最好定义自己的类并创建不同类型的属性,而只是使用它们。
内存开销很小,你可以避免所有的拳击惩罚。
答案 2 :(得分:0)
IMO,在这种情况下,人们应该问一个问题:代码设计有什么问题吗?包含不同类型对象的数组的概念是什么?它们代表什么?可能你需要一个单独的类来保存这些不同的对象......