我正在了解Categories in Objective-C,他们似乎真的与extension methods in .NET相似。
在从一种语言转移到另一种语言时,两者之间是否存在任何微妙的差异或陷阱,或者它们是否与所有意图和目的相同?
答案 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
}