首页 >后端开发 >C++ >C#和.NET中存在哪些意外行为和角案件?

C#和.NET中存在哪些意外行为和角案件?

Susan Sarandon
Susan Sarandon原创
2025-01-24 17:56:10310浏览

What Unexpected Behaviors and Corner Cases Exist in C# and .NET?

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() 令人惊讶的是,此代码可能会失败。通过使用拦截 call和返回的代理属性(例如

),可以违反断言。这证明了运行时行为和自定义属性之间意外相互作用的潜力。 这些示例强调了彻底测试的重要性以及对CLR内部工作的深刻理解,以避免C#和.NET开发中的意外陷阱。

以上是C#和.NET中存在哪些意外行为和角案件?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn