2016-04-10 5 views
3

値?法が通過するだけ受け付けパラメータは、以下の方法を想定し

+1

この状況でどのようにrefが役立つかはわかりません。 –

+0

「力」とはどういう意味ですか?消費者が偶数を渡した場合、あなたは何をしたいですか? –

+1

さて、 'ref'を使うことで、呼び出されたメソッドは呼び出し元のメソッドに反映されます。したがって、実際には"例えば "によって意味されるものは、' refパラメータ 'を渡すのと似た方法です。 – Explisam

答えて

8

それは、例えば、それが渡された後の値をチェックせずにrefを使用して1, 3, 5 などの奇数のみを受け入れるようにStatisticを強制することは可能ですか?

いいえ、私はそうは思わない。

私は単にメソッドの開始時にチェックします:

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

    return ExtractionWork; 
} 
1

いいえ、それをする方法はありません。

コード契約はこれを強制するために使用する必要がありますが、基本的にコードの後処理ステップであり、その後アナライザが無効な呼び出しを参照することがあります。これらは、.NETの統合機能の一部ではありません。

1

どこかで奇数または偶数のチェックを行う必要があります。通常は、入力が有効であることを確認するために関数の責任にする方がよいでしょう。

これがオプションでない場合は、値が奇数にしかならないOddクラスを作成することができます。

+0

もしあれば、私はint値を含む不変の構造体を提案します。 –

+0

私の無知を言い訳が、なぜ不変ですか? – ToxicTeacakes

+2

ここには[短い答え](http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil)です。長い答えのために、[これを読んでみたいです。](http://stackoverflow.com/questions/3751911/why-are-c-sharp-structs-immutable) –

0

引数は、クラスのint値とcheck値からの暗黙的な変換を持つクラスとして宣言できます。

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); 
関連する問題