Les concepteurs de Java détestent la complexité du C++, donc Java est très concis et GC rend également la gestion de la mémoire très pratique. C# s'intéresse au GC et à la technologie des machines virtuelles de Java et espère intégrer plusieurs langages Microsoft majeurs dans .NET. . Par conséquent, C# n’est ni simple ni même complexe en termes de langage.
Les idées de conception des deux langages sont également différentes. Java est un langage compilé et interprété, tandis que C# est un langage compilé puis compilé et exécuté. Java n'a pas de délégués, C# a des délégués. Java a tendance à utiliser Interface pour implémenter des fonctions déléguées, tandis qu'en C#, la classe abstraite joue un rôle plus important que l'interface.
Java suit les règles de dénomination Camel et C# suit les règles de dénomination Pascal. Mais maintenant, de plus en plus d'utilisateurs Java commencent à utiliser C#, et en même temps, ils apportent les règles de dénomination des chameaux en C#, ce qui peut rendre le code C# de plus en plus difficile à lire. Pourquoi C# n'a-t-il pas suivi Camel en premier lieu ? Je ne vois rien de mal à propos de la convention de dénomination des chameaux.
1. Nom de la classe.this et classe interne
En Java, nous voyons souvent une utilisation similaire à class name.this. Il s'agit de l'instance d'objet actuelle. Pourquoi le nom de la classe apparaît-il devant elle ? Les programmeurs C# seront déroutés par cela.
En Java, les classes internes sont utilisées à de nombreux endroits, et les membres de la classe externe sont même accessibles dans la classe interne. À ce stade, lors de leur utilisation dans la classe interne, la question se posera de savoir de qui il s'agit et de quoi il s'agit. signifie. S'agit-il de l'instance d'objet actuelle de la classe interne ou de l'instance d'objet actuelle de la classe externe ?
En Java, en ajoutant le nom de classe de la classe externe devant cela, cela signifie que l'instance d'objet actuelle de la classe externe est utilisée dans la classe interne.
Regardons un exemple ci-dessous.
//Définition de classe externe
classe publique OuterClass {
//Définition de la classe interne
classe privée InnerClass
{
// Aucun membre id n'est défini dans la classe interne. Ici, nous accédons aux membres de la classe externe.
public int getId(){ return OuterClass.this.id }
public void setId (int id) { OuterClass.this.id = id;}
// Le membre name est défini dans la classe interne et les membres de la classe interne sont directement accessibles. Par défaut, cela accède aux membres de la classe actuelle.
nom de chaîne privé ;
public String getName() { return this.name;}
// Vous pouvez ajouter le nom d'une classe interne devant ceci
public void setName (nom de chaîne) { InnerClass.this.name = nom;}
// La classe interne peut également accéder aux membres portant le même nom dans la classe externe, et le nom de la classe externe doit être ajouté.
public String getOuterName() { return OuterClass.this.name;}
public void setOuterName (nom de chaîne) { OuterClass.this.name = nom;}
@Outrepasser
chaîne publique versString()
{
return "Id : " + this.getId() + ", Nom interne : " + this.getName() + ", Nom externe : " + this.getOuterName();
}
}
//Identifiant et nom du membre définis dans la classe externe
identifiant international privé ;
nom de chaîne privé ;
InnerInstance privée InnerClass ;
classe externe publique()
{
this.innerInstance = new InnerClass();
this.innerInstance.setId(20);
this.innerInstance.setName("Tom");
this.innerInstance.setOuterName("Alice");
}
chaîne publique versString()
{
renvoie this.innerInstance.toString();
}
}
En C#, les classes sont divisées en classes imbriquées et classes non imbriquées. La première est une classe déclarée dans d'autres types de données. Cette dernière est une classe définie directement dans un certain espace de noms. Les classes imbriquées sont rarement définies en C#.
Les classes non intégrées autorisent uniquement l'utilisation de contrôles d'accès publics et internes, tandis que les classes intégrées autorisent l'utilisation des cinq caractères de contrôle d'accès : privé, protégé, interne protégé, public et interne. Les classes internes peuvent également accéder à toutes les méthodes de la classe externe, y compris les méthodes d'instance et les méthodes privées, mais elles doivent transmettre explicitement une instance de la classe externe.
Les classes internes en C# peuvent utiliser des types et des méthodes statiques définies par des classes externes, mais ne peuvent pas utiliser directement les méthodes d'instance de classes externes. Par conséquent, le problème ci-dessus n'existe pas.
En C#, la classe externe agit davantage comme un espace de noms pour la classe interne. Tant que le contrôle d'accès le permet, vous pouvez utiliser la méthode suivante pour créer une instance de l'objet de classe interne.
OuterClass.InnerClass obj = new OuterClass.InnerClass(); Cette instance n'a aucune relation directe avec une instance de la classe externe. Semblable aux classes internes statiques en Java.
2. Nom de la classe, classe et type
En Java, nous voyons souvent l'utilisation de la classe name.class. Cette utilisation est équivalente à typeof (nom de la classe) en C#, qui est utilisée pour obtenir la référence d'instance d'objet de type du type.
En Java, chaque classe possède un objet Class correspondant. Lorsqu'une classe est écrite et compilée, un objet Class est généré dans le fichier .class généré pour représenter les informations de type de la classe. Trois façons d'obtenir des instances de classe :
Obtenez l'instance Class de l'objet en appelant la méthode getClass() de l'instance de l'objet.
Utilisez la méthode statique forName() de Class pour obtenir une instance de Class en utilisant le nom de la classe. Class.forName(xxx.xx.xx) renvoie une classe. Sa fonction est de demander à la JVM de rechercher et de charger la classe spécifiée, ce qui signifie que la JVM exécutera le segment de code statique de la classe.
Obtenez l'instance de classe en utilisant le nom de classe .calss. Pour les classes d'encapsulation de types de données de base, vous pouvez également utiliser .TYPE pour obtenir l'instance de classe du type de données de base correspondant.
La manière d’obtenir une instance d’un objet de type en C# est plus simple et plus claire.
Obtenu en appelant la méthode GetType() de l'instance de données. Cette méthode est héritée de Object, donc tout objet en C# possède la méthode GetType(), x.GetType(), où x est le nom de la variable.
x dans typeof(x) doit être un nom de classe spécifique, un nom de type, etc., et ne peut pas être un nom de variable.
Grâce à la méthode statique System.Type.GetType() de System.Type.
3. Cours anonyme
En Java, les classes anonymes sont également utilisées plus souvent. Par exemple, sous Android, lors de la mise en œuvre de la surveillance des boutons, vous voyez souvent du code comme celui-ci.
@Outrepasser
public void onClick (Voir arg0) {
Intent intent = new Intent (MainActivity.this, ActivityFrameLayout.class);
setTitle("FrameLayout");
startActivity( intention );
}
} ;
Ici, OnClickListenter est en fait une interface. L'interface peut-elle être utilisée pour créer des instances d'objet ? Bien sûr que non.
Par conséquent, Java crée automatiquement une classe anonyme qui implémente l'interface ici. Ce que nous créons est en fait une instance d'objet de cette classe anonyme.
L'avantage est que nous n'avons pas besoin de définir une classe qui n'est utilisée qu'une seule fois, puis de créer des instances d'objet via cette classe, ce qui simplifie le développement du programme.
Par exemple, nous avons l'interface suivante.
instance.onClick(); En C#, nous n'utiliserons pas du tout ce formulaire. Grâce à la délégation, la même fonction peut être réalisée très simplement.
Notez qu'il n'y a pas de délégués en Java.
Si nous imprimons le type de cette instance, vous verrez le type réel de cette classe anonyme.
Le concept d'attributs doit être familier à tout le monde. Les fonctions membres de classe peuvent accéder librement à n'importe quel membre d'attribut de cette classe. Cependant, il est plus difficile d'accéder aux propriétés d'une autre classe à partir d'une classe, c'est pourquoi nous utilisons souvent les méthodes Getxxx et Setxxx, ce qui semble extrêmement contre nature. Par exemple, en Java ou C++, le code ressemble à ceci :
Cependant, en C#, ces méthodes sont « attribuées ». Le même code, en C#, devient :
foo.size++;
étiquette.font.bold = true;
Comme vous pouvez le constater, C# est évidemment plus facile à lire et à comprendre. Nous pouvons également voir une situation similaire à partir du code du sous-programme de cette « méthode de propriété » :
Java/C++ :
C# :
Afin de distinguer ce type de méthode attribuée des membres d'attribut de la classe, les membres d'attribut sont appelés « champs » en C#, et « attribut » devient le nom spécial de cette « méthode attribuée ». D'ailleurs, en fait, ce type de méthode d'attribut est souvent rencontré en VB et DELPHI. En VB, on l'appelle également attribut. De plus, Get et Set doivent apparaître par paires en C#. Une propriété ne peut pas avoir uniquement Get sans Set (en Java et C++, elle ne peut avoir que Get ou uniquement Set. L'avantage de procéder ainsi en C# est qu'il est facile de le faire). maintenir.Si vous souhaitez modifier un certain attribut, vous ferez attention aux méthodes Get et Set en même temps et vous les modifierez en même temps. Vous ne changerez pas cela et n'oublierez pas cela.
5. Mécanisme d'indexation des objets (Indexeur)
Le mécanisme d'indexation des objets a été introduit en C#. Pour le dire plus clairement, un index d’objet est en réalité un tableau d’objets. Parlons-en en relation avec les propriétés de la section précédente. Les propriétés doivent masquer les méthodes Get et Set, mais dans le mécanisme d'indexation, les méthodes Get ou Set de chaque objet sont exposées. Par exemple, l’exemple suivant illustre ce point plus clairement. Ce qui précède présente les différences entre C# et Java
histoires [index] = valeur ;
}
}
}
...
}
Ce qui précède présente les différences entre C# et JAVA. J'espère qu'il vous sera utile de comprendre C# et JAVA.