2

MSDNの例は、コンパイル時のエラーにすぎません。

@JonSkeetがhttps://stackoverflow.com/a/263416/360211で答えを使用しているのを見るだけで、コンパイル時だけなのかどうかわかりません。

    static void Main()
    {
        const int x = 4;
        int y = int.MaxValue;
        int z = x*y;
        Console.WriteLine(z);
        Console.ReadLine();
    }

これ-4と同じように、を生成します。

    static void Main()
    {
        unchecked
        {
            const int x = 4;
            const int y = int.MaxValue;
            int z = x*y; // without unchecked, this is compile error
            Console.WriteLine(z);
            Console.ReadLine();
        }
    }

これはランタイムをスローします:

    static void Main()
    {
        checked
        {
            const int x = 4;
            int y = int.MaxValue;
            int z = x*y; //run time error, can checked be set system wide?
            Console.WriteLine(z);
            Console.ReadLine();
        }
    }

では、Jonはこれを行っているのは、システム全体、コンパイラフラグ、またはその他の方法で設定できるからですか?

4

3 に答える 3

1

絶対違う。操作がオーバーフローした場合に、実行時に例外(OverflowException)をスローするかどうかを決定します。

たとえば、Noda Timeでは、ほとんどすべての演算をチェックされたコンテキストで実行します(これはプロジェクトのデフォルトです)。ただし、ハッシュコードの場合、ハッシュコードの計算がオーバーフローしても問題ないため、常にuncheckedブロックを使用します。値の大きさは実際には重要ではありません。オーバーフローは正確さに影響しません。

コンパイル時に、定数値が関係しているためにオーバーフローすることをコンパイラーが認識できる操作にのみ関連します。

詳細については、C#4仕様のセクション7.6.12を参照してください。

于 2012-11-16T15:58:14.763 に答える
1

操作がブロック内にあるかどうかはcheckedunchecked値が実際に計算されるときに実行されます。2 つの変数を乗算/加算する場合、コンパイル時にはわからないため、ほとんどの場合、実行時に行われます。

あなたの例では、2 つの変数は両方とも定数です。これは、コンパイル時のリテラル間の計算の結果をコンパイル時に実行できることを意味します (これはそうです)。結果はコンパイル時に計算され、uncheckedブロック内にないため、エラーなしで結果を計算することはできません。これは、チェックされた/チェックされていないブロックが一般にコンパイル時のチェックであることを意味するものではありません。彼らはめったにそうではありません。

そして、はい、コード ベース全体がチェックされた/チェックされていないコンテキストにあるかどうかについて、プロジェクトのプロパティを変更することが可能です。ライブラリを作成している場合は、いずれかのコンテキスト内からメソッドを呼び出すこともできます。そのため、チェックされたコンテキストまたはチェックされていないコンテキストで実行する必要があるコード ブロックがある場合は、現在のプロジェクト設定がそのメソッドに対して正しい場合でも、そのようなブロックを追加することをお勧めします。また、「このメソッドは整数オーバーフローに依存している」対「このメソッドは決してオーバーフローしてはならない」というスニペットの意図を将来の読者に明確にしています。

于 2012-11-16T16:00:51.883 に答える
0

checkedどちらにも、またはuncheckedコードのデフォルトの動作を設定するには、次のようにします。

プロジェクト プロパティ -> ビルド -> 詳細設定 -> 算術オーバーフロー/アンダーフローのチェック

新しいプロジェクトのデフォルトはオフです。そのためunchecked、実行時の影響はないと思いました。

于 2012-11-16T16:09:03.183 に答える