所以我在我的Xamarin项目中工作并遇到了这个小小的“功能”:
if (ModifierKeys == Keys.None) ...
在视图的位置绘制一个黑框(这与问题无关)。
这段代码:
public override void Draw(CGRect rect)
{
base.Draw(rect);
}
绘制一个透明框(同样,该方法的确切结果与问题无关)。
现在我想知道(在C#的层面上)这两个实现有何不同。根据我的理解,这2段代码在功能上是相同的,但它们显然不是,因为它们会导致2种不同的结果。
发生了什么事?
答案 0 :(得分:2)
从纯粹的C#角度来看,这两种方法在99.9999%的时间内的行为应该相同。调用者可以确定某个方法是否被覆盖,并执行不同的代码路径,但这很麻烦,而且不是人们在C#中做的事情。
然而,在Objective-C中,在调用方法之前检查方法是否更容易(实际上是一个常见的习语)。
这意味着如果Objective-C做了类似这样的事情:
if ([obj respondsToSelector: @selector (drawRect:)])
[obj drawRect: theRect];
else
[obj doSomethingElse];
你最终可能会看到你所看到的行为(因为第一个案例会以你的被覆盖的代码结束)。