Какие различия существуют между категориями Objective-C и методами расширения .NET? - PullRequest
3 голосов
/ 05 апреля 2011

Я узнаю о категориях в Objective-C , и они кажутся действительно похожими на методы расширения в .NET .

Есть ли какие-то тонкие различия или ошибки между этими двумя, которые могут вызвать проблемы при переходе с одного языка на другой, или они для всех намерений и целей являются идентичными понятиями?

Ответы [ 2 ]

2 голосов
/ 27 октября 2011

В мире .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
}
2 голосов
/ 05 апреля 2011

По моему опыту, используя две концепции в C # и ObjC, я использую функции для тех же проблем.Добавление новых экземпляров или статических методов к встроенным типам, когда создание подклассов либо недопустимо, либо не рекомендуется.

Я стараюсь избегать Категорий / Расширений, потому что они могут быть запахом кода, который вы слишком сильно полагаетесь на встроенные классы вместо того, чтобы создавать собственные структуры данных для представления вашей системы.

* 1004С учетом вышесказанного я не сталкивался с какими-либо странными ошибками, когда вы понимаете синтаксические различия.
...