web-dev-qa-db-fra.com

Quelles sont les principales différences entre C # et Java?

Je veux juste clarifier une chose. Ce n'est pas une question sur laquelle on est mieux, cette partie je laisse à quelqu'un d'autre pour discuter. Je m'en fiche. On m'a posé cette question lors de mon entretien d'embauche et j'ai pensé qu'il pourrait être utile d'en apprendre un peu plus.

Ce sont ceux que je pourrais venir avec:

  • Java est "indépendant de la plateforme". Eh bien, de nos jours, on pourrait dire qu'il y a le projet Mono , donc C # pourrait aussi être envisagé, mais je pense que c'est un peu exagéré. Pourquoi? Eh bien, quand une nouvelle version de Java est terminée, elle est simultanément disponible sur toutes les plates-formes qu’elle supporte. Par contre, combien de fonctionnalités de C # 3.0 manquent-elles encore dans la mise en œuvre Mono? Ou est-ce vraiment CLR vs JRE que nous devrions comparer ici?
  • Java ne prend pas en charge les événements et les délégués. Pour autant que je sache.
  • En Java toutes les méthodes sont virtuelles
  • Outils de développement: Je pense qu’il n’existe pas encore d’outil similaire à Visual Studio. Surtout si vous avez travaillé avec des éditions d'équipe, vous comprendrez ce que je veux dire.

S'il vous plaît ajouter d'autres que vous pensez être pertinents.

Mise à jour: Je viens de penser, Java ne possède pas les mêmes attributs que les attributs, classes, méthodes, etc. Ou le fait-il?

209
Enes

Comparaison de Java 7 et de C #

(Certaines fonctionnalités de Java 7 ne sont pas mentionnées ici, mais l'avantage de l'instruction using de toutes les versions de C # sur Java 1-6 a été supprimé.)

Tout votre résumé n'est pas correct:

  • Dans Java, les méthodes sont virtuelles par défaut mais vous pouvez les rendre définitives. (En C #, ils sont scellés par défaut, mais vous pouvez les rendre virtuels.)
  • Il existe de nombreux IDE pour Java, à la fois gratuits (par exemple, Eclipse, Netbeans) et commerciaux (par exemple, IntelliJ IDEA).

Au-delà de cela (et ce qui est déjà dans votre résumé):

  • Les génériques sont complètement différents entre les deux; Java les génériques ne sont qu'un "truc" de compilation (mais utile en plus). En C # et .NET, les génériques sont également conservés au moment de l’exécution et fonctionnent pour les types de valeur ainsi que pour les types de référence, en conservant l’efficacité appropriée (par exemple, un List<byte> en tant que byte[] le sauvegardant, plutôt qu’un tableau d'octets encadrés.)
  • C # n'a pas d'exceptions vérifiées
  • Java n'autorise pas la création de types de valeur définis par l'utilisateur
  • Java n'a pas d'opérateur et de surcharge de conversion
  • Java n'a pas de blocs d'itérateurs pour une implémentation simple d'itérateurs
  • Java n'a rien comme LINQ
  • En partie à cause du manque de délégués, Java n'a rien de comparable aux méthodes anonymes et aux expressions lambda. Les classes internes anonymes remplissent généralement ces rôles, mais de manière décousue.
  • Java n'a pas d'arborescence d'expression
  • C # n'a pas de classes internes anonymes
  • En fait, C # ne possède pas du tout les classes internes de Java: toutes les classes imbriquées en C # ressemblent aux classes imbriquées statiques de Java.
  • Java n'a pas de classes statiques (qui n'ont aucun constructeur d'instance et ne peuvent pas être utilisées pour des variables, des paramètres, etc.)
  • Java n'a aucun équivalent aux types anonymes C # 3.0
  • Java n'a pas implicitement de variables locales typées
  • Java n'a pas de méthodes d'extension
  • Java n'a pas d'expressions d'initialiseur d'objet et de collection
  • Les modificateurs d'accès sont quelque peu différents: en Java, il n'y a pas (actuellement) d'équivalent direct d'un Assembly, donc aucune idée de visibilité "interne"; en C #, il n'y a pas d'équivalent à la visibilité "par défaut" dans Java qui prend en compte l'espace de noms (et l'héritage)
  • L'ordre d'initialisation dans Java et C # est légèrement différent (C # exécute les initialiseurs de variable avant l'appel chaîné au constructeur du type de base).
  • Java n'a pas de propriétés dans le langage; ils sont une convention de méthodes get/set/is
  • Java n'a pas l'équivalent de code "non sécurisé"
  • L'interopérabilité est plus facile en C # (et .NET en général) que le JNI de Java
  • Java et C # ont des idées quelque peu différentes d'énums. Les Java sont beaucoup plus orientés objet.
  • Java n'a pas de directives de préprocesseur (#define, #if etc. en C #).
  • Java n'a pas d'équivalent de ref et out de C # pour passer des paramètres par référence
  • Java n'a pas d'équivalent de types partiels
  • Les interfaces C # ne peuvent pas déclarer les champs
  • Java n'a pas de types entiers non signés
  • Java n'a pas de support de langue pour un type décimal. (Java.math.BigDecimal fournit quelque chose comme System.Decimal - avec des différences - mais la prise en charge linguistique n’est pas prise en charge)
  • Java n'a pas d'équivalent des types de valeur nullable
  • La boxe dans Java utilise des types de référence prédéfinis (mais "normaux") avec des opérations particulières. La boxe en C # et .NET est une affaire plus transparente, avec un type de référence créé pour la boxe par le CLR pour tout type de valeur.

Ce n’est pas exhaustif, mais il couvre tout ce que je peux penser immédiatement.

329
Jon Skeet

Ce qui suit est une excellente référence de Dare Obasanjo sur les différences entre C # et Java. Je me retrouve toujours en train de faire référence à cet article lors du basculement entre les deux.

http://www.25hoursaday.com/CsharpVsJava.html

24
Winston Smith

C # a des propriétés automatiques incroyablement pratiques qui permettent également de garder votre code plus propre, du moins lorsque vous n’avez pas de logique personnalisée dans vos getters et setters.

11

Fonctions de C # absentes dans Java • C # inclut davantage de types primitifs et la fonctionnalité permettant de capturer les exceptions arithmétiques.

• Inclut un grand nombre de commodités de notation sur Java, dont beaucoup, telles que la surcharge des opérateurs et les conversions définies par l'utilisateur, sont déjà familiers à la vaste communauté de programmeurs C++.

• La gestion des événements est un "citoyen de première classe": elle fait partie du langage lui-même.

• Permet la définition de "structs", qui sont similaires aux classes mais peuvent être alloués sur la pile (contrairement aux instances de classes en C # et Java).

• C # implémente des propriétés dans le cadre de la syntaxe du langage.

• C # permet aux instructions de commutateur d'opérer sur des chaînes.

• C # autorise les méthodes anonymes fournissant une fonctionnalité de fermeture.

• C # permet à l'itérateur qui utilise des co-routines via un mot clé de rendement de style fonctionnel.

• C # prend en charge les paramètres de sortie, ce qui facilite le retour de plusieurs valeurs, une fonctionnalité partagée par C++ et SQL.

• C # a la capacité d'alias d'espaces de noms.

• C # a une "implémentation de membre explicite" qui permet à une classe d'implémenter spécifiquement les méthodes d'une interface, distinctes de ses propres méthodes de classe. Cela lui permet également d'implémenter deux interfaces différentes qui ont une méthode du même nom. Les méthodes d'une interface n'ont pas besoin d'être publiques; ils peuvent être rendus accessibles uniquement via cette interface.

• C # fournit une intégration avec COM.

• Suivant l'exemple de C et C++, C # permet l'appel par référence pour les types de primitive et de référence.

Fonctionnalités de Java Absent in C #

• Le mot clé strictfp de Java garantit que le résultat des opérations en virgule flottante reste le même sur toutes les plateformes.

• Java prend en charge les exceptions vérifiées pour une meilleure mise en œuvre du recouvrement et du traitement des erreurs.

10
Abhishek kumar

Une autre bonne ressource est http://www.javacamp.org/javavscsharp/ Ce site énumère de nombreux exemples qui illustrent presque toutes les différences entre ces deux langages de programmation.

À propos des attributs, Java a des annotations qui fonctionnent presque de la même manière.

9
Rafael Romão

Génériques:

Avec Java génériques, vous n'obtenez aucune efficacité d'exécution obtenue avec .NET car, lorsque vous compilez une classe générique en Java, le compilateur supprime le paramètre type et substitue Object partout. Par exemple, si vous avez une classe Foo<T>, le compilateur Java génère le code octet comme s'il s'agissait de Foo<Object>. Cela signifie que le casting et que la boxe/le déballage doivent être effectués en "arrière-plan".

Cela fait un moment que je joue avec Java/C # et, à mon avis, la principale différence au niveau linguistique est, comme vous l'avez souligné, les délégués.

5
bruno conde

Passez par le lien indiqué ci-dessous msdn.Microsoft.com/en-us/library/ms836794.aspx Il couvre à la fois la similitude et la différence entre C # et Java.

0
Kanwar Singh