Xamarin para desarrolladores de JavaXamarin for Java Developers

Si es usted es desarrollador de Java, ya tiene la posibilidad de empezar a aprovechar sus habilidades y el código existente de Xamarin en la plataforma Xamarin, al tiempo que disfruta de los beneficios de reutilizar código de C#. Observará que la sintaxis de C# es muy similar a la sintaxis de Java y que ambos lenguajes ofrecen características muy similares. Además, encontrará características exclusivas de C# que facilitarán el trabajo a los desarrolladores.If you are a Java developer, you are well on your way to leveraging your skills and existing code on the Xamarin platform while reaping the code reuse benefits of C#. You will find that C# syntax is very similar to Java syntax, and that both languages provide very similar features. In addition, you'll discover features unique to C# that will make your development life easier.

Información generalOverview

En este artículo se proporciona una introducción a la programación en C# para los desarrolladores de Java y se centra principalmente en las características del lenguaje C# con las que se encontrará al desarrollar aplicaciones Xamarin.Android.This article provides an introduction to C# programming for Java developers, focusing primarily on the C# language features that you will encounter while developing Xamarin.Android applications. Además, en este artículo se explican las diferencias de estas características con respecto a las de Java y, además, se presentan características importantes de C# (relevantes para Xamarin.Android) que no se encuentran disponibles en Java.Also, this article explains how these features differ from their Java counterparts, and it introduces important C# features (relevant to Xamarin.Android) that are not available in Java. Se incluyen vínculos a material de referencia adicional, para que pueda usar este artículo como un punto de partida para obtener más información sobre C# y .NET.Links to additional reference material are included, so you can use this article as a "jumping off" point for further study of C# and .NET.

Si está familiarizado con Java, no tardará en sentirse cómodo con la sintaxis de C#.If you are familiar with Java, you will feel instantly at home with the syntax of C#. La sintaxis de C# es muy similar a la de Java – C# es un lenguaje "de apertura" como Java, C y C++.C# syntax is very similar to Java syntax – C# is a "curly brace" language like Java, C, and C++. En muchos sentidos, la sintaxis de C# se lee como un superconjunto de la sintaxis de Java, pero con algunas palabras clave agregadas y con el nombre cambiado.In many ways, C# syntax reads like a superset of Java syntax, but with a few renamed and added keywords.

Muchas características clave de Java pueden encontrarse en C#:Many key characteristics of Java can be found in C#:

  • Programación orientada a objetos basados en clasesClass-based object-oriented programming

  • Tipado fuerteStrong typing

  • Compatibilidad con interfacesSupport for interfaces

  • GenéricosGenerics

  • Recolección de elementos no utilizadosGarbage collection

  • Compilación en tiempo de ejecuciónRuntime compilation

Java y C# se compilan en un lenguaje intermedio que se ejecuta en un entorno de ejecución administrado.Both Java and C# are compiled to an intermediate language that is run in a managed execution environment. C# y Java son tipos estáticos, y ambos lenguajes tratan las cadenas como tipos inmutables.Both C# and Java are statically-typed, and both languages treat strings as immutable types. Ambos lenguajes utilizan una jerarquía de clases de raíz única.Both languages use a single-rooted class hierarchy. Al igual que Java, C# solo admite una herencia única y no acepta los métodos globales.Like Java, C# supports only single inheritance and does not allow for global methods. En ambos lenguajes, los objetos se crean en el montón con la palabra clave new y se recoleccionan los objetos no utilizados cuando ya no se utilizan.In both languages, objects are created on the heap using the new keyword, and objects are garbage-collected when they are no longer used. Ambos lenguajes ofrecen una compatibilidad formal con el control de excepciones mediante la semántica try/catch.Both languages provide formal exception handling support with try/catch semantics. Los dos ofrecen también compatibilidad con la sincronización y administración de subprocesos.Both provide thread management and synchronization support.

No obstante, existen muchas diferencias entre Java y C#.However, there are many differences between Java and C#. Por ejemplo:For example:

  • Java no admite las variables locales con tipo implícito (C# admite la palabra clave var).Java does not support implicitly-typed local variables (C# supports the var keyword).

  • En Java, puede pasar parámetros solo por valor, mientras que en C# puede pasarlos tanto por referencia como por valor.In Java, you can pass parameters only by value, while in C# you can pass by reference as well as by value. (C# ofrece las palabras clave ref y out para pasar los parámetros por referencia; no hay ningún equivalente en Java).(C# provides the ref and out keywords for passing parameters by reference; there is no equivalent to these in Java).

  • Java no admite las directivas de preprocesador como #define.Java does not support preprocessor directives like #define.

  • Java no admite los tipos de enteros sin signo, mientras que C# sí admite los tipos de enteros sin signo como ulong, uint, ushort y byte.Java does not support unsigned integer types, while C# provides unsigned integer types such as ulong, uint, ushort and byte.

  • Java no es compatible con la sobrecarga de operador; en C# se pueden sobrecargar operadores y conversiones.Java does not support operator overloading; in C# you can overload operators and conversions.

  • En una instrucción Java switch, el código puede pasar a la siguiente sección del modificador; sin embargo, en C#, el final de cada sección switch debe terminar el modificador (el final de cada sección debe cerrarse con una instrucción break).In a Java switch statement, code can fall through into the next switch section, but in C# the end of every switch section must terminate the switch (the end of each section must close with a break statement).

  • En Java, puede especificar las excepciones generadas por un método con la palabra clave throws, pero C# no tiene ningún concepto de excepciones comprobadas; la palabra clave throws no se admite en C#.In Java, you specify the exceptions thrown by a method with the throws keyword, but C# has no concept of checked exceptions – the throws keyword is not supported in C#.

  • C# admite Language Integrated Query (LINQ), que permite usar las palabras reservadas from, select y where para escribir consultas de colecciones de forma similar a las consultas de bases de datos.C# supports Language-Integrated Query (LINQ), which lets you use the reserved words from, select, and where to write queries against collections in a way that is similar to database queries.

Por supuesto, hay muchas más diferencias entre C# y Java que pueden tratarse en este artículo.Of course, there are many more differences between C# and Java than can be covered in this article. Además, Java y C# continúan evolucionando (por ejemplo, Java 8, que aún no se encuentra en la cadena de herramientas de Android, admite expresiones lambda del estilo de C#), por lo que estas diferencias seguirán evolucionando.Also, both Java and C# continue to evolve (for example, Java 8, which is not yet in the Android toolchain, supports C#-style lambda expressions) so these differences will change over time. Aquí solo se destacan las diferencias más importantes que han detectado los desarrolladores de Java que son nuevos en Xamarin.Android.Only the most important differences currently encountered by Java developers new to Xamarin.Android are outlined here.

C# proporciona muchas características claves de Xamarin.Android que actualmente no están disponibles para los desarrolladores de Java en Android.C# brings many key features to Xamarin.Android that are not currently readily available to Java developers on Android. Estas características pueden ayudarle a escribir código mejor y en menos tiempo:These features can help you to write better code in less time:

  • Propiedades – Con el sistema de propiedades de C#, puede acceder a las variables de miembros de forma segura y directa sin tener que escribir métodos de establecedor y captador.Properties – With C#'s property system, you can access member variables safely and directly without having to write setter and getter methods.

  • Expresiones lambda – En C# también puede usar métodos anónimos (también denominados lambdas) para expresar la funcionalidad de forma más sucinta y eficaz.Lambda Expressionss – In C# you can use anonymous methods (also called lambdas) to express your functionality more succinctly and more efficiently. Puede evitar la sobrecarga de tener que escribir objetos de un solo uso, y puede pasar el estado local a un método sin tener que agregar parámetros.You can avoid the overhead of having to write one-time-use objects, and you can pass local state to a method without having to add parameters.

  • Control de eventos – C# ofrece compatibilidad a nivel de lenguaje para la programación orientada a eventos, donde se puede registrar un objeto para recibir una notificación cuando se produzca algún evento de interés.Event Handling – C# provides language-level support for event-driven programming, where an object can register to be notified when an event of interest occurs. La palabra clave event define un mecanismo de multidifusión que una clase de publicador puede usar para informar a los suscriptores de eventos.The event keyword defines a multicast broadcast mechanism that a publisher class can use to notify event subscribers.

  • Programación asincrónica – Las características de la programación asincrónica de C# (async/await) mantienen la capacidad de respuesta de las aplicaciones.Asynchronous Programming – The asynchronous programming features of C# (async/await) keep apps responsive. La compatibilidad a nivel de lenguaje de esta característica permite que la programación asincrónica resulte fácil de implementar y que sea menos propensa a errores.The language-level support of this feature makes async programming easy to implement and less error-prone.

Además, Xamarin le permite aprovechar los recursos de Java existentes mediante una tecnología que se conoce como enlaces.Finally, Xamarin allows you to leverage existing Java assets via a technology known as binding. Puede llamar al código, los marcos de trabajo y las bibliotecas de Java existentes desde C# con el uso de generadores de enlaces automáticos de Xamarin.You can call your existing Java code, frameworks, and libraries from C# by making use of Xamarin's automatic binding generators. Para ello, basta con crear una biblioteca estática en Java y exponerla en C# mediante un enlace.To do this, you simply create a static library in Java and expose it to C# via a binding.

Pasar del desarrollo en Java al desarrollo en C#Going From Java to C# Development

En las secciones siguientes se describen las diferencias básicas de "introducción" entre C# y Java; en una sección posterior se describen las diferencias orientadas a objetos entre estos lenguajes.The following sections outline the basic "getting started" differences between C# and Java; a later section describes the object-oriented differences between these languages.

Diferencia entre bibliotecas y EnsambladosLibraries vs. Assemblies

Java suele empaquetar clases relacionadas en archivos .jar.Java typically packages related classes in .jar files. Sin embargo, en C# and .NET, los bits reutilizables de código precompilado se empaquetan en ensamblados, que suelen empaquetarse como archivos .dll.In C# and .NET, however, reusable bits of precompiled code are packaged into assemblies, which are typically packaged as .dll files. Un ensamblado es una unidad de implementación de código de C#/.NET, y cada ensamblado suele asociarse con un proyecto de C#.An assembly is a unit of deployment for C#/.NET code, and each assembly is typically associated with a C# project. Los ensamblados contienen código intermedio que se compilan Just-In-Time en tiempo de ejecución.Assemblies contain intermediate code (IL) that is just-in-time compiled at runtime.

Para obtener más información sobre los ensamblados, vea el tema Ensamblados y caché global de ensamblados.For more information about assemblies, see the Assemblies and the Global Assembly Cache topic.

Diferencias entre paquetes y Espacios de nombresPackages vs. Namespaces

C# usa la palabra clave namespace para agrupar tipos relacionados; es similar a la palabra clave package de Java.C# uses the namespace keyword to group related types together; this is similar to Java's package keyword. Normalmente, una aplicación de Xamarin.Android residirá en un espacio de nombres creado para esa aplicación.Typically, a Xamarin.Android app will reside in a namespace created for that app. Por ejemplo, el siguiente código de C# declara el contenedor del espacio de nombres WeatherApp para un aplicación de información meteorológica:For example, the following C# code declares the WeatherApp namespace wrapper for a weather-reporting app:

namespace WeatherApp
{
    ...

Importación de tiposImporting Types

Al usar tipos definidos en los espacios de nombres externos, importe estos tipos con una instrucción using (que es muy similar a la instrucción import de Java).When you make use of types defined in external namespaces, you import these types with a using statement (which is very similar to the Java import statement). En Java, puede importar un solo tipo con una instrucción similar a la siguiente:In Java, you might import a single type with a statement like the following:

import javax.swing.JButton

Puede importar un paquete de Java completo con una instrucción como esta:You might import an entire Java package with a statement like this:

import javax.swing.*

La instrucción using de C# funciona de forma muy similar, pero permite importar un paquete completo sin especificar un carácter comodín.The C# using statement works in a very similar way, but it allows you to import an entire package without specifying a wildcard. Por ejemplo, a menudo verá una serie de instrucciones using al principio de los archivos de origen de Xamarin.Android, como se observa en este ejemplo:For example, you will often see a series of using statements at the beginning of Xamarin.Android source files, as seen in this example:

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using System.Net;
using System.IO;
using System.Json;
using System.Threading.Tasks;

Estas instrucciones importan la funcionalidad desde los espacios de nombres System, Android.App, Android.Content, etc.These statements import functionality from the System, Android.App, Android.Content, etc. namespaces.

GenéricosGenerics

Tanto Java como C# admiten genéricos, que son marcadores de posición que permiten conectar diferentes tipos en tiempo de compilación.Both Java and C# support generics, which are placeholders that let you plug in different types at compile time. Sin embargo, los genéricos funcionan de forma algo diferente en C#.However, generics work slightly differently in C#. En Java, el borrado de tipos habilita la información sobre tipos solo en tiempo de compilación, pero no en tiempo de ejecución.In Java, type erasure makes type information available only at compile time, but not at run time. Por el contrario, .NET Common Language Runtime (CLR) proporciona compatibilidad explícita para los tipos genéricos, lo que significa que C# tiene acceso a información sobre tipos en tiempo de ejecución.By contrast, the .NET common language runtime (CLR) provides explicit support for generic types, which means that C# has access to type information at runtime. En el desarrollo diario de Xamarin.Android, la importancia de esta distinción no suele ser evidente, pero si usa la reflexión, dependerá de esta característica para acceder a la información sobre tipos en tiempo de ejecución.In day-to-day Xamarin.Android development, the importance of this distinction is not often apparent, but if you are using reflection, you will depend on this feature to access type information at run time.

En Xamarin.Android, verá con frecuencia el método genérico FindViewById utilizado para obtener una referencia a un control de diseño.In Xamarin.Android, you will often see the generic method FindViewById used to get a reference to a layout control. Este método acepta un parámetro de tipo genérico que especifica el tipo de control que se buscará.This method accepts a generic type parameter that specifies the type of control to look up. Por ejemplo:For example:

TextView label = FindViewById<TextView> (Resource.Id.Label);

En este ejemplo de código, FindViewById obtiene una referencia al control TextView que se define en el diseño como etiqueta; a continuación, se devuelve como un tipo TextView.In this code example, FindViewById gets a reference to the TextView control that is defined in the layout as Label, then returns it as a TextView type.

Para obtener más información sobre los genéricos, vea el tema Genéricos.For more information about generics, see the Generics topic. Tenga en cuenta que existen algunas limitaciones en la compatibilidad de Xamarin.Android con las clases genéricas de C#; para más información, vea Limitaciones.Note that there are some limitations in Xamarin.Android support for generic C# classes; for more information, see Limitations.

Características de la programación orientada a objetosObject-Oriented Programming Features

Java y C# utilizan expresiones de programación orientada a objetos muy similares:Both Java and C# use very similar object-oriented programming idioms:

  • Todas las clases derivan en última instancia de un objeto de raíz única; todos los objetos de Java derivan de java.lang.Object, mientras que los de C# derivan de System.Object.All classes are ultimately derived from a single root object – all Java objects derive from java.lang.Object, while all C# objects derive from System.Object.

  • Las instancias de clases son tipos de referencia.Instances of classes are reference types.

  • Cuando acceda a las propiedades y los métodos de una instancia, use el operador ".".When you access the properties and methods of an instance, you use the "." operator.

  • Todas las instancias de clases se crean en el montón mediante el operador new.All class instances are created on the heap via the new operator.

  • Debido a que ambos lenguajes utilizan la recolección de elementos no utilizados, se pueden liberar de forma explícita los objetos no utilizados (es decir, que no hay ninguna palabra clave delete como hay en C++).Because both languages use garbage collection, there is way to explicitly release unused objects (i.e., there is not a delete keyword as there is in C++).

  • Puede extender las clases mediante la herencia, y ambos lenguajes solo permiten una única clase base por tipo.You can extend classes through inheritance, and both languages only allow a single base class per type.

  • Puede definir interfaces y una clase puede heredar de (es decir, implementar) varias definiciones de interfaz.You can define interfaces, and a class can inherit from (i.e., implement) multiple interface definitions.

Sin embargo, también hay algunas diferencias importantes:However, there are also some important differences:

  • Java tiene dos características eficaces que C# no admite: las clases anónimas y las clases internas.Java has two powerful features that C# does not support: anonymous classes and inner classes. (Sin embargo, C# permite el anidamiento de las definiciones de clases; las clases anidadas de C# son similares a las clases anidadas estáticas de Java).(However, C# does allow nesting of class definitions – C#'s nested classes are like Java's static nested classes.)

  • C# admite tipos de estructuras del estilo de C (struct), pero Java no.C# supports C-style structure types (struct) while Java does not.

  • En C#, puede implementar una definición de clase en los archivos de código fuente independientes mediante la palabra clave partial.In C#, you can implement a class definition in separate source files by using the partial keyword.

  • Las interfaces de C# no pueden declarar campos.C# interfaces cannot declare fields.

  • C# utiliza la sintaxis de destructores de estilo de C++ para expresar los finalizadores.C# uses C++-style destructor syntax to express finalizers. La sintaxis es diferente del método finalize de Java, pero la semántica es prácticamente la misma.The syntax is different from Java's finalize method, but the semantics are nearly the same. (Tenga en cuenta que, en C#, los destructores llaman automáticamente al destructor de clase base –, a diferencia de Java, donde se usa una llamada explícita a super.finalize).(Note that in C#, destructors automatically call the base-class destructor – in contrast to Java where an explicit call to super.finalize is used.)

Herencia de clasesClass Inheritance

Para extender una clase de Java, utilice la palabra clave extends.To extend a class in Java, you use the extends keyword. Para extender una clase de C#, utilice dos puntos (:) para indicar la derivación.To extend a class in C#, you use a colon (:) to indicate derivation. Por ejemplo, en aplicaciones de Xamarin.Android, a menudo verá derivaciones de clases que se parecen al fragmento de código siguiente:For example, in Xamarin.Android apps, you will often see class derivations that resemble the following code fragment:

public class MainActivity : Activity
{
    ...

En este ejemplo, MainActivity hereda de la clase Activity.In this example, MainActivity inherits from the Activity class.

Para declarar la compatibilidad con una interfaz en Java, use la palabra clave implements.To declare support for an interface in Java, you use the implements keyword. Sin embargo, en C#, solo tiene que agregar nombres de interfaz a la lista de clases de la que se hereda, como se muestra en este fragmento de código:However, in C#, you simply add interface names to the list of classes to inherit from, as shown in this code fragment:

public class SensorsActivity : Activity, ISensorEventListener
{
    ...

En este ejemplo, SensorsActivity hereda de Activity e implementa la funcionalidad declarada en la interfaz ISensorEventListener.In this example, SensorsActivity inherits from Activity and implements the functionality declared in the ISensorEventListener interface. Tenga en cuenta que la lista de interfaces debe aparecer después de la clase base o, de lo contrario, se producirá un error en tiempo de compilación.Note that the list of interfaces must come after the base class (or you will get a compile-time error). Por convención, los nombres de interfaz de C# van precedidos de una letra mayúscula "I"; esto permite determinar qué clases son interfaces sin requerir una palabra clave implements.By convention, C# interface names are prepended with an upper-case "I"; this makes it possible to determine which classes are interfaces without requiring an implements keyword.

Si desea impedir que una clase derive en subclases en C#, coloque sealed delante del nombre de clase; en Java, coloque final delante del nombre de clase.When you want to prevent a class from being further subclassed in C#, you precede the class name with sealed – in Java, you precede the class name with final.

Para obtener más información sobre las definiciones de clases de C#, vea los temas Clases y Herencia.For more about C# class definitions, see the Classes and Inheritance topics.

PropiedadesProperties

En Java, los métodos mutadores (establecedores) y los métodos de inspector (captadores) a menudo se utilizan para controlar cómo se realizan los cambios en los miembros de clase al ocultarlos y protegerlos del código externo.In Java, mutator methods (setters) and inspector methods (getters) are often used to control how changes are made to class members while hiding and protecting these members from outside code. Por ejemplo, la clase TextView de Android proporciona los métodos getText y setText.For example, the Android TextView class provides getText and setText methods. C# proporciona un mecanismo similar pero más directo conocido como propiedades.C# provides a similar but more direct mechanism known as properties. Los usuarios de una clase de C# pueden acceder a una propiedad de la misma manera en que accederían a un campo, pero cada acceso realmente produce una llamada de método que es transparente para el autor de la llamada.Users of a C# class can access a property in the same way as they would access a field, but each access actually results in a method call that is transparent to the caller. Este método "pormenorizado" puede implementar los efectos secundarios, como establecer otros valores, realizar conversiones o cambiar el estado del objeto.This "under the covers" method can implement side effects such as setting other values, performing conversions, or changing object state.

Las propiedades suelen utilizarse para acceder a los miembros de objetos de la interfaz de usuario y para modificarlos.Properties are often used for accessing and modifying UI (user interface) object members. Por ejemplo:For example:

int width = rulerView.MeasuredWidth;
int height = rulerView.MeasuredHeight;
...
rulerView.DrawingCacheEnabled = true;

En este ejemplo, se leen los valores de anchura y altura del objeto rulerView mediante el acceso a sus propiedades MeasuredWidth y MeasuredHeight.In this example, width and height values are read from the rulerView object by accessing its MeasuredWidth and MeasuredHeight properties. Cuando se leen estas propiedades, los valores de sus valores de campos asociados, pero ocultos, se capturan en segundo plano y se devuelven al autor de la llamada.When these properties are read, values from their associated (but hidden) field values are fetched behind the scenes and returned to the caller. El objeto rulerView puede almacenar los valores de anchura y altura en una unidad de medida (es decir, píxeles) y convertirlos sobre la marcha en una unidad de medida distinta (por ejemplo, milímetros) al acceder a las propiedades MeasuredWidth y MeasuredHeight.The rulerView object may store width and height values in one unit of measurement (say, pixels) and convert these values on-the-fly to a different unit of measurement (say, millimeters) when the MeasuredWidth and MeasuredHeight properties are accessed.

El objeto rulerView también tiene una propiedad denominada DrawingCacheEnabled; el código de ejemplo establece esta propiedad en true para habilitar la caché de dibujo en rulerView.The rulerView object also has a property called DrawingCacheEnabled – the example code sets this property to true to enable the drawing cache in rulerView. En segundo plano, se actualiza un campo oculto asociado con el nuevo valor y es posible que se modifiquen otros aspectos del estado rulerView.Behind the scenes, an associated hidden field is updated with the new value, and possibly other aspects of rulerView state are modified. Por ejemplo, cuando DrawingCacheEnabled está establecido en false, rulerView también puede borrar cualquier información de la caché de dibujo ya acumulada en el objeto.For example, when DrawingCacheEnabled is set to false, rulerView may also erase any drawing cache information already accumulated in the object.

El acceso a las propiedades puede ser de lectura/escritura, solo lectura o solo escritura.Access to properties can be read/write, read-only, or write-only. Además, puede usar distintos modificadores de acceso para leer y escribir.Also, you can use different access modifiers for reading and writing. Por ejemplo, puede definir una propiedad que tenga acceso de lectura público, pero acceso de escritura privado.For example, you can define a property that has public read access but private write access.

Para obtener más información sobre las propiedades de C#, vea el tema Propiedades.For more information about C# properties, see the Properties topic.

Llamar a métodos de clase baseCalling Base Class Methods

Para llamar a un constructor de clase base en C#, utilice dos puntos (:) seguidos de la palabra clave base y una lista de inicializadores; esta llamada al constructor base se coloca inmediatamente después de la lista de parámetros del constructor derivada.To call a base-class constructor in C#, you use a colon (:) followed by the base keyword and an initializer list; this base constructor call is placed immediately after the derived constructor parameter list. Se llama al constructor de clase base al introducir el constructor derivado; el compilador inserta la llamada en el constructor base al inicio del cuerpo del método.The base-class constructor is called on entry to the derived constructor; the compiler inserts the call to the base constructor at the start of the method body. El siguiente fragmento de código muestra un constructor base llamado desde un constructor derivado en una aplicación de Xamarin.Android:The following code fragment illustrates a base constructor called from a derived constructor in a Xamarin.Android app:

public class PictureLayout : ViewGroup
{
    ...
    public class PictureLayout (Context context)
           : base (context)
    {
        ...
    }
    ...
}

En este ejemplo, la clase PictureLayout se deriva de la clase ViewGroup.In this example, the PictureLayout class is derived from the ViewGroup class. El constructor PictureLayout que se muestra en este ejemplo acepta un argumento context y lo pasa al constructor ViewGroup mediante la llamada base(context).The PictureLayout constructor shown in this example accepts a context argument and passes it to the ViewGroup constructor via the base(context) call.

Para llamar a un método de clase base en C#, use la palabra clave base.To call a base-class method in C#, use the base keyword. Por ejemplo, las aplicaciones de Xamarin.Android suelen realizar llamadas a los métodos base, como se muestra aquí:For example, Xamarin.Android apps often make calls to base methods as shown here:

public class MainActivity : Activity
{
    ...
    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);

En este caso, el método OnCreate definido por la clase derivada (MainActivity) llama al método OnCreate de la clase base (Activity).In this case, the OnCreate method defined by the derived class (MainActivity) calls the OnCreate method of the base class (Activity).

Modificadores de accesoAccess Modifiers

Java y C# admiten los modificadores de acceso public, private y protected.Java and C# both support the public, private, and protected access modifiers. Sin embargo, C# admite dos modificadores de acceso adicionales:However, C# supports two additional access modifiers:

  • internal – Al miembro de clase se puede acceder únicamente dentro del ensamblado actual.internal – The class member is accessible only within the current assembly.

  • protected internal – Al miembro de clase se puede acceder dentro del ensamblado de definición, de la clase de definición y de las clases derivadas (tienen acceso las clases derivadas dentro y fuera del ensamblado).protected internal – The class member is accessible within the defining assembly, the defining class, and derived classes (derived classes both inside and outside the assembly have access).

Para obtener más información sobre los modificadores de acceso de C#, vea el tema Modificadores de acceso.For more information about C# access modifiers, see the Access Modifiers topic.

Métodos virtuales y de invalidaciónVirtual and Override Methods

Java y C# admiten el polimorfismo, que es la capacidad de tratar objetos relacionados de la misma manera.Both Java and C# support polymorphism, the ability to treat related objects in the same manner. En ambos lenguajes, se puede usar una referencia de clase base para hacer referencia a un objeto de clases derivada, y los métodos de una clase derivada pueden invalidar los métodos de sus clases base.In both languages, you can use a base-class reference to refer to a derived-class object, and the methods of a derived class can override the methods of its base classes. Ambos lenguajes tienen el concepto de un método virtual, que es un método de una clase base diseñado para sustituirse por un método de una clase derivada.Both languages have the concept of a virtual method, a method in a base class that is designed to be replaced by a method in a derived class. Al igual que Java, C# admite clases y métodos abstract.Like Java, C# supports abstract classes and methods.

Sin embargo, hay algunas diferencias entre Java y C# en cómo declarar métodos virtuales e invalidarlos:However, there are some differences between Java and C# in how you declare virtual methods and override them:

  • En C#, los métodos son no virtuales de forma predeterminada.In C#, methods are non-virtual by default. Las clases principales deben etiquetar de forma explícita qué métodos deben invalidarse con el uso de la palabra clave virtual.Parent classes must explicitly label which methods are to be overridden by using the virtual keyword. Por el contrario, todos los métodos de Java son virtuales de forma predeterminada.By contrast, all methods in Java are virtual methods by default.

  • Para evitar la invalidación de un método en C#, solo tiene que excluir la palabra clave virtual.To prevent a method from being overridden in C#, you simply leave off the virtual keyword. Por el contrario, Java usa la palabra clave final para marcar un método con "override is not allowed" (No se permite la invalidación).By contrast, Java uses the final keyword to mark a method with "override is not allowed."

  • Las clases derivadas de C# deben usar la palabra clave override para indicar de forma explícita que se va a anular un método de clase base virtual.C# derived classes must use the override keyword to explicitly indicate that a virtual base-class method is being overridden.

Para obtener más información sobre la compatibilidad de C# con el polimorfismo, vea el tema Polimorfismo.For more information about C#'s support for polymorphism, see the Polymorphism topic.

Expresiones lambdaLambda Expressions

C# permite crear clausuras: métodos anónimos insertados que pueden acceder al estado del método en que están incluidos.C# makes it possible to create closures: inline, anonymous methods that can access the state of the method in which they are enclosed. Con el uso de expresiones lambda, puede escribir menos líneas de código para implementar la misma funcionalidad que hubiera implementado en Java con muchas más líneas de código.Using lambda expressions, you can write fewer lines of code to implement the same functionality that you might have implemented in Java with many more lines of code.

Las expresiones lambda permiten omitir los pasos adicionales necesarios para crear una clase de un solo uso o una clase anónima que debería aplicar en Java; en su lugar, solo puede escribir la lógica de negocios del código del método insertado.Lambda expressions make it possible for you to skip the extra ceremony involved in creating a one-time-use class or anonymous class as you would in Java – instead, you can just write the business logic of your method code inline. Además, como las expresiones lambda tienen acceso a las variables del método adyacente, no tiene que crear una lista larga de parámetros para pasar el estado al código del método.Also, because lambdas have access to the variables in the surrounding method, you don't have to create a long parameter list to pass state to your method code.

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 here:

(arg1, arg2, ...) => {
    // implementation code
};

En Xamarin.Android, a menudo se usan expresiones lambda para definir controladores de eventos.In Xamarin.Android, lambda expressions are often used for defining event handlers. Por ejemplo:For example:

button.Click += (sender, args) => {
    clickCount += 1;    // access variable in surrounding code
    button.Text = string.Format ("Clicked {0} times.", clickCount);
};

En este ejemplo, el código de la expresión lambda (el código encerrado entre llaves) incrementa un recuento de clics y actualiza el texto button para mostrar el recuento de clics.In this example, the lambda expression code (the code within the curly braces) increments a click count and updates the button text to display the click count. Esta expresión lambda se registra con el objeto button como un controlador de eventos de clics al que se llama cada vez que se pulsa un botón.This lambda expression is registered with the button object as a click event handler to be called whenever the button is tapped. (Los controladores de eventos se explican con más detalle a continuación). En este ejemplo, el código de la expresión lambda no usa los parámetros sender y args, pero sí son necesarios en la expresión lambda para satisfacer los requisitos de firma del método para el registro del evento.(Event handlers are explained in more detail below.) In this simple example, the sender and args parameters are not used by the lambda expression code, but they are required in the lambda expression to meet the method signature requirements for event registration. En segundo plano, el compilador de C# convierte la expresión lambda en un método anónimo al que se llama cada vez que se hace clic en un botón.Under the hood, the C# compiler translates the lambda expression into an anonymous method that is called whenever button click events take place.

Para obtener más información sobre C# y las expresiones lambda, vea el tema Expresiones lambda.For more information about C# and lambda expressions, see the Lambda Expressions topic.

Control de eventosEvent Handling

Un eventos es la forma en que un objeto notifica a los suscriptores registrados cuándo sucede algo interesante a dicho objeto.An event is a way for an object to notify registered subscribers when something interesting happens to that object. A diferencia de Java, donde un suscriptor que suele implementar una interfaz Listener que contiene un método de devolución de llamada, C# ofrece compatibilidad a nivel de lenguaje para el control de eventos mediante delegados.Unlike in Java, where a subscriber typically implements a Listener interface that contains a callback method, C# provides language-level support for event handling through delegates. Un delegado es similar a un puntero de función con seguridad de tipos orientado a objetos; encapsula una referencia de objeto y un token de método.A delegate is like an object-oriented type-safe function pointer – it encapsulates an object reference and a method token. Si un objeto de cliente desea suscribirse a un evento, crea un delegado y pasa el delegado al objeto notificador.If a client object wants to subscribe to an event, it creates a delegate and passes the delegate to the notifying object. Cuando se produce el evento, el objeto notificador invoca el método representado por el objeto delegado, para notificar al objeto de cliente de suscripción del evento.When the event occurs, the notifying object invokes the method represented by the delegate object, notifying the subscribing client object of the event. En C#, los controladores de eventos básicamente no son más que métodos que se invocan mediante delegados.In C#, event handlers are essentially nothing more than methods that are invoked through delegates.

Para obtener más información sobre los delegados, vea el tema Delegados.For more information about delegates, see the Delegates topic.

En C#, los eventos son multidifusión; esto quiere decir que se puede notificar a más de un agente de escucha cuando se produce un evento.In C#, events are multicast; that is, more than one listener can be notified when an event takes place. Esta diferencia se observa al tener en cuenta las diferencias sintácticas entre el registro de eventos de Java y C#.This difference is observed when you consider the syntactical differences between Java and C# event registration. En Java, se llama a SetXXXListener para registrar notificaciones de eventos; en C#, se usa el operador += para registrar notificaciones de eventos al "agregar" el delegado a la lista de agentes de escucha de eventos.In Java you call SetXXXListener to register for event notifications; in C# you use the += operator to register for event notifications by "adding" your delegate to the list of event listeners. En Java, se llama a SetXXXListener para anular el registro, mientras que en C# se utiliza -= para "restar" el delegado de la lista de agentes de escucha.In Java, you call SetXXXListener to unregister, while in C# you use the -= to "subtract" your delegate from the list of listeners.

En Xamarin.Android, los eventos se usan con frecuencia para informar a los objetos cuando un usuario realiza una acción en un control de interfaz de usuario.In Xamarin.Android, events are often used for notifying objects when a user does something to a UI control. Normalmente, un control de interfaz de usuario tendrá miembros que se definen con la palabra clave event; asocie los delegados con estos miembros para suscribirse a eventos de ese control de interfaz de usuario.Normally, a UI control will have members that are defined using the event keyword; you attach your delegates to these members to subscribe to events from that UI control.

Para suscribirse a un evento:To subscribe to an event:

  1. Cree un objeto delegado que haga referencia al método que desea invocar cuando se produce el evento.Create a delegate object that refers to the method that you want to be invoked when the event occurs.

  2. Use el operador += para asociar el delegado al evento al que se va a suscribir.Use the += operator to attach your delegate to the event you are subscribing to.

En el ejemplo siguiente se define un delegado (con el uso explícito de la palabra clave delegate) para suscribirse a los clics de botón.The following example defines a delegate (with an explicit use of the delegate keyword) to subscribe to button clicks. Este controlador de clics de botón inicia una nueva actividad:This button-click handler starts a new activity:

startActivityButton.Click += delegate {
    Intent intent = new Intent (this, typeof (MyActivity));
    StartActivity (intent);
};

Sin embargo, también puede utilizar una expresión lambda para registrar eventos, omitiendo por completo la palabra clave delegate.However, you also can use a lambda expression to register for events, skipping the delegate keyword altogether. Por ejemplo:For example:

startActivityButton.Click += (sender, e) => {
    Intent intent = new Intent (this, typeof (MyActivity));
    StartActivity (intent);
};

En este ejemplo, el objeto startActivityButton tiene un evento que espera un delegado con una firma de método determinada: uno que acepta argumentos de remitente y evento y devuelve un valor nulo.In this example, the startActivityButton object has an event that expects a delegate with a certain method signature: one that accepts sender and event arguments and returns void. No obstante, como no queremos ocasionar la molestia de definir de forma explícita dicho delegado o su método, declaramos la firma del método con (sender, e) y usamos una expresión lambda para implementar el cuerpo del controlador de eventos.However, because we don't want to go to the trouble to explicitly define such a delegate or its method, we declare the signature of the method with (sender, e) and use a lambda expression to implement the body of the event handler. Tenga en cuenta que tenemos que declarar esta lista de parámetros aunque usemos los parámetros sender y e.Note that we have to declare this parameter list even though we aren't using the sender and e parameters.

Es importante recordar que se puede anular la suscripción de un delegado (con el operador -=), pero no se puede anular la suscripción de una expresión lambda; tratar de hacerlo puede causar fugas de memoria.It is important to remember that you can unsubscribe a delegate (via the -= operator), but you cannot unsubscribe a lambda expression – attempting to do so can cause memory leaks. Use la forma de expresión lambda del registro de eventos solo si no se anula la suscripción del controlador al evento.Use the lambda form of event registration only when your handler will not unsubscribe from the event.

Normalmente, las expresiones lambda se usan para declarar controladores de eventos en el código de Xamarin.Android.Typically, lambda expressions are used to declare event handlers in Xamarin.Android code. Esta forma abreviada de declarar controladores de eventos puede parecer críptica al principio, pero ahorra una gran cantidad de tiempo al leer y escribir código.This shorthand way to declare event handlers may seem cryptic at first, but it saves an enormous amount of time when you are writing and reading code. Cuando se familiarice más, se habituará a reconocer este patrón, que ocurre con frecuencia en el código de Xamarin.Android, y podrá dedicar más tiempo a pensar en la lógica de negocios de su aplicación y menos tiempo a repasar la sobrecarga sintáctica.With increasing familiarity, you become accustomed to recognizing this pattern (which occurs frequently in Xamarin.Android code), and you spend more time thinking about the business logic of your application and less time wading through syntactical overhead.

Programación asincrónicaAsynchronous Programming

La programación asincrónica es una manera de mejorar la capacidad de respuesta general de la aplicación.Asynchronous programming is a way to improve the overall responsiveness of your application. Las características de la programación asincrónica permiten que el resto del código de la aplicación continúe ejecutándose mientras que una operación larga bloquea alguna parte de la aplicación.Asynchronous programming features make it possible for the rest of your app code to continue running while some part of your app is blocked by a lengthy operation. El acceso a la Web, el procesamiento de imágenes y la lectura y escritura de archivos son ejemplos de operaciones que pueden causar que una aplicación parezca inmovilizada si no se escribe de forma asincrónica.Accessing the web, processing images, and reading/writing files are examples of operations that can cause an entire app to appear to freeze up if it is not written asynchronously.

C# incluye compatibilidad a nivel de lenguaje con la programación asincrónica mediante las palabras clave async y await.C# includes language-level support for asynchronous programming via the async and await keywords. Estas características del lenguaje facilitan bastante la escritura de código que realiza tareas de ejecución prolongada sin bloquear el subproceso principal de la aplicación.These language features make it very easy to write code that performs long-running tasks without blocking the main thread of your application. En resumen, use la palabra clave async en un método para indicar que el código del método debe ejecutarse de forma asincrónica y no bloquear el subproceso del autor de la llamada.Briefly, you use the async keyword on a method to indicate that the code in the method is to run asynchronously and not block the caller's thread. Use la palabra clave await para llamar a métodos marcados como async.You use the await keyword when you call methods that are marked with async. El compilador interpreta await como el punto al que se va a mover la ejecución del método a un subproceso en segundo plano (se devuelve una tarea al autor de la llamada).The compiler interprets the await as the point where your method execution is to be moved to a background thread (a task is returned to the caller). Una vez completada esta tarea, la ejecución del código se reanuda en el subproceso del autor de la llamada en el punto await del punto, devolviendo los resultados de la llamada async.When this task completes, execution of the code resumes on the caller's thread at the await point in your code, returning the results of the async call. Por convención, los métodos que se ejecutan de forma asincrónica llevan el sufijo Async en sus nombres.By convention, methods that run asynchronously have Async suffixed to their names.

En las aplicaciones de Xamarin.Android, async y await suelen usarse para liberar el subproceso de la interfaz de usuario, para que pueda responder a la entrada del usuario (como pulsar un botón Cancelar) mientras tiene lugar una operación de ejecución prolongada en una tarea en segundo plano.In Xamarin.Android applications, async and await are typically used to free up the UI thread so that it can respond to user input (such as the tapping of a Cancel button) while a long-running operation takes place in a background task.

En el ejemplo siguiente, un controlador de eventos de clics de botón resulta en una operación asincrónica para descargar una imagen de la Web:In the following example, a button click event handler causes an asynchronous operation to download an image from the web:

downloadButton.Click += downloadAsync;
...
async void downloadAsync(object sender, System.EventArgs e)
{
    webClient = new WebClient ();
    var url = new Uri ("http://photojournal.jpl.nasa.gov/jpeg/PIA15416.jpg");
    byte[] bytes = null;

    bytes = await webClient.DownloadDataTaskAsync(url);

    // display the downloaded image ...

En este ejemplo, cuando el usuario hace clic en el control downloadButton, el controlador de eventos downloadAsync crea un objeto WebClient y un objeto Uri para capturar una imagen de la dirección URL especificada.In this example, when the user clicks the downloadButton control, the downloadAsync event handler creates a WebClient object and a Uri object to fetch an image from the specifed URL. A continuación, llama al método DownloadDataTaskAsync del objeto WebClient con esta dirección URL para recuperar la imagen.Next, it calls the WebClient object's DownloadDataTaskAsync method with this URL to retrieve the image.

Tenga en cuenta que la declaración del método downloadAsync va precedida de la palabra clave async para indicar que se ejecutará de forma asincrónica y que devolverá una tarea.Notice that the method declaration of downloadAsync is prefaced by the async keyword to indicate that it will run asynchronously and return a task. Tenga en cuenta también que la llamada a DownloadDataTaskAsync va precedida de la palabra clave await.Also note that the call to DownloadDataTaskAsync is preceded by the await keyword. La aplicación mueve la ejecución del controlador de eventos (a partir del punto en que await aparece) a un subproceso en segundo plano hasta que DownloadDataTaskAsync se completa y realiza la devolución.The app moves the execution of the event handler (starting at the point where await appears) to a background thread until DownloadDataTaskAsync completes and returns. Mientras tanto, el subproceso de la interfaz de usuario de la aplicación puede responder aún a la entrada del usuario y activar los controladores de eventos para los otros controles.Meanwhile, the app's UI thread can still respond to user input and fire event handlers for the other controls. Cuando DownloadDataTaskAsync se completa (que puede tardar varios segundos), la ejecución se reanuda donde la variable bytes está establecida en el resultado de la llamada a DownloadDataTaskAsync, y el resto del código del controlador de eventos muestra la imagen descargada en el subproceso del autor de la llamada (interfaz de usuario).When DownloadDataTaskAsync completes (which may take several seconds), execution resumes where the bytes variable is set to the result of the call to DownloadDataTaskAsync, and the remainder of the event handler code displays the downloaded image on the caller's (UI) thread.

Para obtener una introducción a async/await en C#, vea el tema Programación asincrónica con Async y Await.For an introduction to async/await in C#, see the Asynchronous Programming with Async and Await topic. Para más información sobre la compatibilidad de Xamarin con las características de la programación asincrónica, vea Información general sobre la compatibilidad con Async.For more information about Xamarin support of asynchronous programming features, see Async Support Overview.

Diferencias de palabras clavesKeyword Differences

Muchas de las palabras claves del lenguaje de Java también se usan en C#.Many language keywords used in Java are also used in C#. También hay una serie de palabras clave de Java que tienen un equivalente en C# pero con un nombre distinto, como se indica en esta tabla:There are also a number of Java keywords that have an equivalent but differently-named counterpart in C#, as listed in this table:

JavaJava C#C# DescripciónDescription
boolean boolbool Se utiliza para declarar los valores booleanos true y false.Used for declaring the boolean values true and false.
extends : Precede a la clase e interfaces de las que se hereda.Precedes the class and interfaces to inherit from.
implements : Precede a la clase e interfaces de las que se hereda.Precedes the class and interfaces to inherit from.
import usingusing Importa tipos de un espacio de nombres, que también se usa para crear un alias de espacio de nombres.Imports types from a namespace, also used for creating a namespace alias.
final sealedsealed Evita la derivación de clase; impide que se invaliden los métodos y las propiedades de la clase derivada.Prevents class derivation; prevents methods and properties from being overridden in derived classes.
instanceof isis Evalúa si un objeto es compatible con un tipo determinado.Evaluates whether an object is compatible with a given type.
native externextern Declara un método que se implementa externamente.Declares a method that is implemented externally.
package namespacenamespace Declara un ámbito para un conjunto de objetos relacionados.Declares a scope for a related set of objects.
T... params Tparams T Especifica un parámetro de método que toma un número variable de argumentos.Specifies a method parameter that takes a variable number of arguments.
super basebase Se usa para acceder a los miembros de la clase principal desde una clase derivada.Used to access members of the parent class from within a derived class.
synchronized locklock Ajusta una sección crítica del código con lanzamiento y adquisición de bloqueo.Wraps a critical section of code with lock acquisition and release.

Además, hay muchas palabras clave que son exclusivas de C# y que no tienen homólogo en Java.Also, there are many keywords that are unique to C# and have no counterpart in Java. El código de Xamarin.Android suele usar las siguientes palabras clave de C# (es útil hacer referencia a esta tabla al leer código de ejemplo de Xamarin.Android):Xamarin.Android code often makes use of the following C# keywords (this table is useful to refer to when you are reading through Xamarin.Android sample code):

C#C# DescripciónDescription
asas Realiza conversiones entre tipos de referencia compatibles o tipos que aceptan valores NULL.Performs conversions between compatible reference types or nullable types.
asyncasync Especifica que un método o una expresión lambda son asincrónicos.Specifies that a method or lambda expression is asynchronous.
awaitawait Suspende la ejecución de un método hasta que se completa una tarea.Suspends the execution of a method until a task completes.
bytebyte Tipo entero de 8 bits sin signo.Unsigned 8-bit integer type.
delegatedelegate Se utiliza para encapsular un método o un método anónimo.Used to encapsulate a method or anonymous method.
enumenum Declara una enumeración, un conjunto de constantes con nombre.Declares an enumeration, a set of named constants.
eventevent Declara un evento en una clase de publicador.Declares an event in a publisher class.
fixedfixed Impide la reubicación de una variable.Prevents a variable from being relocated.
get Define un método de descriptor de acceso que recupera el valor de una propiedad.Defines an accessor method that retrieves the value of a property.
inin Permite que un parámetro acepte un tipo menos derivado en una interfaz genérica.Enables a parameter to accept a less derived type in a generic interface.
objectobject Un alias para el tipo Object en .NET Framework.An alias for the Object type in the .NET framework.
outout Modificador de parámetros o declaración de parámetros de tipo genérico.Parameter modifier or generic type parameter declaration.
overrideoverride Amplía o modifica la implementación de un miembro heredado.Extends or modifies the implementation of an inherited member.
partialpartial Declara que una definición se va a dividir en varios archivos o que se va a separar una definición de método de su implementación.Declares a definition to be split into multiple files, or splits a method definition from its implementation.
readonlyreadonly Declara que un miembro de clase puede asignarse solo en el momento de la declaración o mediante el constructor de clase.Declares that a class member can be assigned only at declaration time or by the class constructor.
refref Hace que un argumento se pase por referencia en lugar de por valor.Causes an argument to be passed by reference rather than by value.
setset Define un método de descriptor de acceso que establece el valor de una propiedad.Defines an accessor method that sets the value of a property.
stringstring Alias para el tipo String en .NET Framework.Alias for the String type in the .NET framework.
structstruct Un tipo de valor que encapsula un grupo de variables relacionadas.A value type that encapsulates a group of related variables.
typeoftypeof Obtiene el tipo de un objeto.Obtains the type of an object.
varvar Declara una variable local con tipo implícito.Declares an implicitly-typed local variable.
valorvalue Hace referencia al valor que el código de cliente desea asignar a una propiedad.References the value that client code wants to assign to a property.
virtualvirtual Permite la invalidación de un método en una clase derivada.Allows a method to be overridden in a derived class.

Interoperación con código de Java existenteInteroperating with Existing Java Code

Si dispone de una funcionalidad de Java existente que no desea convertir a C#, puede volver a usar las bibliotecas de Java existentes en las aplicaciones de Xamarin.Android con estas dos técnicas:If you have existing Java functionality that you do not want to convert to C#, you can reuse your existing Java libraries in Xamarin.Android applications via two techniques:

  • Crear una biblioteca de enlaces de Java: con este enfoque, se utilizan las herramientas de Xamarin para generar contenedores de C# que incluyen tipos de Java.Create a Java Bindings Library – Using this approach, you use Xamarin tools to generate C# wrappers around Java types. Estos contenedores se denominan enlaces.These wrappers are called bindings. Como resultado, la aplicación de Xamarin.Android puede usar el archivo .jar con una llamada a estos contenedores.As a result, your Xamarin.Android application can use your .jar file by calling into these wrappers.

  • Java Native Interface: Java Native Interface (JNI) es un marco de trabajo que permite a las aplicaciones de C# llamar al código de Java o recibir llamadas de este código.Java Native Interface – The Java Native Interface (JNI) is a framework that makes it possible for C# apps to call or be called by Java code.

Para obtener más información sobre estas técnicas, vea Java Integration Overview (Información general sobre la integración de Java).For more information about these techniques, see Java Integration Overview.

Más informaciónFor Further Reading

La guía de programación de C# es un recurso muy útil para iniciarse en el aprendizaje del lenguaje de programación C#, y puede usar la referencia de C# para buscar características particulares del lenguaje C#.The MSDN C# Programming Guide is a great way to get started in learning the C# programming language, and you can use the C# Reference to look up particular C# language features.

De la misma forma que el conocimiento de Java tiene al menos tanto que ver con la familiaridad con las bibliotecas de clases de Java como con el conocimiento del lenguaje Java, el conocimiento práctico de C# requiere alguna familiaridad con .NET Framework.In the same way that Java knowledge is at least as much about familiarity with the Java class libraries as knowing the Java language, practical knowledge of C# requires some familiarity with the .NET framework. El paquete de aprendizaje Pasar a C# y .NET Framework, para desarrolladores de Java de Microsoft es un buen recurso para aprender más sobre .NET Framework desde la perspectiva de Java (al mismo tiempo que se adquiere un conocimiento más profundo de C#).Microsoft's Moving to C# and the .NET Framework, for Java Developers learning packet is a good way to learn more about the .NET framework from a Java perspective (while gaining a deeper understanding of C#).

Cuando esté listo para abordar el primer proyecto de Xamarin.Android en C#, nuestra serie Hello, Android puede facilitar la compilación de la primera aplicación de Xamarin.Android y ayudar a profundizar los conocimientos de los aspectos fundamentales del desarrollo de aplicaciones de Android con Xamarin.When you are ready to tackle your first Xamarin.Android project in C#, our Hello, Android series can help you build your first Xamarin.Android application and further advance your understanding of the fundamentals of Android application development with Xamarin.

ResumenSummary

Este artículo ofrece una introducción al entorno de programación de C# en Xamarin.Android desde la perspectiva de los desarrolladores de Java.This article provided an introduction to the Xamarin.Android C# programming environment from a Java developer's perspective. Se indican las similitudes entre C# y Java, además de explicar sus diferencias prácticas.It pointed out the similarities between C# and Java while explaining their practical differences. Aborda los ensamblados y los espacios de nombres, se explica cómo importar tipos externos y se ofrece información general sobre las diferencias de los modificadores de acceso, los genéricos, la derivación de clases, la llamada a métodos de clases base, la invalidación de métodos y el control de eventos.It introduced assemblies and namespaces, explained how to import external types, and provided an overview of the differences in access modifiers, generics, class derivation, calling base-class methods, method overriding, and event handling. Se presentan características de C# que no están disponibles en Java, como las propiedades, la programación asincrónica de async/await, las expresiones lambda, los delegados de C# y el sistema de control de eventos de C#.It introduced C# features that are not available in Java, such as properties, async/await asynchronous programming, lambdas, C# delegates, and the C# event handling system. Incluye tablas de palabras claves importantes de C#, se explica cómo interoperar con bibliotecas de Java existentes y se ofrecen vínculos a documentación relacionada realizar un estudio adicional.It included tables of important C# keywords, explained how to interoperate with existing Java libraries, and provided links to related documentation for further study.