使用对象类型作为参数

本文关键字:参数 类型 对象 | 更新日期: 2023-09-27 18:35:10

我一直在想这个问题:您是否支持在方法中仅使用对象作为参数?我这样做的原因是超载。目前,我正在尝试创建一种迎合许多不同数据类型的方法:stringdecimalDateTime......这样的例子不胜枚举。

不过有点乱,所以我正在考虑执行以下操作

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.Write和给定类内和下重写的其他各种方法。

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

很少。如果有一组固定的类型得到适当的支持 - 否则你会抛出异常 - 那么我会使用重载。

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

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

是的,类型检查和值类型的装箱/取消装箱都会产生开销。我会推荐重载。

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

不需要这些!

只需声明任意数量的同名方法,并将每种类型作为每个方法中的参数。[这称为重载,例如,您可能已经看到+1 Overloads在方法旁边,这意味着还有 1 个具有相同名称但参数类型不同的方法]

这样说:

void Method(decimal d)
{
    //Process Decimal
}
void Method(string s)
{
    //Process String
}

默认情况下,它将根据类型找到自己的方法。

在某些情况下,您的方法是有意义的。我以前用过它,主要是当我有一堆对不同数据类型相同的处理时。

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

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.

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

实现许多重载需要其中一个object没有问题。例如,看看Console.WriteLine重载。http://msdn.microsoft.com/en-us/library/system.console.writeline.aspx 但是,请注意,例如 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
}