Je développe généralement en C #, mais je n'ai pas encore d'interface pour C # dans l'API à utiliser, alors j'ai commencé à développer en Java. Je n'ai pas beaucoup touché Java, alors j'ai essayé de résumer "xxxx" en C # par "xxxx" en Java. Il se concentre sur les mots réservés et les méthodes de mise en œuvre que j'utilise souvent. Par conséquent, toutes les différences ne sont pas couvertes.
J'ai résumé les différences entre les mots réservés en C # et Java, et les points qui ne changent pas. Comparons côte à côte les mêmes articles et des articles similaires.
différence | C# | Java | Remarques |
---|---|---|---|
namespace | package | ||
using | import | ||
Aucun | class | class | |
: | extends | Héritage de classe | |
Aucun | interface | interface | |
Aucun | abstract | abstract | |
virtual | Aucun | Si vous souhaitez que la fonction soit remplaçable à la destination de l'héritage, C#はvirtualを付与、JavaはAucun | |
override | @Override | C#Est inclus dans la définition, mais Java est une annotation(C#Attribut, attribut) | |
readonly | final | Champ en lecture seule | |
const | final | constant | |
sealed | final | Héritage de classe interdit, Java également utilisé comme remplacement de fonction interdit | |
Aucun | Enum | Enum | Type d'énumération |
struct | Aucun | Structure |
Java n'avait pas de "struct", "virtual". Il ne semble y avoir aucun problème car "struct" peut être remplacé comme ça par class, mais cela semble un peu gênant sans "virtuel". Pour «virtuel», creusez à la fin de la page avec le titre ci-dessous. ・ "C # virtuel et Java final"
De plus, le "final" de Java contenait plusieurs fonctionnalités C #. Non seulement cela, mais il n'y a que l'utilisation de Java, donc je vais creuser cette différence à la fin de la page avec le titre ci-dessous. ・ "Différences dans la déclaration des constantes et la méthode de réglage"
J'ai essayé de résumer la méthode d'implémentation en C #, la méthode d'implémentation en Java et la méthode d'implémentation qui ne peut être trouvée que dans l'un ou l'autre. Comparons les mêmes éléments que je pensais similaires côte à côte.
Chose que tu veux faire | C# | Java |
---|---|---|
Attribut self-made | Héritage d'attribut | @Définition de classe dans l'interface |
Méthode d'extension | public static class | Aucun |
Implémentation par défaut de l'interface | ~~Aucun~~ C#8.0 (.NET Core 3.0)Ajouter avec |
Hériter de l'interface et définir les membres par défaut |
Libération automatique des ressources | using(Stream stream = new Stream()) | try-with-resources |
Contraintes de paramètre de type | where T: int | <T extends Number> |
Exemple ci-dessus)void Test<T>(T arg) | void Test<T>(T arg) where T : int | <T extends Number> void Test(T arg) |
Déclaration de tolérance nulle | Nullable<T>,T? | Optional<T> |
Style Lambda | ()=>{ } | ()->{ } |
Aucun argument de rappel | Action | Runnable |
Idem ci-dessus 1 argument | Action<T> | Consumer<T> |
Idem que ci-dessus 2 arguments | Action<T1,T2> | BiConsumer<T,U>(Jusqu'à 2 arguments) |
Identique à ci-dessus Il y a une valeur de retour | Function<R> | Supplier<T> ~~Spécification APIInterface fonctionnelleAucune limite à voir~~ |
Idem ci-dessus, 1 argument, avec valeur de retour | Function<T,R> | Function<T,R> |
Idem ci-dessus, 2 arguments, avec valeur de retour | Function<T1,T2,R> | BiFunction<T,U,R>(Jusqu'à 2 arguments) |
En ce qui concerne les fonctions répertoriées cette fois, il a été constaté que C # et Java ont les mêmes fonctions, bien que l'utilisabilité soit différente.
De plus, comme vous l'avez souligné dans la section des commentaires, la fonction d'implémentation par défaut de l'interface a été ajoutée à C # depuis C # 8.0. J'étais confus à propos de l'abstrait et de l'interface et je l'ai implémenté dans ce dernier, mais je suis sûr qu'il y a des gens qui ont la même implémentation dans la destination d'héritage. ~~ Je suis ~~ Je veux vraiment en profiter.
De plus, la facilité d'utilisation de "Action" et "Function" en C #, appelées callbacks, semble être assez différente. Pour "rappel", creusez à la fin de la page avec le titre ci-dessous. ・ Différences dans la façon d'utiliser les rappels
Nous approfondirons les trois listés dans «Différences entre les mots réservés» et «Différences dans les méthodes de mise en œuvre».
En C #, «virtual» active le remplacement (implémenté comme une méthode virtuelle pour être exact) et Java interdit le remplacement avec «final». En d'autres termes, si vous n'ajoutez pas "final" à une fonction Java, elle sera toujours implémentée en tant que "virtuelle" au sens de C #. Il a été annulé avant que je le sache! ?? Si vous ne voulez pas être dans une telle situation, vous devez absolument ajouter "final". ..
La différence entre les rappels C # et Java est à peu près comme ça. Si vous comprenez cette différence, vous ne serez pas confus par C # et Java.
Les callbacks Java ont une limite supérieure sur le nombre d'arguments, et C # peut prendre jusqu'à 16.
Les rappels Java ne peuvent pas prendre de types numériques comme arguments, mais C # peut prendre tous les types comme arguments. (* 1)
※1 Les rappels Java mentionnés dans cet article ne peuvent prendre que des types de référence comme arguments. Par conséquent, contrairement à C #, Java ne peut pas prendre un type numérique comme argument. ~~ J'étais confus parce que je ne pouvais pas définir la valeur ~~ Au lieu de cela, il existe un rappel pour le type numérique, qui est défini par le nom ci-dessous, alors utilisez-le. ・ Consommateur de type "numérique" ・ Obj Consommateur de type numérique ・ "Fonction numérique" ・ Vers la fonction "Type numérique" ・ Vers la BiFuction "Type numérique"
Nous avons résumé les différences lors de l'utilisation de C # "const", "readonly" et Java "final" comme constantes et lecture seule.
Déclaration de constante, méthode d'affectation | const | readonly | final |
---|---|---|---|
Déclaration en champ constant | 〇 | 〇 | 〇 |
Affectation à un champ constant autre que l'emplacement déclaré | × | 〇 ※1 | × |
Déclaration avec des variables locales | 〇 | × | 〇 |
Affectation autre que l'emplacement de la déclaration dans la variable locale | × | × | 〇 |
Accorder à l'argumentation | × | × | 〇 |
Restrictions de type au moment de la déclaration | Oui * 2 | Aucun | Aucun |
Hormis ce qui précède, la fonction «finale» est interdite de réaffectation, comme indiqué dans les commentaires. Puisque C # ne peut fondamentalement pas effectuer d'affectations autres que dans l'emplacement de déclaration, il n'y a pas de fonction correspondante. Si vous le forcez, est-ce quelque chose comme "lecture seule" qui peut être déclaré même avec des variables locales? Bien sûr, une telle fonction n'existe pas, donc je la veux vraiment en C #.
J'ai entendu dire que C # et Java sont similaires car ils ont la même base de langage. Au cours de mes recherches, j'ai senti que de nombreux mots réservés étaient les mêmes et qu'ils étaient certainement similaires. De plus, il y avait des différences que je ne remarquerais pas à moins que j'écrive réellement le code (de petites différences telles que les mots réservés qui vont et viennent), donc j'ai senti l'importance non seulement d'accumuler des connaissances mais aussi d'en sortir. Cependant, bien qu'il soit écrit de la même manière, il peut se comporter différemment, je voudrais donc éviter de l'ajuster lorsqu'une erreur se produit.
Et surtout, des mises à jour d'informations. .. Merci à tous ceux qui l'ont souligné.
Recommended Posts