揭示出人意料的: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>
,表明True
和x
参考同一对象。 这是由于优化而引起的:创建一个空字符串重复了一个缓存的实例。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()
>。这是因为虽然虚拟方法被覆盖了,但NullReferenceException
GetType()
却没有并在盒装无效的值上操作,可能导致无效引用。
>最后,让我们检查使用类类型的通用约束:
<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
>,但可以使用涉及返回
以上是在 C# 和 .NET 极端情况下您会遇到哪些令人惊讶的行为?的详细内容。更多信息请关注PHP中文网其他相关文章!