Manual de C# para desarrolladores de Objective-CC# Primer for Objective-C Developers

Xamarin.iOS permite el uso compartido entre plataformas del código independiente de plataformas escrito en C#. Sin embargo, es posible que las aplicaciones de iOS existentes quieran aprovechar el código de Objective-C que ya se ha creado. Este artículo sirve como un breve manual para los desarrolladores de Objective-C que desean pasarse a Xamarin y el lenguaje C#.Xamarin.iOS allows platform-agnostic code written in C# to be shared across platforms. However, existing iOS applications may want to leverage Objective-C code that has already been created. This article serves as a short primer for Objective-C developers looking to move to Xamarin and the C# language.

Las aplicaciones de iOS y OS X desarrolladas en Objective-C pueden beneficiarse de Xamarin al aprovechar C# en lugares donde no se requiere código específico de la plataforma; de este modo, este código se puede utilizar en dispositivos que no son de Apple.iOS and OS X applications developed in Objective-C can benefit from Xamarin by leveraging C# in places where platform-specific code is not required, allowing such code to be used on non-Apple devices. Así pues, aspectos como los servicios web, el análisis de JSON y XML y los algoritmos personalizados podrán utilizarse entre plataformas.Things such as web services, JSON and XML parsing, and custom algorithms can then be used in a cross-platform manner.

Para aprovechar las ventajas de Xamarin manteniendo los activos existentes de Objective-C, aquel se puede exponer a C# en una tecnología de Xamarin conocida como "enlaces", que hace emerger el código de Objective-C para el entorno administrado de C#.To take advantage of Xamarin while maintaining existing Objective-C assets, the former can be exposed to C# in a technology from Xamarin known as bindings, which surface Objective-C code to the managed, C# world. Además, si lo desea, el código también se puede migrar línea por línea a C#.Also, if desired, code can be ported line-by-line to C# as well. Sin embargo, con independencia del enfoque escogido (enlace o migración), se requieren algunos conocimientos de Objective-C y C# para aprovechar de manera efectiva el código de Objective-C existente con Xamarin.iOS.Regardless of the approach however, whether it be binding or porting, some knowledge of both Objective-C and C# is necessary to effectively leverage existing Objective-C code with Xamarin.iOS.

Interoperabilidad de Objective-CObjective-C Interop

Actualmente no existe ningún mecanismo compatible para crear una biblioteca en C# con Xamarin.iOS que se pueda llamar desde Objective-C.There is currently no supported mechanism to create a library in C# using Xamarin.iOS that can be called from Objective-C. La principal razón para ello es que se requiere el entorno de ejecución Mono además del enlace.The main reason for this is the Mono runtime is also required in addition to the binding. Sin embargo, podrá seguir creando la mayoría de la lógica en Objective-C, incluidas las interfaces de usuario.However, you can still create the majority of your logic in Objective-C, including user interfaces. Para ello, encapsule el código de Objective-C en una biblioteca y cree un enlace a él.To do this, wrap the Objective-C code in a library and create a binding to it. Se necesita Xamarin.iOS para arrancar la aplicación (lo que significa que debe crear el punto de entrada Main).Xamarin.iOS is needed to bootstrap the application (meaning it must create the Main entry point). Después de eso, cualquier otra lógica puede estar en Objective-C, expuesta a C# a través del enlace (o mediante P/Invoke).After that, any other logic can be in Objective-C, exposed to C# through the binding (or via P/Invoke). De esta manera, puede mantener la lógica específica de la plataforma en Objective-C y desarrollar las partes independientes de la plataforma en C#.This way, you can keep the platform specific logic in Objective-C and develop the platform agnostic parts in C#.

En este artículo se resaltan algunas de las principales similitudes, y se contrastan también varias diferencias de ambos lenguajes, para que tenga unas nociones generales al respecto al trasladarse a C# con Xamarin.iOS, ya sea con un enlace al código existente de Objective-C o migrándolo a C#.This article highlights some key similarities, as well as contrasts several differences in both languages to serve as a primer when moving to C# with Xamarin.iOS, whether binding to existing Objective-C code, or porting it to C#.

Para obtener más información acerca de cómo crear enlaces, vea el resto de los documentos en Binding Objective-C (Enlace de Objective-C).For details on creating bindings see the other documents in Binding Objective-C.

Comparación de lenguajesLanguage Comparison

Objective-C y C# son lenguajes muy diferentes tanto sintácticamente como desde la perspectiva del entorno de ejecución.Objective-C and C# are very different languages both syntactically and from a runtime standpoint. Objective-C es un lenguaje dinámico y utiliza un esquema de paso de mensajes, mientras que C# presenta tipos estáticos.Objective-C is a dynamic language and uses a message passing scheme, whereas C# is statically typed. Consciente de la sintaxis, Objective-C es como Smalltalk, mientras que C# deriva gran parte de su sintaxis fundamental desde Java, aunque ha madurado para incluir muchas funciones más allá de Java en los últimos años.Syntax-wise, Objective-C is like Smalltalk, whereas C# derives much of its fundamental syntax from Java, although it has matured to included many capabilities beyond Java in recent years.

Dicho esto, hay varias características de lenguaje de Objective-C y C# cuya función es similar.That said there are several language features of both Objective-C and C# that are similar in function. Si va a crear un enlace a código de Objective-C desde C# o al migrar Objective-C a C#, es importante que entienda estas similitudes.When creating a binding to Objective-C code from C# or when porting Objective-C to C#, understanding these similarities is useful.

Protocolos frente a InterfacesProtocols vs. Interfaces

Objective-C y C# son lenguajes de herencia única.Both Objective-C and C# are single inheritance languages. Sin embargo, ambos lenguajes ofrecen la posibilidad de implementar varias interfaces en una clase determinada.However, both languages have support for implementing multiple interfaces in a given class. En Objective-C, estas interfaces lógicas se llaman protocolos, mientras que en C# se denominan interfaces.In Objective-C these logical interfaces are called protocols whereas in C# they are called interfaces. Capaces de asumir implementaciones, la diferencia principal entre una interfaz de C# y un protocolo de Objective-C es que el último puede tener métodos opcionales.Implementation-wise, the main difference between a C# interface and an Objective-C protocol is the latter can have optional methods. Para obtener más información, consulte el artículo Events, Delegates and Protocols (Eventos, delegados y protocolos).For more information see the Events, Delegates and Protocols article.

Categorías frente a Métodos de extensiónCategories vs. Extension methods

Objective-C permite la adición de métodos a una clase para la que quizá no tenga el código de implementación por medio de Categorías.Objective-C allows methods to be added to a class for which you may not have the implementation code using Categories. En C# está disponible un concepto similar a través de lo que se conoce como métodos de extensión.In C# a similar concept is available through what’s known as extension methods.

Los métodos de extensión permiten agregar métodos estáticos a una clase, donde los métodos estáticos de C# son similares a los métodos de clase en Objective-C.Extension methods let you add static methods to a class, where static methods in C# are analogous to class methods in Objective-C. Por ejemplo, el código siguiente agrega un método denominado ScrollToBottom a la clase UITextView, que a su vez es una clase administrada que se enlaza con la clase UITextView de Objective-C desde UIKit:For example, the following code adds a method named ScrollToBottom to the UITextView class, which in turn is a managed class that is bound to the Objective-C UITextView class from UIKit:

public static class UITextViewExtensions
{
    public static void ScrollToBottom (this UITextView textView)
    {
        // code to scroll textView
    }
}

A continuación, cuando una se crea una instancia de UITextView en el código, el método estará disponible en la lista de autocompletar tal y como se muestra a continuación:Then, when an instance of a UITextView is created in code, the method will be available in the autocomplete list as shown below:

Cuando se llama al método de extensión, se pasa la instancia al argumento, como textView en este ejemplo.When the extension method is called the instance is passed to the argument, such as the textView in this example.

Marcos de trabajo frente a EnsambladosFrameworks vs. Assemblies

Los paquetes de Objective-C relacionaban clases en directorios especiales conocidos como marcos de trabajo.Objective-C packages related classes in special directories known as frameworks. Sin embargo, en C# y .NET los ensamblados se utilizan para proporcionar fragmentos de código precompilado reutilizables.In C# and .NET however, assemblies are used to provide reusable bits of precompiled code. En entornos fuera de iOS, los ensamblados contienen código de lenguaje intermedio (IL) que se compila en el entorno de ejecución según el método Just-In-Time (JIT).In environments outside of iOS, assemblies contain intermediate language code (IL) that is just in time (JIT) compiled at runtime. Sin embargo, Apple no permite JIT en aplicaciones iOS.However, Apple does not allow JIT in iOS applications. Por lo tanto, el código de C# destinado a iOS con Xamarin se compila antes de tiempo, produciendo un ejecutable de Unix junto con archivos de metadatos que se incluyen en el conjunto de la aplicación.Therefore C# code targeting iOS with Xamarin is ahead of time compiled (AOT), producing a single Unix executable along with metadata files that are included in the application bundle.

Selectores frente a parámetros con nombreSelectors vs. Named Parameters

Los métodos de Objective-C incluyen inherentemente nombres de parámetros en los selectores por su propia naturaleza.Objective-C methods inherently include parameter names in selectors by their very nature. Por ejemplo, un selector como AddCrayon:WithColor: deja claro lo que significa cada parámetro cuando se usa en el código.For example a selector such as AddCrayon:WithColor: makes it clear what each parameter means when used in code. C# admite opcionalmente también argumentos con nombre.C# optionally supports named arguments as well.

Por ejemplo, un código similar en C# utilizando argumentos con nombre sería este:For example, similar code in C# using named arguments would be:

AddCrayon (crayon: myCrayon, color: UIColor.Blue);

Aunque C# admite esta función en la versión 4.0 del lenguaje, en la práctica no se usa con frecuencia.Although C# added this support in version 4.0 of the language, in practice it isn’t used very often. Sin embargo, si desea ser explícito en el código, la compatibilidad efectivamente existe.However, if you want to be explicit in your code, the support for it is there.

Encabezados y espacios de nombresHeaders and Namespaces

Al ser un superconjunto de C, Objective-C usa encabezados para las declaraciones públicas que son independientes del archivo de implementación.Being a superset of C, Objective-C uses headers for public declarations that are separate from the implementation file. C# no utiliza archivos de encabezado.C# does not use header files. A diferencia de Objective-C, el código de C# se encuentra en los espacios de nombres.Unlike Objective-C, C# code is contained in namespaces. Si desea incluir código disponible en algún espacio de nombres, agregue una directiva using a la parte superior del archivo de implementación o califique el tipo con el espacio de nombres completo.If you want to include code available in some namespace, you add either a using directive to the top of the implementation file, or you qualify the type with the full namespace.

Por ejemplo, el código siguiente incluye el espacio de nombres UIKit, que permite que todas las clases de ese espacio de nombres estén disponibles para la implementación:For example, the following code includes the UIKit namespace, making every class in that namespace available to the implementation:

using UIKit
namespace MyAppNamespace
{
    // implementation of classes
}

Además, la palabra clave del espacio de nombres en el código anterior establece el espacio de nombres utilizado para el propio archivo de implementación.Also, the namespace keyword in the above code sets the namespace used for the implementation file itself. Si varios archivos de implementación comparten el mismo espacio de nombres, no es necesario incluir también el espacio de nombres en una directiva using, porque está implícito.If multiple implementation files share the same namespace, there’s no need to include the namespace in a using directive as well, as it is implied.

PropiedadesProperties

Objective-C y C# tienen el concepto de propiedades para proporcionar una abstracción de alto nivel alrededor de los métodos de descriptor de acceso.Both Objective-C and C# have the concept of properties to provide a high-level abstraction around accessor methods. En Objective C, se usa la directiva de compilador de @property para generar de forma eficaz los métodos de descriptor de acceso.In Objective-C the @property compiler directive is used to effectively generate the accessor methods. En cambio, C# incluye compatibilidad con las propiedades en el propio lenguaje.In contrast, C# includes support for properties within the language itself. Una propiedad de C# se puede implementar con un estilo más largo que tiene acceso a un campo de respaldo, o mediante una propiedad automática más corta, como se muestra en los ejemplos siguientes:A C# property can be implemented using either a longer style that accesses a backing field, or using a shorter, automatic property syntax, as shown in the following examples:

// automatic property syntax
public string Name { get; set; }

// property implemented with a backing field
string address;
public string Address {
    get {
        // could add additional code here
        return address;
    }
    set {
        address = value;
    }
}

Static (palabra clave)Static Keyword

La palabra clave static tiene un significado muy diferente en Objective-C y C#.The static keyword has very different meaning between Objective-C and C#. En Objective-C, las funciones estáticas se usan para limitar el ámbito de una función al archivo actual.In Objective-C static functions are used to limit the scope of a function to the current file. En C#, no obstante, el ámbito se mantiene a través de las palabras clave public, private e internal.In C# however, scope is maintained through the public, private and internal keywords.

Cuando la palabra clave static se aplica a una variable en Objective-C, la variable mantiene su valor en las llamadas de las funciones.When the static keyword is applied to a variable in Objective-C, the variable maintains its value across function calls.

C# también tiene una palabra clave static.C# also has a static keyword. Cuando se aplica a un método, hace efectivamente lo mismo que el modificador + hace en Objective-C.When applied to a method, it effectively does the same thing that the + modifier does in Objective-C. Es decir, crea un método de clase.Namely, it creates a class method. De forma similar, cuando se aplica a otras construcciones, como campos, propiedades y eventos, hace que esas partes del tipo se declaren dentro de la instancia en lugar de con cualquier instancia de ese tipo.Similarly, when applied to other constructs such as fields, properties and events, it makes those part of the type they are declared within rather than with any instance of that type. También puede crear una clase estática, en la que todos los métodos definidos en la clase también deben ser estáticos.You can also make a static class, in which all the methods defined in the class must be static as well.

NSArray frente a Inicialización de listaNSArray vs. List Initialization

Objective-C ahora incluye la sintaxis literal para su uso con NSArray, con lo que el inicio es más sencillo.Objective-C now includes literal syntax for use with NSArray, making it easier to initialize. Sin embargo, C# tiene un tipo enriquecido denominado List, que es genérico, lo que significa que el tipo que contiene la lista puede proporcionarse por el código que crea la lista (por ejemplo, plantillas de C++).C# however has a richer type called a List which is generic, meaning the type the list holds can be provided by the code that creates the list (like templates in C++). Además, las listas admiten la sintaxis de inicialización automática, tal y como se muestra a continuación:Additionally, lists support auto-initialization syntax as shown below:

MyClass object1 = new MyClass ();
MyClass object2 = new MyClass ();
List<MyClass> myList = new List<MyClass>{ object1, object2 };

Bloques frente a Expresiones lambdaBlocks vs. Lambda Expressions

Objective-C usa bloques para crear cierres, donde puede crear una función en línea que puede hacer uso del estado en el que está incluida.Objective-C uses blocks to create closures, where you can create a function inline that can make use of the state where it is enclosed. C# tiene un concepto similar que se aplica mediante el uso de expresiones lambda.C# has a similar concept through the use of lambda expressions. En C#, las expresiones lambda se crean con el operador =>, como se muestra a continuación:In C# lambda expressions are created with the => operator as shown below:

(args) => {
    //  implementation code
};

Para obtener más información sobre las expresiones lambda, vea la guía de programación de C# de Microsoft.For more information on lambda expressions, see Microsoft’s C# Programming Guide.

ResumenSummary

En este artículo se contrastan diferentes características del lenguaje de Objective-C y C#.In this article a variety of language features were contrasted between Objective-C and C#. En algunos casos, se señalan características similares que existen en ambos lenguajes, como los bloques y las expresiones lambda o las categorías y los métodos de extensión.In some cases, it called out analogous features that exist between both languages, such as blocks to lambda expressions, and categories to extension methods. Además, contrasta aquellos aspectos en que los lenguajes se diferencian, como los espacios de nombres en C# y el significado de la palabra clave static.Additionally, it contrasted places where the languages diverge, such as with namespaces in C# and the meaning of the static keyword.