【发布时间】:2015-05-07 10:25:19
【问题描述】:
这是问题的演示:
class Program
{
static double Func(double a, double b) { return a * 1000 + b * b; }
static void Main(string[] args)
{
var a = 1.1d;
var b = 2.2d;
Console.WriteLine(Func(a, b));
// this is the problem, function doesn't recognize when a and b
// "accidentally" exchanged, target is to make this row a compile-time error
Console.WriteLine(Func(b, a));
}
}
如果有许多参数的方法(例如double 类型的十个),这将成为一个问题:
double Func(double parameter1, double parameter2, ..., double parameter10);
问题:有没有办法在调用方法时验证参数,让程序员更不容易出错?
如果参数类型不同,这不是问题。我认为可能包装到新类型会有所帮助:
class A
{
private double _value;
public static implicit operator A(double value) { return new A() { _value = value }; }
public static implicit operator double(A value) { return value._value; }
}
class B
{
private double _value;
public static implicit operator B(double value) { return new B() { _value = value }; }
public static implicit operator double(B value) { return value._value; }
}
class Program
{
static double Func(A a, B b) { return a * 1000 + b * b; }
static void Main(string[] args)
{
A a = 1.1d;
B b = 2.2d;
Console.WriteLine(Func(a, b));
Console.WriteLine(Func(b, a)); // compile-time error! yay!
Console.WriteLine(Func(a, b) + 123.123d - a * 2); // implicit conversion power
Console.ReadKey();
}
}
确实如此,但我不确定这种方法是否有效。我怀疑这是否是一个好主意。是吗?还是有更好的?
我知道如果我总是调用这样的方法(使用named arguments 方法调用)我可以绝对安全
Func(a:a, b:b);
这不应该带来任何代码开销,但需要大量输入。包装更好,因为它只完成一次(创建新类型很容易),但它可能有开销。
【问题讨论】:
-
如果你有十个参数,你可以将每组相关参数包装在一个类型中,你考虑过吗?
-
可能确保您不会给出错误参数的唯一方法是为 each 参数设置不同的类型,并且从不在它们的参数中使用它们展开的形式。它将主要关闭一种可能的犯错途径。无论是不是现实的方法,是否真的能提高单行缺陷率和整个程序的可维护性,都是another question。
-
@MehrzadChehraz,好主意。听起来像是给我的答案,我只需要考虑一下,给我一些时间。
标签: c# methods compiler-errors