Los diseñadores de Java odian la complejidad de C ++, por lo que Java es muy conciso y GC también hace que la administración de memoria sea muy conveniente. C # está interesado en la tecnología de máquina virtual y GC de Java, y espera integrar varios lenguajes importantes de Microsoft en .NET. . Por lo tanto, C# no es simple ni complejo en términos de lenguaje.
Las ideas de diseño de los dos lenguajes también son diferentes: Java es un lenguaje compilado e interpretado, mientras que C# es un lenguaje compilado y luego compilado y ejecutado. Java no tiene delegados, C# tiene delegados. Java tiende a usar Interface para implementar funciones delegadas, mientras que en C#, la clase abstracta juega un papel más importante que la interfaz.
Java sigue las reglas de nomenclatura de camellos y C# sigue las reglas de nomenclatura de Pascal. Pero ahora cada vez más personas de Java están comenzando a usar C# y, al mismo tiempo, están llevando las reglas de nomenclatura de camellos a C#, lo que puede hacer que el código C# sea cada vez más difícil de leer. ¿Por qué C# no siguió a camel en primer lugar? No veo nada malo en la convención de nomenclatura de camellos.
1. Nombre de clase. Esta y clase interna.
En Java, a menudo vemos un uso similar al nombre de clase. Esta es la instancia del objeto actual. ¿Por qué aparece el nombre de la clase delante? Los programadores de C# se sentirán confundidos por esto.
En Java, las clases internas se usan en muchos lugares, e incluso se puede acceder a los miembros de la clase externa en la clase interna. En este momento, al usar esto en la clase interna, surgirá la pregunta de quién es y qué es. significa. ¿Es la instancia de objeto actual de la clase interna o la instancia de objeto actual de la clase externa?
En Java, al agregar el nombre de la clase externa delante de esto, significa que la instancia de objeto actual de la clase externa se usa en la clase interna.
Veamos un ejemplo a continuación.
//Definición de clase externa
clase pública clase exterior {
//Definición de clase interna
clase privada InnerClass
{
// No hay ningún miembro de identificación definido en la clase interna. Aquí accedemos a los miembros de la clase externa.
public int getId(){ return OuterClass.this.id }
setId público vacío (int id) { OuterClass.this.id = id;}
// El nombre del miembro se define en la clase interna y se accede directamente a los miembros de la clase interna. De forma predeterminada, esto accede a los miembros de la clase actual.
nombre de cadena privada;
cadena pública getName() { devolver este.nombre;}
// Puedes agregar el nombre de una clase interna delante de esto
setName público vacío (nombre de cadena) {InnerClass.this.name = nombre;}
// La clase interna también puede acceder a miembros con el mismo nombre en la clase externa, y es necesario agregar el nombre de la clase externa.
cadena pública getOuterName() { return OuterClass.this.name;}
public void setOuterName (nombre de cadena) {OuterClass.this.name = nombre;}
@Anular
cadena pública a cadena ()
{
return "Id: " + this.getId() + ", Nombre interno: " + this.getName() + ", Nombre externo: " + this.getOuterName();
}
}
//ID de miembro y nombre definidos en la clase externa
identificación interna privada;
nombre de cadena privada;
instancia interna privada de InnerClass;
clase externa pública()
{
this.innerInstance = nueva Clase Interna();
this.innerInstance.setId(20);
this.innerInstance.setName("Tom");
this.innerInstance.setOuterName("Alicia");
}
cadena pública a cadena ()
{
devolver this.innerInstance.toString();
}
}
En C#, las clases se dividen en clases anidadas y clases no anidadas. La primera es una clase declarada dentro de otros tipos de datos. Esta última es una clase definida directamente en un determinado espacio de nombres. Las clases anidadas rara vez se definen en C#.
Las clases no integradas solo permiten el uso de controles de acceso públicos e internos, mientras que las clases integradas permiten el uso de los cinco caracteres de control de acceso: privado, protegido, interno protegido, público e interno. Las clases internas también pueden acceder a todos los métodos de la clase externa, incluidos los métodos de instancia y los métodos privados, pero deben pasar explícitamente una instancia de la clase externa.
Las clases internas en C# pueden usar tipos y métodos estáticos definidos por clases externas, pero no pueden usar directamente métodos de instancia de clases externas. Por lo tanto, el problema anterior no existe.
En C#, la clase externa actúa más como un espacio de nombres para la clase interna. Siempre que el control de acceso lo permita, puede usar el siguiente método para crear una instancia del objeto de clase interna.
OuterClass.InnerClass obj = new OuterClass.InnerClass(); Esta instancia no tiene relación directa con ninguna instancia de la clase externa. Similar a las clases internas estáticas en Java.
2. Nombre de clase.clase y tipo
En Java, a menudo vemos el uso de class name.class. Este uso es equivalente a typeof (nombre de clase) en C#, que se utiliza para obtener la referencia de instancia de objeto de tipo.
En Java, cada clase tiene un objeto Clase correspondiente. Cuando se escribe y compila una clase, se genera un objeto Clase en el archivo .class generado para representar la información de tipo de la clase. Tres formas de obtener instancias de clase:
Obtenga la instancia de clase del objeto llamando al método getClass() de la instancia del objeto.
Utilice el método estático forName() de Class para obtener una instancia de Class utilizando el nombre de la clase. Class.forName (xxx.xx.xx) devuelve una clase. Su función es pedirle a la JVM que busque y cargue la clase especificada, lo que significa que la JVM ejecutará el segmento de código estático de la clase.
Obtenga la instancia de clase usando el nombre de clase .calss. Para clases de encapsulación de tipos de datos básicos, también puede usar .TYPE para obtener la instancia de clase del tipo de datos básico correspondiente.
La forma de obtener una instancia de un objeto de tipo en C# es más sencilla y clara.
Se obtiene llamando al método GetType() de la instancia de datos. Este método se hereda de Object, por lo que cualquier objeto en C# tiene el método GetType(), x.GetType(), donde x es el nombre de la variable.
x en typeof(x) debe ser un nombre de clase específico, un nombre de tipo, etc., y no puede ser un nombre de variable.
A través del método estático System.Type.GetType() de System.Type.
3. clase anónima
En Java, las clases anónimas también se utilizan con más frecuencia. Por ejemplo, en Android, al implementar la supervisión de botones, a menudo se ve código como este.
@Anular
vacío público al hacer clic (Ver arg0) {
Intención intención = nueva Intención (MainActivity.this, ActivityFrameLayout.class);
setTitle("Diseño de marco");
iniciarActividad( intención );
}
};
Aquí, OnClickListenter es en realidad una interfaz. ¿Se puede utilizar la interfaz para crear instancias de objetos? Por supuesto que no.
Por lo tanto, Java crea automáticamente una clase anónima que implementa la interfaz aquí. Lo que creamos es en realidad una instancia de objeto de esta clase anónima.
La ventaja de esto es que no tenemos que definir una clase que se use solo una vez y luego crear instancias de objetos a través de esta clase, lo que simplifica el desarrollo del programa.
Por ejemplo, tenemos la siguiente interfaz.
instancia.onClick(); En C#, no usaremos este formulario en absoluto. A través de la delegación, se puede lograr la misma función de manera muy simple.
Tenga en cuenta que no hay delegados en Java.
Si imprimimos el tipo de esta instancia, verá el tipo real de esta clase anónima.
El concepto de atributos debería ser familiar para todos. Las funciones de los miembros de la clase pueden acceder libremente a cualquier miembro de atributo de esta clase. Sin embargo, es más problemático acceder a las propiedades de otra clase desde una clase, por lo que muchas veces usamos los métodos Getxxx y Setxxx, que parecen extremadamente poco naturales. Por ejemplo, en Java o C++, el código es así:
Sin embargo, en C#, dichos métodos están "atribuidos". El mismo código, en C#, se convierte en:
foo.tamaño++;
etiqueta.font.bold = verdadero;
Como puede ver, C# es obviamente más fácil de leer y comprender. También podemos ver una situación similar en el código de subrutina de este "método de propiedad":
Java/C++:
DO#:
Para distinguir este tipo de método con atributos de los miembros con atributos de la clase, los miembros con atributos se denominan "campos" en C#, y "atributo" se convierte en el nombre especial de este "método con atributos". Por cierto, de hecho, este tipo de método de atributo se encuentra a menudo en VB y DELPHI. En VB, también se le llama atributo. Además, Get y Set deben aparecer en pares en C#. Una propiedad no puede tener solo Get sin Set (en Java y C++, solo puede tener Get o solo Set. La ventaja de hacer esto en C# es que es fácil de hacer). mantener Si desea modificar un determinado atributo, prestará atención a los métodos Get y Set al mismo tiempo y los modificará al mismo tiempo. No cambiará esto y se olvidará de eso.
5. Mecanismo de indexación de objetos (Indexador)
El mecanismo de indexación de objetos se introdujo en C#. Para decirlo más claramente, un índice de objetos es en realidad una matriz de objetos. Hablemos de ello en relación con las propiedades de la sección anterior. Las propiedades deben ocultar los métodos Get y Set, pero en el mecanismo de índice, los métodos Get o Set de cada objeto están expuestos. Por ejemplo, el siguiente ejemplo ilustra este punto más claramente. Lo anterior presenta las diferencias entre C# y Java.
historias [índice] = valor;
}
}
}
...
}
Lo anterior presenta las diferencias entre C# y JAVA. Espero que le resulte útil comprender C# y JAVA.