Sin*_*atr 6 c# methods compiler-errors
以下是问题的演示:
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));
}
}
Run Code Online (Sandbox Code Playgroud)
如果存在具有许多参数的方法(例如十种double类型),这将成为一个问题:
double Func(double parameter1, double parameter2, ..., double parameter10);
Run Code Online (Sandbox Code Playgroud)
问题:有没有办法在调用方法时验证参数,这样程序员不太容易出错?
如果参数类型不同,这不是问题.我认为包装成新类型的东西会有所帮助:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
它确实如此,但我不确定这种方法是否有效.我怀疑这是不是一个好主意.是吗?还是有更好的一个?
如果我总是调用这样的方法(使用命名参数方法调用),我知道我绝对安全
Func(a:a, b:b);
Run Code Online (Sandbox Code Playgroud)
这不应该给代码带来任何开销,而是大量的输入.包装更好,因为它完成一次(创建新类型很容易),但它可能有开销.
如果两个参数的类型相同,则无法在编译时、运行时或其他方式检测参数变量的名称是否与形参的名称相对应。这是一个悬而未决的问题,但我将为您提供一些想法。
正如 Mehrzad 建议的那样,考虑按某种类型对参数进行分组。例如,代替double Distance(double x1, double y1, double x2, double y2),考虑double Distance(Point p1, Point p2)
一般来说,如果您的方法有超过 4-5 个参数,请考虑重构。也许你的方法试图做太多事情并且逻辑可以划分?
如果您真正想要做的是执行一些检查(例如确保这一点)a < b,请考虑查看代码契约。您也可以使用Debug.Assert(),但这仅在运行时有效。
我不会推荐您建议的那种隐式转换。A a = 1.1对我来说,除了编译时检查参数之外,不应该有任何语义目的,这感觉很老套且不直观。您的最终目标是使代码总体上更易于维护。
| 归档时间: |
|
| 查看次数: |
224 次 |
| 最近记录: |