Skip to content

Guía de traducción de Java a C# para Unity

jbasdom edited this page Apr 29, 2019 · 60 revisions

Esta es una pequeña guía que explica las dificultades que hemos encontrado al traducir código Java a C# para Unity y cómo los hemos resuelto. Está organizada según el orden alfabético de las expresiones encontradas:

Expresión Java Expresión C#/Unity Explicaciones y comentarios
@Override override En C# el sobreescribir no es una anotación sino un modificador del método. Hay que tener en cuenta que el método sea abstracto o virtual para que se pueda sobreescribir luego
(T) as T Esta es la forma elegante de hacer el casting en C#, aunque para castear entre tipos por defecto no funciona así que mejor lo de lo los paréntesis
<A, B> Tuple<A, B> Aunque en la versión más actual de C#/Unity se pueden hacer tuplas directamente así (A a, B b)
A<? extends T> A where R : T Son las llamadas "restricciones de tipo genérico". Tiene que ver con el tema de la covarianza y contravarianza de tipos
A.class.getSimpleName() nameof(A) Creo que devuelve el nombre corto de la clase
A... params A[] Estos son los llamados argumentos variables (varargs) que puede recibir un método y que existen tanto en Java como en C#
Arrays (asList) ToList Método que tienen todos los arrays en C# cuando se usa System.Linq
ArrayList List El ArrayList que tiene C# desde su creación está obsoleto hoy día
boolean bool Ojo que es muy fácil de olvidarse de ir cambiando esto
Character Char Tipo para caracteres alfanuméricos
Collection ICollection Importante recordar que los interfaces en C# empiezan por I
Collection (size) ICollection (Count) Además Count es una propiedad y no lleva paréntesis
Collections (unmodifiableSet) - Por ahora podemos ignorar la transformación de conjuntos a conjuntos inmutables porque ReadOnlyCollection sólo funciona sobre listas. Si lo vemos necesario una opción será crear nuestro propio tipo ReadOnlySet. Parece que ya hay una ampliación de C# donde existe ImmutableHashSet.
Clonable IClonable Parece la interfaz equivalente
equals Equals (x2) Lo suyo es crear dos métodos, un Equals(T loquesea) y otro Equals(object obj) que llama al primer método
enum Clase inmutable con sus ejemplares estáticos y de sólo lectura Aquí hablan de enum + extension methods + custom attributes, con un ejemplo y una explicación detallada de cómo hacer enumerados tan expresivos como los de Java
extends : El primero en la lista de tipos separados por comas puede ser una clase abstracta, el resto interfaces
for ( : ) foreach ( in ) Importante para todo objeto que vaya a ser comparado con otro
hashCode GetHashCode Importante para todo objeto que vaya a ser comparado con otro
HashMap Dictionary Con LinkedHashMap también traduciríamos a Dictionary, entiendo. Aunque existen algunas diferencias a la hora de usarlo
instanceof is En C# is es preferible a typeof porque no exige que el tipo sea exacto, admite subclases
interface (static final) static class (static readonly) En C# no se pueden poner constantes en las interfaces
Integer.parseInt(s) int.Parse(s) Parsea de string a int
Iterator IEnumerator Misma utilidad pero con algunas funciones diferentes
LinkedHashSet HashSet Es una conversión aproximada, únicamente. Una alternativa interesante para obtener las ventajas de una lista enlazada sería crear nuestro propio tipo LinkedHashSet
List IList Importante recordar que los interfaces en C# empiezan por I
List (isEmpty) IList (Count == 0) Porque no hay método equivalente
Map IDictionary Importante recordar que los interfaces en C# empiezan por I
Map (keySet) IDictionary (Keys) El atributo equivalente en C#
d = (NombreClase)c.newInstance(); d = (NombreClase)Activator.CreateInstance(typeof(Type)) c es una variable de tipo Class y d es una variable del tipo que quieres crear
Object object En C# object en minúscula es el alias recomendado para System.Object
Object (getClass) Object (GetType) El equivalente en C#. Luego tienes el atributo Name para conseguir el nombre
Reader TextReader Y luego se usan subclases como StringReader o StreamReader
RuntimeException Exception Porque creo que en C# no hay obligación de capturar las excepciones en general
ReplaceAll() Replace() Equivalente C# al método ReplaceAll() de la clase String de Java
Set ISet Importante recordar que los interfaces en C# empiezan por I
Set (addAll) ISet (UnionWith) Parece el método equivalente
static final static readonly En general, aunque para tipos básicos que sean "constantes de verdad" se puede usar const
static { .... } static NameOfTheClass() En C# hay que implementar un constructor estático
String string En C# string en minúscula es el alias recomendado para System.String
super() : base() Además esto se añade a la cabecera del método, antes del cuerpo del método
System.out (print/println) System.Diagnostics.Debug (Write/WriteLine) Si se quiere escribir en la consola de Unity es con print (alias de Debug.Log)
implements Serializable [Serializable] Los corchetes deben ir dentro del namespace y encima de la clase correspondiente
... (como paso por parámetro) params object[] p "params" es una palabra reservada de C# y "object" puede cambiarse por el tipo correspondiente
Class.this this StackOverflow recomienda preferiblemente no recurrir a esto
private static AtomicInteger c = new AtomicInteger(0) private static int c = 0 Declarar como una variable int normal pero obligatorio que sea estática
Complmentario a la entrada anterior: c.incrementAndGet() Interlocked.Increment(ref c) Hay que añadir "using System.Threading" y añadir la palabra reservada "ref" delate de la variable cuando vaya a usarse
<> T[] function/void(arguments){} T[] function/void<>(arguments){} Hay que cambiar de sitio la de claración del tipo
Pattern regex = Pattern.compile(string); Regex rx = new Regex(@string, RegexOptions.Compiled); El equivalente C# a la clase Pattern de Java
StringBuffer var StringBuilder El equivalente C# de Java StringBuffer, aunque el de C# no está preparado para trabajar con hilos
printStackTrace() ToString() Sin más complicaciones
Config.class.getName() typeof(Config).Name Equivalente C#
input = new URL(file).openStream(); input = File.OpenText(file) Aunque existe una clase URI en c#, creemos que es más fácil trabajar con strings sin más. Input es una variable de tipo TextReader y file es un string con la ruta del archivo a abrir
File name = new File(path) FileStram name = File.Create(path) Versión C#
[En referencia a la entrada anterior] name.exists() File.Exists(name.ToString()) En C#, FileStream no tiene la función Exists, la tiene File, así que hay que hacer una pequeña ñapa
[Referenciando también a File] name.getCanonicalFile().toString() Path.GetFullPath(name.ToString()) Lo mismo que en la entrada anterior, hay que hacer una pequeña modificación para que funcione
(Map<T,T>) map.get(key) (Dictionary<T,T>) dictionary[key] Equivalente C#
Clone this wiki locally