我一直在想这个问题:您是否支持在方法中仅使用对象作为参数?我这样做的原因是超载。目前,我正在尝试创建一个迎合许多不同数据类型的方法: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次重载时会有点恼人......
答案 0 :(得分:9)
是的,那会有用。但是有更好的方法可以做到这一点。
您最好的选择是使用重载:
public void GenericMethod(string val)
{
// process as string
}
public void GenericMethod(decimal val)
{
// process as decimal
}
等
每当你在代码中使用is
关键字时,这是一个巨大的提示,你可能忘记使用一些重要的O.O.原则:重载,子类等。
过载实际上并不令人烦恼,只是写作。 请记住,你今天不是为自己编写这个,你从现在开始三个月就为自己编码了当你必须阅读代码并弄清楚为什么你这么做时,或者臭虫来自世界的哪个地方。
避免“切换类型”技术的另一个原因是为了与.NET框架保持一致(因此也符合人们的期望)。遵循Console.Write
以及在给定类内和下覆盖的其他各种方法。
答案 1 :(得分:7)
我一直想知道这个问题:您是否支持在方法中仅使用对象作为参数?
很少。如果有一组固定的类型被正确支持 - 否则你会抛出异常 - 然后我会使用重载。
如果您实际上可以接受任何类型,并且您将以一种众所周知的方式处理非特别支持的类型,那么可以接受object
。这就是LINQ to XML所做的事情,结果是一个非常干净的API。我会非常谨慎地做到这一点 - 很少 这是一个好主意。
是的,有一个开销。我通常不会把这个作为决定的依据 - 在大多数情况下,开销会小到可以忽略不计。尽可能干净地设计您的API,然后确定它是否会导致瓶颈。
答案 2 :(得分:3)
是的,它会导致类型检查和装箱/取消装箱值类型的开销。我会推荐重载。
另一种可能性,只要你没有用数字进行大量数学计算,就会使它成为一种通用方法。算术在泛型方面相当困难,因为对于允许使用运算符的值类型没有约束。
答案 3 :(得分:3)
不需要那些!
只需声明任意多个具有相同名称的方法,并在每个方法中将每个类型作为参数。[这称为重载。例如您可能已经在方法旁边看到了+1 Overloads
,这意味着还有一个方法具有相同的名称但具有不同的参数类型]
这样说:
void Method(decimal d)
{
//Process Decimal
}
void Method(string s)
{
//Process String
}
默认情况下,它会根据Type找到自己的方法。
答案 4 :(得分: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.
在某些情况下,这种方法更有意义。
答案 5 :(得分: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
}