-
Notifications
You must be signed in to change notification settings - Fork 1
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# |