1

我一直在想:您是否支持在您的方法中仅使用一个对象作为参数?我这样做的原因是超载。目前,我正在尝试创建一种适合许多不同数据类型的方法: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 个重载时,它会变得有点烦人......

4

6 回答 6

9

是的,那会奏效。但是,有更好的方法可以做到这一点。

你最好的选择是使用重载:

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

等等

每当您在代码中使用is关键字时,这都是一个巨大的暗示,您可能忘记使用一些重要的 OO 原则:重载、子类等。

重载实际上并没有那么烦人,只是为了编写。 请记住,您今天不是为自己编写代码,而是在三个月后为自己编写代码,那时您必须阅读代码并弄清楚您为什么要这样做,或者这个错误来自世界的哪个地方从。

避免“切换类型”技术的另一个原因是为了与 .NET 框架(以及人们的期望)保持一致。FollowConsole.Write以及在给定类内部和之下覆盖的其他多种方法。

于 2012-05-22T16:42:55.600 回答
7

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

非常稀有。如果有一组正确支持的固定类型——否则你会抛出异常——那么我会使用重载。

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

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

于 2012-05-22T16:44:26.097 回答
3

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

另一种可能性是,只要您不对数字进行大量数学运算,就可以将其设为通用方法。但是,使用泛型进行算术运算相当困难,因为值类型没有限制可以使用运算符。

于 2012-05-22T16:42:55.437 回答
3

不需要那些!

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

像这样说:

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

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

于 2012-05-22T16:46:46.300 回答
1

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

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

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.

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

于 2012-05-22T16:44:36.300 回答
0

实现其中之一的许多重载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
}
于 2012-05-22T16:45:10.573 回答