Objective-C类和.NET扩展方法之间存在什么差异?

时间:2011-04-05 19:12:43

标签: .net objective-c extension-methods categories

我正在了解Categories in Objective-C,他们似乎真的extension methods in .NET相似。

在从一种语言转移到另一种语言时,两者之间是否存在任何微妙的差异或陷阱,或者它们是否与所有意图和目的相同?

2 个答案:

答案 0 :(得分:2)

根据我在C#和ObjC中使用这两个概念的经验,我使用这些功能来解决同样的问题。在不允许或不建议子类化时,向内置类型添加新实例或静态方法。

我倾向于尝试避免使用类别/扩展,因为它们可能是一种代码味道,您过分依赖内置类而不是构建自己的数据结构来代表您的系统。

话虽如此,一旦你理解了语法上的差异,我就没有碰到任何奇怪的陷阱。

答案 1 :(得分:2)

在.NET世界中,即使对象实例为null,也会调用扩展方法。例如:

public static class Extensions {
    public static string CountCharacters(this string inputString) {
        if (inputString == null) return "None!";
        return inputString.Length.ToString;
    }
}
public void TestExtension() {
    string testString = null;
    string result = testString.CountCharacters(); // returns "None!"
}

在Objective-C世界中,类别中定义的实例方法不会在nil对象实例上调用

@implementation NSString (CountCharacters)
    - (NSString *)countCharacters {
        if (self)
            return [self length];
        return @"None!";
    }
@end
-(void)testCategoryMethod {
    NSString *testString = nil;
    NSString *result = [testString countCharacters];
    // 'result' will remain nil
}