c#和.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
>通用类型和无效的new
:nullReferenceException Mystery
以下代码演示了另一种意外行为:
<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
时会发生aNullable<T>
。 这是因为int?
覆盖了大多数方法,但不是NullReferenceException
。 在致电非禁令GetType()
的拳击过程会导致无效的值。Nullable<T>
GetType()
代理属性和GetType()
约束:违抗期望
new()
令人惊讶的是,此代码可能会失败。通过使用拦截
以上是C#和.NET中存在哪些意外行为和角案件?的详细内容。更多信息请关注PHP中文网其他相关文章!