【问题标题】:Method to pass only accepted parameter values仅传递接受的参数值的方法
【发布时间】:2016-07-31 08:43:17
【问题描述】:

假设如下方法:

int ExtractMedian(int Statistic)
{
    return ExtractionWork;
}

是否可以通过使用ref 来强制Statistic 只接受像1, 3, 5 这样的奇数,但在传递后不检查值?

【问题讨论】:

  • 我看不出 ref 在这种情况下会有什么帮助。
  • “强制”是什么意思?如果消费者传递的是偶数,你想发生什么?
  • 嗯,通过使用ref,被调用的方法反映在调用方法中,所以我所说的“例如”实际上是一种类似于传递ref parameter的方式。跨度>
  • @YacoubMassad 类似于试图传递无效参数的无效方法。
  • 我不确定我是否理解。你想抛出异常还是想编译错误,或者究竟是什么?

标签: c# methods parameters parameter-passing


【解决方案1】:

是否可以强制Statistic 只接受像1, 3, 5 这样的奇数 例如使用ref,但在传递后不检查值?

不,我不这么认为。

我只是在方法的开头检查一下:

int ExtractMedian(int Statistic)
{
    if(Statistic % 2 == 0)
        throw new ArgumentException("Statistic must be odd");

    return ExtractionWork;
}

【讨论】:

    【解决方案2】:

    不,没有办法做到这一点。

    可以使用代码契约来强制执行此操作 - 但它们基本上是代码中的后处理步骤,然后分析器可以使用它来查看无效调用。它们不是完整的 .NET 功能的一部分。

    【讨论】:

      【解决方案3】:

      您必须在某处进行奇数或偶数检查,通常更好的做法是让函数负责检查其输入是否有效。

      话虽如此,如果这不是一个选项,您可以创建一个 Odd 类,其值只能是奇数。

      public class odd {
        int value;
        int get {return value;}
        void set{//check if odd before setting value;}
      }
      

      【讨论】:

      • 如果有的话,我建议使用一个包含 int 值的不可变结构。
      • 原谅我的无知,但为什么是不可变的?
      • 这里是short answer。对于长答案,您可能还想read this.
      【解决方案4】:

      您可以将参数声明为具有从 int 隐式转换的类并检查类中的值。

      public class OddValue  
      {  
          private int _value = 1;  
          public int Value  
          {  
              get  
              {  
                  return _value;  
              }  
      
              set
              {  
                  if (value % 2 == 0)  
                      throw new ArgumentOutOfRangeException();  
                  _value = value;  
              }  
          }  
      
          public OddValue(int value)  
          {  
              this.Value = value;  
          }  
      public static implicit operator OddValue(int value)  
          {  
              return new OddValue(value);  
          }  
      }  
      
      public static void test(OddValue value)  
          {  
      
          }  
      
      test(5);  
      

      【讨论】:

        猜你喜欢
        • 2013-12-04
        • 1970-01-01
        • 2015-01-24
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 2021-06-11
        • 2019-07-08
        • 1970-01-01
        相关资源
        最近更新 更多