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

Objective-C类别和.NET扩展方法之间存在什么区别?,.net,objective-c,extension-methods,categories,.net,Objective C,Extension Methods,Categories,我正在学习,他们似乎真的很相似 在从一种语言到另一种语言的过程中,这两种语言之间是否存在可能导致问题的细微差异或缺陷,或者它们在所有意图和目的上都是相同的概念?根据我在C#和ObjC中使用这两个概念的经验,我使用这些特性来解决相同的问题。当不允许或不建议子类化时,向内置类型添加新实例或静态方法 我倾向于尝试避免类别/扩展,因为它们可能是一种代码味道,您过于依赖内置类,而不是构建自己的数据结构来表示您的系统 话虽如此,一旦您理解了语法差异,我就不会遇到任何奇怪的问题。在.NET世界中,即使对象实例

我正在学习,他们似乎真的很相似


在从一种语言到另一种语言的过程中,这两种语言之间是否存在可能导致问题的细微差异或缺陷,或者它们在所有意图和目的上都是相同的概念?

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

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


话虽如此,一旦您理解了语法差异,我就不会遇到任何奇怪的问题。

在.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
}

我不熟悉.NET中的扩展方法,但它们似乎与我对Objective-C模中的类别的理解一致,有些语法差异。