首页 > 后端开发 > C++ > 在 C# 和 .NET 极端情况下您会遇到哪些令人惊讶的行为?

在 C# 和 .NET 极端情况下您会遇到哪些令人惊讶的行为?

Susan Sarandon
发布: 2025-01-24 18:07:10
原创
476 人浏览过

What Surprising Behaviors Can You Encounter with C# and .NET Corner Cases?

揭示出人意料的:c#和.net Corner case

>

>软件开发通常会带来令人惊讶的曲折。 本文探讨了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)); // Outputs True</code>
登录后复制
这个令人惊讶的是输出

,表明Truex参考同一对象。 这是由于优化而引起的:创建一个空字符串重复了一个缓存的实例。> y接下来,考虑可无效的类型的怪癖:>

<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
    Console.WriteLine(t.GetType()); // Throws NullReferenceException
}</code>
登录后复制

ToString()GetHashCode()对无效类型(例如Equals())的预期表现,呼叫int?>抛出GetType()>。这是因为虽然虚拟方法被覆盖了,但NullReferenceExceptionGetType()却没有并在盒装无效的值上操作,可能导致无效引用。

>最后,让我们检查使用类类型的通用约束:

<code class="language-csharp">private static void Main() {
    CanThisHappen<MyFunnyType>();
}

public static void CanThisHappen<T>() where T : class, new() {
    var instance = new T(); // new() on a ref-type; should be non-null, then
    Debug.Assert(instance != null, "How did we break the CLR?");
}</code>
登录后复制

>可能会期望一个非null实例的T>,但可以使用涉及返回调用的代理类的技术来规避这一点。这突出了CLR与托管代码的运行时行为之间的复杂交互。 这些示例表明,即使是看似直接的代码也可以在特定情况下表现出意外的行为,强调了彻底测试和理解C#和.NET的基本机制的重要性。

以上是在 C# 和 .NET 极端情况下您会遇到哪些令人惊讶的行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板