Objective-C 类别和 .NET 扩展方法之间存在哪些差异?

发布于 2024-10-30 21:20:53 字数 397 浏览 5 评论 0 原文

我正在学习Objective-C 中的类别,它们看起来确实类似于.NET 中的扩展方法

两种语言之间是否存在任何细微的差异或陷阱,从一种语言迁移到另一种语言时可能会导致问题,或者它们在所有意图和目的上是否都是相同的概念?

I'm learning about Categories in Objective-C and they seem really similar to extension methods in .NET.

Are there any subtle differences or gotchas between the two that can cause problems when moving from one language to the other, or are they for all intents and purposes identical concepts?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

悍妇囚夫 2024-11-06 21:20:53

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

我倾向于尝试避免使用类别/扩展,因为它们可能会让人觉得您过于依赖内置类,而不是构建自己的数据结构来表示您的系统。

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

In my experience using the two concepts in C# and ObjC, I use the features for the same problems. Adding new instance or static methods to built-in types when subclassing either isn't allowed or ill advised.

I tend to try and avoid Categories/Extensions because they can be a code smell that you are relying on built-in classes too heavily instead of building your own data structures to represent your system.

With that said, I haven't run into any strange gotchas once you understand the syntactical differences.

帅气称霸 2024-11-06 21:20:53

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

In the .NET world, an extension method will be called even if the object instance is null. For example:

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!"
}

In the Objective-C world, instance methods defined in a category will not be called on an nil object instance.

@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
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文