c#and .net:隠された驚きを発表
ソフトウェア開発は、多くの場合、予期しない動作を明らかにします。 C#と.NETは強力ですが、例外ではありません。 この記事では、経験豊富な開発者でさえ挑戦できる興味深いコーナーケースを探ります。
文字列作成:直感に反する結果この一見シンプルなコードスニペットを考えてみましょう:
出力は
であり、<code class="language-csharp">string x = new string(new char[0]); string y = new string(new char[0]); Console.WriteLine(object.ReferenceEquals(x, y));</code>は参照型の個別のオブジェクトを作成するという期待と矛盾します。 共通言語ランタイム(CLR)は、この特定のシナリオを最適化し、同じ空の文字列インスタンスを再利用します。
True
ジェネリックタイプとnullablenew
:nullreferenceExceptionミステリー
次のコードは、別の予期しない動作を示しています
(例えば、
)の場合、<code class="language-csharp">static void Foo<T>() where T : new() { T t = new T(); Console.WriteLine(t.ToString()); // Works fine Console.WriteLine(t.GetHashCode()); // Works fine Console.WriteLine(t.Equals(t)); // Works fine // This throws a NullReferenceException... Console.WriteLine(t.GetType()); }</code>を呼び出すときに
が発生します。 これは、ほとんどの方法を無効にするが、T
ではないためです。 非頻繁にridenされていないNullable<T>
への呼び出し中のボクシングプロセスは、null値をもたらします。
int?
NullReferenceException
プロキシ属性とGetType()
制約:期待に反するNullable<T>
GetType()
GetType()
ayende rahienは、同様の、さらに洗練されたシナリオを強調しました:
このコードは、驚くべきことに、アサーションに失敗する可能性があります。 new()
呼び出しを傍受してを返すプロキシ属性(
以上がC#と.NETには、予期せぬ動作とコーナーケースが存在しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。