c# - 为什么覆盖方法与不覆盖方法不完全相同?

标签 c# xamarin xamarin.ios overriding

所以我在我的 Xamarin 项目中工作时遇到了这个小“功能”:

public override void Draw(CGRect rect)
{
    base.Draw(rect);
}

在 View 的位置绘制一个黑框(这与问题无关)。

而这段代码:

//public override void Draw(CGRect rect)
//{
//    base.Draw(rect);
//}

绘制一个透明框(同样,该方法的确切结果与问题无关)。

现在我想知道(在 C# 级别)这两种实现有何不同。在我看来,这两段代码在功能上是相同的,但它们显然不同,因为它们会导致两种不同的结果。

这是怎么回事?

最佳答案

从纯 C# 的角度来看,这两种方法应该在 99.9999% 的时间内表现相同。调用者可以确定某个方法是否被覆盖,并执行不同的代码路径,但这很麻烦,而且人们在 C# 中做不到这一点。

但是在 Objective-C 中,在调用方法之前检查方法是否已实现要容易得多(实际上是一种常见的习惯用法)。

这意味着如果 Objective-C 做这样的事情:

if ([obj respondsToSelector: @selector (drawRect:)])
    [obj drawRect: theRect];
else
    [obj doSomethingElse];

您最终会得到您所看到的行为(因为第一种情况最终会出现在您的重写代码中)。

关于c# - 为什么覆盖方法与不覆盖方法不完全相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34069186/

相关文章:

C# 我有 50 多个 else if 卡片语句,有没有办法让它更短或一次性完成?

c# - 通过转换 (ChildClass)parentObject 调用子构造函数;跟踪修订

c# - Winform标签控件文本变化的地方

适用于 Web 和移动应用程序的 Azure AD 与 Azure AD B2C

c# - 在 Xamarin.iOS 中阅读 Parse.com 推送负载

c# - 如何将焦点设置到已经处于运行状态的应用程序?

ios - Xamarin.iOS在生成MessagingRemoteException,DirectoryNotFoundException时出错

c# - 如何将 AlertDialog 与 mvvmcross 集成

xaml - ListView 在 iOS 上无法正确显示

c# - MonoTouch 异常 : Selector invoked from objective-c on a managed object of type that has been GC'ed