C# 使用对象类型作为参数

C# 使用对象类型作为参数,c#,object,methods,parameters,C#,Object,Methods,Parameters,我一直在想:您是否支持在方法中仅使用对象作为参数?我这样做的原因是过载。目前,我正在尝试创建一种适合多种不同数据类型的方法:string、decimal、DateTime。。。这个名单还有很多 不过现在有点乱了,所以我想做下面的事情 public void GenericMethod(object val) { if (val is string) // process as string else if (val is decimal) // p

我一直在想:您是否支持在方法中仅使用对象作为参数?我这样做的原因是过载。目前,我正在尝试创建一种适合多种不同数据类型的方法:
string
decimal
DateTime
。。。这个名单还有很多

不过现在有点乱了,所以我想做下面的事情

public void GenericMethod(object val)
{
    if (val is string)
        // process as string
    else if (val is decimal)
        // process as decimal
    else if (val is DateTime)
        // do something for dt
    else
        // ...
}
你认为这种方法怎么样?它会招致不必要的开销吗?(在类型检查期间)您是否实施了它?告诉我


编辑:是的,还有一个旁注,我对重载有点熟悉。但是当有超过10个过载时,它会变得有点烦人…

是的,这会起作用。然而,有更好的方法可以做到这一点

最好使用重载:

public void GenericMethod(string val)
{
        // process as string
}
public void GenericMethod(decimal val)
{
    // process as decimal
}
等等

每当您在代码中使用
is
关键字时,这就意味着您可能忘记使用一些重要的O.O.原则:重载、子类等

重载实际上并不是那么烦人,只是为了编写记住,你今天不是为自己编写代码,你是为三个月后的自己编写的当你必须阅读代码并弄清楚为什么要这样做,或者这个错误是从哪里来的


避免使用“打开类型”技术的另一个原因是与.NET框架的一致性(以及人们的期望)。遵循Console。编写以及在给定类内和给定类下重写的其他各种方法。

是的,这会起作用。然而,有更好的方法可以做到这一点

最好使用重载:

public void GenericMethod(string val)
{
        // process as string
}
public void GenericMethod(decimal val)
{
    // process as decimal
}
等等

每当您在代码中使用
is
关键字时,这就意味着您可能忘记使用一些重要的O.O.原则:重载、子类等

重载实际上并不是那么烦人,只是为了编写记住,你今天不是为自己编写代码,你是为三个月后的自己编写的当你必须阅读代码并弄清楚为什么要这样做,或者这个错误是从哪里来的


避免使用“打开类型”技术的另一个原因是与.NET框架的一致性(以及人们的期望)。遵循
控制台。编写
以及在给定类内和下重写的其他多种方法。

是的,这将导致类型检查和装箱/取消装箱值类型的开销。我建议使用重载


另一种可能性是,只要你没有对这个数字做太多的数学运算,就把它变成一个通用的方法。但是,对于泛型来说,算术是相当困难的,因为没有允许使用运算符的值类型的约束。

是的,这将导致类型检查和装箱/取消装箱值类型的开销。我建议使用重载

另一种可能性是,只要你没有对这个数字做太多的数学运算,就把它变成一个通用的方法。不过,算术对于泛型来说相当困难,因为没有允许使用运算符的值类型约束

我一直在想:您是否支持在方法中仅使用对象作为参数

很少。如果有一组固定的类型得到了正确的支持——否则会抛出一个异常——那么我会使用重载

如果您实际上可以接受任何类型,并且您将以某种众所周知的方式处理不受特别支持的类型,那么接受
对象就可以了。这就是LINQtoXML所做的,结果是一个非常干净的API。不过,我会非常小心地做——这很少是个好主意

是的,会有一个开销。不过,我通常不会把这作为决策的基础——在大多数情况下,开销会小到可以忽略不计。尽可能干净地设计API,然后确定它是否会导致瓶颈

我一直在想:您是否支持在方法中仅使用对象作为参数

很少。如果有一组固定的类型得到了正确的支持——否则会抛出一个异常——那么我会使用重载

如果您实际上可以接受任何类型,并且您将以某种众所周知的方式处理不受特别支持的类型,那么接受
对象就可以了。这就是LINQtoXML所做的,结果是一个非常干净的API。不过,我会非常小心地做——这很少是个好主意


是的,会有一个开销。不过,我通常不会把这作为决策的基础——在大多数情况下,开销会小到可以忽略不计。尽可能干净地设计API,然后确定它是否会造成瓶颈。

在某些情况下,您的方法是有意义的。我以前使用过它,大多数情况下,当我有一系列处理时,它们对于不同的数据类型是相同的

但这并不是超载。重载是为相同的方法名定义不同的签名,如下所示:

public void GenericMethod(string val)
{
    // process as string
}

public void GenericMethod(decimal val)
{
    // process as decimal
}

public void GenericMethod(DateTime val)
{
    // do something for dt
}

// Etc.

在某些情况下,这种方法更有意义。

有些情况下,您的方法是有意义的。我以前使用过它,大多数情况下,当我有一系列处理时,它们对于不同的数据类型是相同的

但这并不是超载。重载是为相同的方法名定义不同的签名,如下所示:

public void GenericMethod(string val)
{
    // process as string
}

public void GenericMethod(decimal val)
{
    // process as decimal
}

public void GenericMethod(DateTime val)
{
    // do something for dt
}

// Etc.

在某些情况下,这种方法更有意义。

实现多个重载,其中一个重载采用
对象
。以
Console.WriteLine
重载为例。但是,请注意,例如int可能与double冲突:

int sum(int i, int j)
{
 return i + j;
}

double sum(double i, double j)
{
 return i + j;
}

object sum(object i, object j)
{
  return i.ToString() + j.ToString();
}

==============================

static void Main()
{
   sum(1, 2); // Error: ambigous call between `int` and `double` versions
   sum(1.0, 2.0); // calls double version, although 1.0 and 2.0 are objects too
   sum("Hello", "World"); // object
}

实现许多重载,其中一个需要
object