虽然我当然不会通常检查this
无效性,但它是可能的,没有任何实际的内存肮脏 - 只是一点反思:
using System;
public class Test
{
public void CheckThisForNullity()
{
Console.WriteLine("Is this null? {0}", this == null);
}
static void Main(string[] args)
{
var method = typeof(Test).GetMethod("CheckThisForNullity");
var openDelegate = (Action<Test>) Delegate.CreateDelegate(
typeof(Action<Test>), method);
openDelegate(null);
}
}
或者,生成使用call
而不是callvirt
调用空目标上的实例方法的 IL。完全合法,只是 C# 编译器通常不会这样做。
这与定稿无关,定稿本身就是毛茸茸的,但方式不同。如果 CLR 可以证明您不会使用实例中的任何字段(我强烈希望包含this
引用),那么终结器可能会在实例方法执行时运行。
至于提供的代码 - 不,这看起来只是一个错误。我会将其重写为:
public override bool Equals(object other)
{
return Equals(other as MyType);
}
public bool Equals(MyType other)
{
if (ReferenceEquals(other, null))
{
return false;
}
// Now perform the equality check
}
...假设这MyType
是一个类,而不是一个结构。请注意我如何使用另一个具有正确参数类型的公共方法 - 我将IEquatable<MyType>
同时实现。