Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何避免装箱和if或Switch语句_C#_.net_Asp.net Mvc_C# 4.0_Generics - Fatal编程技术网

C# 如何避免装箱和if或Switch语句

C# 如何避免装箱和if或Switch语句,c#,.net,asp.net-mvc,c#-4.0,generics,C#,.net,Asp.net Mvc,C# 4.0,Generics,假设我有以下对象: object[] objs = new object[3]{ "this is sample string", 42L, 1}; 我想对数组中的单个对象做点什么,比如 foreach (object o in objs) { /// logic here mylogic(); } 现在,mylogic()将只接受对象参数,因此将进行装箱,但我们需要能够根据对象的类型执行某些操作,因此我们将执行以下操作: public void dosomething(

假设我有以下对象:

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
   }

}

嗯,这很难看而且没有性能,有没有更好的方法可以使用泛型或其他方法呢?

您可以尝试在C#4.0及更高版本中使用dynamic关键字,看看这是否对您有帮助。最好是定义自己的类,生成不同类型的属性,然后使用它们


内存开销将是最小的,您将避免所有的装箱惩罚。

在这种情况下,您应该问这样一个问题:代码设计有什么问题吗?数组包含不同类型的对象的想法是什么?它们代表什么?可能您需要一个单独的类来保存这些不同的对象…

您的值已经装箱,因为它们存储在
对象[]
中。因此,当您将它们传递给采用
对象
参数的方法时,不会发生额外的装箱

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
    }
}

这样,您就可以开始封装数据,并确保它位于使用它们的逻辑附近。更好的做法可能是将属性设置为私有只读字段,这样外部就看不到它们。

丑陋的开始于对象[]objs=new object[3]