52

C++ には、コンパイルはできるが未定義の動作をもたらすコードを作成する方法がたくさんあります(Wikipedia)。C#に似たようなものはありますか? コンパイルはできるが未定義の動作をするコードを C# で記述できますか?

4

7 に答える 7

33

はい!安全なコンテキストでもあります!(まあ、少なくとも未定義であると定義された実装です)

これは、 Roslyn issuesの Marek Safar と VSadov からのものです。に関して、C# と CLI の間に不一致がありますbool

C#trueでは、 は 1 種類しかなく、 も1 種類しかないと考えられていfalseます。

CLI はfalse0 を含むバイトであると認識し、他のすべての値はtrue.

この不一致は、 C# に(わずかに) 興味深いことを強制できることを意味します。

//non-standard bool
//We're setting a bool's value to a byte value of 5.
var a = new bool[1];
Buffer.SetByte(a, 0, 5);

//non-standard bool
//We're setting a bool's value to a byte value of 10.
var b = new bool[1];
Buffer.SetByte(b, 0, 10);

//Both are true.
Console.WriteLine(a[0]);
Console.WriteLine(b[0]);

//But they are not the same true.
Console.WriteLine(a[0] == b[0]);

上記の出力:

true

true

false

興味深いことに、デバッガーは同意しません (真実を異なる方法で評価する必要がありますか?)

ここに画像の説明を入力

とにかく、C# チームが到達したと思われる結論は次のとおりです (強調を追加)。

IE 言語は、非標準の bool についてはまったく気にしません。特定の実装 (CIL 上の MS C# など) は、非標準ブール値の存在を認識し、それらの動作を未定義として指定します。

于 2014-10-03T05:28:31.787 に答える
12

ウィキペディアの未定義の動作に関する記事を見ると、未定義の動作が発生する状況は許可されていないか、C# で例外がスローされます。

ただし、Unsafe コードでは、ポインターなどを使用できるため、未定義の動作が可能であると私は信じています。

編集:私が正しいようです:http://msdn.microsoft.com/en-us/library/aa664771%28VS.71%29.aspx

C#で未定義の動作の例があります

于 2009-12-07T15:17:14.737 に答える
11

ECMA-334ドキュメント(p。473)によると:

安全でない修飾子の出現を含まないプログラムは、未定義の動作を示すことはできません。

これにより、「実装定義」が最悪の場合に促進されます。EricLippertの回答を参照してください。

于 2009-12-07T22:11:48.233 に答える
1

多くのサブプログラムには、次のように要約できる要件があります。

  1. 有効なデータを指定すると、有効な出力が生成されます。

  2. たとえ無効な情報が与えられたとしても、核ミサイルを発射したり、時間と因果関係の法則を否定したりすることは控えてください。

Java 言語と .NET 言語の主な設計目標の 1 つは、「安全でない」とマークされている特定の言語をコードで使用しない限り、通常、上記の 2 番目の制約を満たすために特に努力する必要がないことです [ただし、ガベージ コレクションとFinalize時間/因果関係の観点からは少し奇妙かもしれませんが、それらは因果関係の完全な取り消しではなく、通常の因果関係のルールの例外として説明できます]。この状況は、多くの種類のデータ依存エラー (整数オーバーフローなど) が原因で、オーバーフローを回避するために必要な仮定を行うなど、任意の方法でコンパイラが動作する可能性がある C の状況とは大きく異なります。ハイパーモダンな C 哲学で奨励されている本当に恐ろしい種類の未定義の動作は、「安全でない」ブロックの外側にある C# やその他の .NET 言語には存在しません。

于 2015-06-22T20:20:21.470 に答える
0

正確にはWikiの意味ではありませんが、頭に浮かぶ最も明白な例は、単純にスレッド化されたコードを書くことだと思いますが、それはどの言語でも同じです.

于 2009-12-07T15:19:40.440 に答える