Внедрение .NET рекомендации для Objective-C.NET Embedding best practices for Objective-C

Это черновик и может не быть синхронизированной с функциями в настоящее время поддерживается с помощью средства.This is a draft and might not be in-sync with the features presently supported by the tool. Мы надеемся, что в этом документе будет отдельно развивать и в конечном счете соответствовать окончательный средство, т. е. Мы предложим вам специализацию долгосрочной перспективе оптимальных способов — не немедленного решения.We hope that this document will evolve separately and eventually match the final tool, i.e. we'll suggest long term best approaches - not immediate workarounds.

Большая часть этого документа также применяется для прочих поддерживаемых языков.A large part of this document also applies to other supported languages. Тем не менее все входящие относятся, например в C# и Objective-C.However all provided examples are in C# and Objective-C.

Предоставление подмножество управляемого кодаExposing a subset of the managed code

Созданный собственный библиотеки и платформы содержит код Objective-C для вызова каждого из управляемых интерфейсов API, предоставляемый.The generated native library/framework contains Objective-C code to call each of the managed APIs that is exposed. Дополнительные API, вы surface (сделать общедоступными) затем большего размера собственного связующий станет библиотеки.The more API you surface (make public) then larger the native glue library will become.

Возможно, следует создать сборку отличные, меньшего размера, предоставлять только необходимые API для собственного разработчика.It might be a good idea to create a different, smaller assembly, to expose only the required APIs to the native developer. Этот интерфейс также позволит вам больший контроль над видимостью, именования, произошла ошибка при проверке... сформированного кода.That facade will also allow you more control over the visibility, naming, error checking... of the generated code.

Предоставление доступа к chunkier APIExposing a chunkier API

Нет приходится платить переход из машинного, управляемого (и назад).There is a price to pay to transition from native to managed (and back). Таким образом, лучше предоставлять громоздкие вместо отправки множественных API, чтобы разработчики исходных приложений, напримерAs such, it's better to expose chunky instead of chatty APIs to the native developers, e.g.

НеаккуратныеChatty

public class Person {
  public string FirstName { get; set; }
  public string LastName { get; set; }
}
// this requires 3 calls / transitions to initialize the instance
Person *p = [[Person alloc] init];
p.firstName = @"Sebastien";
p.lastName = @"Pouliot";

ГромоздкиеChunky

public class Person {
  public Person (string firstName, string lastName) {}
}
// a single call / transition will perform better
Person *p = [[Person alloc] initWithFirstName:@"Sebastien" lastName:@"Pouliot"];

Поскольку меньше количество переходов, производительность может быть лучше.Since the number of transitions is smaller the performance will be better. Оно также требует меньше кода, создаваемом, в результате получится также меньшего размера собственной библиотеки.It also requires less code to be generated, so this will produce a smaller native library as well.

ИменованиеNaming

Именования объектов является одним из двух самых сложных проблем в компьютерной науки, остальные, кэш ошибки недействительности и отключить на 1.Naming things is one of two hardest problems in computer science, the others being cache invalidation and off-by-1 errors. Будем надеяться, что внедрение .NET можно позволит предотвратить все, кроме именования.Hopefully .NET Embedding can shield you from all but naming.

ТипыTypes

Objective-C не поддерживает пространства имен.Objective-C does not support namespaces. Как правило, его типы должны иметь префикс 2 (для Apple) или 3 (для сторонних производителей) символ префикса, например UIView для представления в UIKit, который обозначает платформы.In general, its types are prefixed with a 2 (for Apple) or 3 (for 3rd parties) character prefix, like UIView for UIKit's View, which denotes the framework.

Для типов .NET пропуск пространство имен не поддерживается как может привести к появлению повторяющихся или запутанными, имена.For .NET types skipping the namespace is not possible as it can introduce duplicated, or confusing, names. В результате существующие типы .NET очень много, напримерThis makes existing .NET types very long, e.g.

namespace Xamarin.Xml.Configuration {
  public class Reader {}
}

будет использоваться следующим:would be used like:

id reader = [[Xamarin_Xml_Configuration_Reader alloc] init];

Тем не менее можно повторно предоставить к типу, что:However you can re-expose the type as:

public class XAMXmlConfigReader : Xamarin.Xml.Configuration.Reader {}

что делает более понятной Objective-C для использования, например:making it more Objective-C friendly to use, e.g.:

id reader = [[XAMXmlConfigReader alloc] init];

МетодыMethods

Возможно, даже подходящих имен .NET идеально подходит для Objective-C API.Even good .NET names might not be ideal for an Objective-C API.

Соглашения об именовании в Objective-C, отличаются от .NET (верблюжьем вместо Pascal, в более подробный).Naming conventions in Objective-C are different than .NET (camel case instead of pascal case, more verbose). См. в статье кодирования, касающиеся Cocoa.Please read the coding guidelines for Cocoa.

Разработчик Objective-C точки зрения, метод с Get префикс подразумевает вы не являетесь владельцем экземпляра, т. е. получение правила.From an Objective-C developer's point of view, a method with a Get prefix implies you do not own the instance, i.e. the get rule.

Это правило именования не имеет соответствия в мире сборщик Мусора .NET; метод .NET с Create префикса будет идентично в .NET.This naming rule has no match in the .NET GC world; a .NET method with a Create prefix will behave identically in .NET. Тем не менее, для разработчиков Objective-C, она обычно означает, что вы владеете возвращаемого экземпляра, т. е. создать правило.However, for Objective-C developers, it normally means you own the returned instance, i.e. the create rule.

ИсключенияExceptions

Это довольно часто в .NET, чтобы использовать исключения широко для сообщения об ошибках.It's quite common in .NET to use exceptions extensively to report errors. Однако они медленным и довольно неидентичны в Objective-C.However, they are slow and not quite identical in Objective-C. По возможности их следует скрыть от разработчика Objective-C.Whenever possible you should hide them from the Objective-C developer.

Например, .NET Try модель будет гораздо удобнее использовать из кода Objective-C:For example, the .NET Try pattern will be much easier to consume from Objective-C code:

public int Parse (string number)
{
  return Int32.Parse (number);
}

Сравнениеversus

public bool TryParse (string number, out int value)
{
  return Int32.TryParse (number, out value);
}

Исключения внутри init*Exceptions inside init*

В .NET конструктор должен либо завершиться успешно и вернуть (надеюсь) допустимый экземпляр или создает исключение.In .NET a constructor must either succeed and return a (hopefully) valid instance or throw an exception.

Напротив, позволяет Objective-C init* для возврата nil когда экземпляр не может быть создан.In contrast, Objective-C allows init* to return nil when an instance cannot be created. Это распространенные, но не общие, шаблон, используемый во многих платформ Apple.This is a common, but not general, pattern used in many of Apple's frameworks. В некоторых других случаях assert может произойти (и завершить текущий процесс).In some other cases an assert can happen (and kill the current process).

Генератор следуйте той же самой return nil шаблон для созданных init* методы.The generator follow the same return nil pattern for generated init* methods. Если управляемое исключение возникает, то он будет напечатан (с помощью NSLog) и nil будет возвращаться вызывающему объекту.If a managed exception is thrown, then it will be printed (using NSLog) and nil will be returned to the caller.

ОператорыOperators

Objective-C не поддерживает операторы можно перегружать как C# выполняет, поэтому они преобразуются в класс селекторов.Objective-C does not allow operators to be overloaded as C# does, so these are converted to class selectors.

«Понятное» предпочтение перегрузки операторов, создаются именованные методы когда найден и может привести к более удобную для использования API."Friendly" named methods are generated in preference to the operator overloads when found, and can produce an easier to consume API.

Классы, которые переопределяют операторы == и (или) != должны переопределять также стандартный метод Equals (объект).Classes that override the operators == and\or != should override the standard Equals (Object) method as well.