使用对象类型作为参数

mat*_*att 1 c# parameters methods object

我一直想知道这个问题:您是否支持在方法中仅使用对象作为参数?我这样做的原因是超载.目前,我试图创建一个迎合许多不同的数据类型的方法: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
        // ...
}
Run Code Online (Sandbox Code Playgroud)

你觉得这样的方法怎么样?它会产生不必要的开销吗?(在类型检查期间)你实现了吗?告诉我...

编辑:是的,只是一个旁注,我有点熟悉超载.但是当有超过10次超载时会有点恼人......

Cri*_*ole 9

是的,那会有用.然而,有更好的方法来做到这一点.

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

public void GenericMethod(string val)
{
        // process as string
}
public void GenericMethod(decimal val)
{
    // process as decimal
}
Run Code Online (Sandbox Code Playgroud)

等等

每当你is在代码中使用一个关键字时,你可能会忘记使用一些重要的OO原则:重载,子类等.

实际上,过载实际上并不令人讨厌,只是为了编写. 记住,你今天不是为自己编写代码,你需要在三个月后为自己编写代码,这时你必须阅读代码并弄清楚为什么你这样做了,或者在世界上那个bug到来的地方从.

避免"开启类型"技术的另一个原因是为了与.NET框架保持一致(因此也符合人们的期望).跟随Console.Write以及在给定类内部和下面重写的其他各种方法.


Jon*_*eet 7

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

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

如果你真的可以接受任何类型,并且你将以一种众所周知的方式处理一种非特别支持的类型,那么可以接受object.这就是LINQ to XML所做的事情,结果是一个非常干净的API.我会做得很小心,虽然-这是很少是个好主意.

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