我了解Categories in Objective-C,他们似乎真的类似到extension methods in .NET。Objective-C类和.NET扩展方法有什么不同?
是否有两个从一种语言移动到另一个时,可能会导致问题之间的细微差异或陷阱,或者是他们的所有意图和目的,相同的概念?
我了解Categories in Objective-C,他们似乎真的类似到extension methods in .NET。Objective-C类和.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中类别的理解模块化了一些语法差异一致。 – 2011-04-05 19:25:06