【问题标题】:Validate Parameters at compile-time?在编译时验证参数?
【发布时间】:2018-06-06 17:36:24
【问题描述】:

假设我有一个简单的函数:

public static int NewNumber(int lowestValue, int highiestValue) {}

我想让编译器检查参数是否正确。例如,在这种情况下,开发人员可能会错误地(或故意)像这样调用方法:

NewNumber(5, -5);

在这种情况下这是错误的 - 开发人员撒了谎。

当然我可以在方法内部做一个简单的检查:

 public static int NewNumber(int lowestValue, int highiestValue) {
       if (highiestValue <= lowestValue) {
           //Error
       }
   }

...它会完美地工作。但是,我很好奇开发人员在这种情况下是否可以做任何事情来限制这种行为,而无需额外检查方法本身。

编辑:找到了解决方案,但与 C# 无关

由于我在 Unity 中工作,我最终编写了自定义检查器,以便可以在 Unity Inspector 本身中正确输入值,从而在每秒多次调用该方法时消除不必要的检查(并降低性能)。

【问题讨论】:

  • 你看过这个问题吗? stackoverflow.com/questions/6510171/…
  • The developer lied 哈哈
  • 你无法真正阻止开发人员撒谎。我们很擅长。
  • 编译器现在应该解释变量名的含义吗?
  • @LarsTech 为什么不呢?如果函数每秒被调用 40、50、60 次或更多次,如果参数值从不改变,则所有变量检查都是完全不必要的。如果可以以不同的方式处理,为什么会浪费宝贵的 CPU 时间?而且我不是在谈论上述案例中的简单检查。

标签: c#


【解决方案1】:

我不相信这是可能的。考虑一下这种情况,

NewNumber(x, y);

xy 是什么?编译器不一定知道输入是什么(例如x = Int32.Parse(Console.ReadLine());)。

你给出了硬编码的例子,也许你可能只使用硬编码值的函数,但编译器只知道5-5是整数,整数可以是文字5, -5, etc或a变量var a = 5;

【讨论】:

  • 是的。但是,我仍在学习,我想也许可以在使用“where”关键字或其他东西将参数传递给方法时完成(比如使用泛型传递正确的数据类型时)。也许这首先是一个愚蠢的问题,但值得一试。谢谢。
  • 没问题,有些人忘记了他们曾经也是初学者。我认为你质疑做事的方式而不是把其他人的代码看成表面上的价值是很好的。在这种情况下,如果 high 小于 low ,最好只抛出一个异常。对于其他阅读您的代码的人来说也是最容易遵循的。
【解决方案2】:

我认为没有编译器相关的参数参数检查。但是最好在你的方法中检查你的参数(你的方法负责处理参数)并更好地记录它,这样调用者就知道它应该将哪些数据传递给你的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    相关资源
    最近更新 更多