加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 对同一类型的多个参数进行编译时方法调用验证

发布时间:2020-12-15 08:46:49 所属栏目:百科 来源:网络整理
导读:以下是问题的演示: 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 recogn
以下是问题的演示:
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 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);

这不应该给代码带来任何开销,而是大量的输入.包装更好,因为它完成一次(创建新类型很容易),但它可能有开销.

解决方法

如果两个参数属于同一类型,则无法在编译时,运行时或其他方式检测到参数变量的名称对应于参数的名称.这是一个悬而未决的问题,但我会给你一些想法.

>正如Mehrzad建议的那样,考虑按某种类型对参数进行分组.例如,考虑双倍距离(点p1,点p2),而不是双倍距离(双倍x1,双倍y1,双倍x2,双倍y2).
>通常,如果您的方法有超过4-5个参数,请考虑重构.也许你的方法试图做太多的事情,逻辑可以划分?
>如果您真正想要做的是执行一些检查,例如确保< b,考虑查看Code contracts.您也可以使用Debug.Assert(),但这仅适用于运行时.>我不建议您提出的那种隐式转换.对我来说,除了编译时检查参数之外,A a = 1.1应该没有语义目的,这让人感觉很乱,而且不直观.您的最终目标是使代码整体更易于维护.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读