Jakie są główne różnice między C # a Javą?

209

Chcę tylko wyjaśnić jedną rzecz. To nie jest pytanie, które jest lepsze, tę część pozostawiam komuś innemu do omówienia. Nie obchodzi mnie to. Zadano mi to pytanie podczas rozmowy kwalifikacyjnej i pomyślałem, że przydałoby się trochę więcej.

Oto te, które mógłbym wymyślić:

  • Java jest „niezależna od platformy”. W dzisiejszych czasach można powiedzieć, że istnieje projekt Mono , więc C # można również rozważyć, ale uważam, że jest to nieco przesadzone. Czemu? Cóż, kiedy powstaje nowa wersja Java, jest ona jednocześnie dostępna na wszystkich obsługiwanych platformach, z drugiej strony, ile funkcji C # 3.0 wciąż brakuje w implementacji Mono? Czy to naprawdę CLR vs. JRE , które powinniśmy porównać tutaj?
  • Java nie obsługuje wydarzeń i delegatów. Z tego co wiem.
  • W Javie wszystkie metody są wirtualne
  • Narzędzia programistyczne: Wierzę, że nie ma jeszcze takiego narzędzia jak Visual Studio. Zwłaszcza jeśli pracowałeś z edycjami zespołowymi, będziesz wiedział, co mam na myśli.

Dodaj inne, które Twoim zdaniem są istotne.

Aktualizacja: Właśnie wyskoczyło mi z głowy, Java nie ma czegoś takiego jak niestandardowe atrybuty klas, metod itp. A może to?

Enes
źródło
1
Języki różnią się od implementacji językowych, które również różnią się od bibliotek. Co próbujesz porównać?
Miguel Ping,
1
Zobacz Porównanie C Sharp i Java .
gimel
2
Znalazłem ten msdn.microsoft.com/en-us/library/ms836794.aspx. Obejmuje zarówno podobieństwo, jak i różnicę między C # a java.
Bipul
1
Możesz uzyskać wiele z wymienionych poniżej rzeczy na temat Java z odpowiednimi bibliotekami. Sprawdź na przykład ten poprawny kod Java: new String [] {„james”, „john”, „john”, „eddie”} .where (startWith („j”)). Odrębne (); Korzysta z biblioteki o nazwie lombok-pg. Można go znaleźć na stronie github.com/nicholas22/jpropel
NT_7

Odpowiedzi:

329

Porównanie Java 7 i C # 3

(Niektóre funkcje Java 7 nie są tutaj wymienione, ale usingusunięto przewagę instrukcji wszystkich wersji C # w stosunku do Java 1-6).

Nie wszystkie podsumowania są poprawne:

  • W Javie metody są domyślnie wirtualne , ale można je uczynić ostatecznymi. (W języku C # są domyślnie zapieczętowane, ale można je uczynić wirtualnymi).
  • Istnieje wiele IDE dla Javy, zarówno darmowych (np. Eclipse, Netbeans), jak i komercyjnych (np. IntelliJ IDEA)

Poza tym (i co jest już w podsumowaniu):

  • Generyczne są całkowicie różne między tymi dwoma; Generyczne Java są tylko „sztuczką” podczas kompilacji (ale w tym przydatną). W języku C # i .NET generyczne są również utrzymywane w czasie wykonywania i działają zarówno dla typów wartości, jak i typów referencyjnych, zachowując odpowiednią wydajność (np. List<byte>Jako byte[]wsparcie, a nie tablicę bajtów w pudełku).
  • C # nie sprawdził wyjątków
  • Java nie pozwala na tworzenie typów wartości zdefiniowanych przez użytkownika
  • Java nie ma przeciążenia operatora i konwersji
  • Java nie ma bloków iteratora do prostej implementacji iteratorów
  • Java nie ma czegoś takiego jak LINQ
  • Częściowo z powodu braku delegatów, Java nie ma żadnych anonimowych metod i wyrażeń lambda. Anonimowe klasy wewnętrzne zwykle wypełniają te role, ale niezgrabnie.
  • Java nie ma drzew wyrażeń
  • C # nie ma anonimowych klas wewnętrznych
  • C # w ogóle nie ma wewnętrznych klas Javy - wszystkie zagnieżdżone klasy w C # są jak statyczne zagnieżdżone klasy Javy
  • Java nie ma klas statycznych (które nie mają żadnych konstruktorów instancji i nie można ich używać do zmiennych, parametrów itp.)
  • Java nie ma żadnego odpowiednika anonimowych typów C # 3.0
  • Java nie ma niejawnie wpisanych zmiennych lokalnych
  • Java nie ma metod rozszerzenia
  • Java nie ma wyrażeń inicjalizujących obiekty i kolekcje
  • Modyfikatory dostępu są nieco inne - w Javie (obecnie) nie ma bezpośredniego odpowiednika zestawu, więc nie ma pojęcia o „wewnętrznej” widoczności; w języku C # nie ma odpowiednika „domyślnej” widoczności w Javie, która uwzględnia przestrzeń nazw (i dziedziczenie)
  • Kolejność inicjalizacji w Javie i C # jest nieco inna (C # wykonuje inicjalizatory zmiennych przed połączeniem łańcuchowym z konstruktorem typu podstawowego)
  • Java nie ma właściwości jako części języka; są konwencją metod get / set / is
  • Java nie ma odpowiednika „niebezpiecznego” kodu
  • Interop jest łatwiejszy w języku C # (i ogólnie .NET) niż JNI Javy
  • Java i C # mają nieco inne pomysły na wyliczanie. Java są znacznie bardziej obiektowe.
  • Java nie ma dyrektyw preprocesora (#define, # if itp. W C #).
  • Java nie ma odpowiednika C # refi outdo przekazywania parametrów przez odniesienie
  • Java nie ma odpowiednika typów częściowych
  • Interfejsy C # nie mogą deklarować pól
  • Java nie ma niepodpisanych typów liczb całkowitych
  • Java nie obsługuje języka dla typu dziesiętnego. (java.math.BigDecimal zapewnia coś takiego jak System.Decimal - z różnicami - ale nie ma obsługi języka)
  • Java nie ma odpowiednika typów dopuszczających wartości zerowe
  • Boks w Javie wykorzystuje predefiniowane (ale „normalne”) typy referencji z określonymi operacjami na nich. Boks w C # i .NET jest bardziej przejrzysty, z typem referencyjnym tworzonym dla boksowania przez CLR dla dowolnego typu wartości.

Nie jest to wyczerpujące, ale obejmuje wszystko, co mogę wymyślić z ręki.

Jon Skeet
źródło
24
@Brian: Myślę rodzajowych Java i szczegóły klas wewnętrznych dość szybko stłumić ideę Java osiągnięcia przewagi dzięki prostocie;)
Jon Skeet
8
@OrangeDog: Kłócą się ludzie, którzy sami sobie żartują, IMO. Trudno dostrzec, jak zmuszanie do pisania jawnego bloku try / wreszcie jest mniej podatne na błędy niż instrukcja IMO. Większość „dodatkowych” funkcji języka C # w porównaniu z Javą oznacza, że ​​można uniknąć pisania mniejszej ilości kodu, a kod ten może być bardziej czytelny.
Jon Skeet,
17
@OrangeDog: Jak bezstronny jesteś, poza zainteresowaniem? Tak, jestem entuzjastą języka C #, ale mam też dość duże doświadczenie w Javie - w końcu to moja codzienna praca. To nie tak, że nie wiem, jak efektywnie korzystać z Javy.
Jon Skeet,
8
@OrangeDog: Na początek większość programistów nie pisze kodu używając „niebezpiecznego”, o ile mi wiadomo, więc jest to czerwony śledź. Myślę też, że sprawdzalność to czerwony śledź - nie sądzę, aby formalna sprawdzalność miała wiele wspólnego z tym, jak łatwo jest człowiekowi zrozumieć kod. Chodzi mi o to, że jako ktoś z dużym doświadczeniem zarówno w Javie, jak i C #, uważam, że C # jest znacznie lepszym językiem pod względem produktywności i czytelności. Jeśli uważasz, że jest odwrotnie, czy możesz wyjaśnić swoje poziomy doświadczenia w obu językach? Myślę, że jest to dość istotne w dyskusji.
Jon Skeet,
21
@OrangeDog: Co więcej, twoje twierdzenie, że „Możliwość robienia więcej rzeczy zwiększa prawdopodobieństwo, że zrobisz to źle”, jest również błędnym IMO ... ponieważ zakłada, że ​​jeśli nie możesz zrobić czegoś za pomocą funkcji język, który ułatwia, w ogóle nie musisz tego robić. To po prostu nieprawda - często zadania, które musisz wykonać w Javie i C # są takie same, ale z powodu brakujących funkcji Java utrudnia prawidłowe wykonanie tych zadań. Upraszczając zadanie, funkcja zmniejsza prawdopodobieństwo, że zrobisz to źle.
Jon Skeet,
24

Poniżej znajduje się obszerne odniesienie Dare Obasanjo na temat różnic między C # a Javą. Zawsze przełączam się między nimi, odnosząc się do tego artykułu.

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

Winston Smith
źródło
2
@Jon Skeet: jesteś najbardziej aktywnym programistą w języku C #. Dlaczego nie utrzymasz swojej wersji różnic w języku C # i Java. Założę się, że ludzie chcieliby to przeczytać.
pazury
1
@claws: Nie mam czasu robić wszystkiego, co bym chciał.
Jon Skeet,
19
@Winston: Potrzebujemy listy „różnic między Chuckiem Norrisem a Jonem Skeetem”: 1) Chuck Norris zawsze ma czas; Jon musi zmodyfikować TimeDateklasę, aby zawsze mieć czas, i nie miał jeszcze czasu :(
RedFilter,
11

C # ma właściwości automatyczne, które są niezwykle wygodne, a także pomagają utrzymać kod w czystości, przynajmniej gdy nie masz niestandardowej logiki w programach pobierających i ustawiających.

Morten Christiansen
źródło
10

Funkcje języka C # nieobecne w Javie • Język C # obejmuje bardziej prymitywne typy i funkcję przechwytywania wyjątków arytmetycznych.

• Zawiera dużą liczbę notacyjnych udogodnień w Javie, z których wiele, takich jak przeciążanie operatorów i rzutowania zdefiniowane przez użytkownika, jest już znanych dużej społeczności programistów C ++.

• Obsługa zdarzeń jest „obywatelem pierwszej klasy” - jest częścią samego języka.

• Umożliwia definicję „struktur”, które są podobne do klas, ale mogą być przydzielane na stosie (w przeciwieństwie do instancji klas w języku C # i Javie).

• C # implementuje właściwości jako część składni języka.

• C # pozwala na działanie instrukcji switch na łańcuchach.

• C # pozwala na anonimowe metody zapewniające funkcjonalność zamknięcia.

• C # pozwala iteratorowi, który wykorzystuje procedury wspólne za pomocą słowa kluczowego wydajności w stylu funkcjonalnym.

• C # obsługuje parametry wyjściowe, pomagając w zwróceniu wielu wartości, funkcję wspólną dla C ++ i SQL.

• C # ma możliwość aliasu przestrzeni nazw.

• C # ma „Explicit Member Implementation”, który pozwala klasie na konkretną implementację metod interfejsu, niezależnie od metod własnych. Pozwala to również na implementację dwóch różnych interfejsów, które mają metodę o tej samej nazwie. Metody interfejsu nie muszą być publiczne; można je uczynić dostępnymi tylko za pośrednictwem tego interfejsu.

• C # zapewnia integrację z COM.

• Zgodnie z przykładem C i C ++, C # pozwala na wywołanie przez referencję dla typów pierwotnych i referencyjnych.

Funkcje Java Absent w C #

• Słowo kluczowe strictfp Java gwarantuje, że wynik operacji zmiennoprzecinkowych pozostanie taki sam na różnych platformach.

• Java obsługuje sprawdzone wyjątki w celu lepszego egzekwowania pułapek i obsługi błędów.

Abhishek Kumar
źródło
9

Innym dobrym zasobem jest http://www.javacamp.org/javavscsharp/ Ta strona zawiera wiele przykładów ilustrujących prawie wszystkie różnice między tymi dwoma językami programowania.

O atrybutach Java ma Adnotacje, które działają prawie tak samo.

Rafael Romão
źródło
5

Generyczne:

W przypadku generycznych programów Java nie uzyskuje się żadnej wydajności wykonywania .NET, ponieważ podczas kompilacji ogólnej klasy w Javie kompilator odbiera parametr type i wszędzie zastępuje Object. Na przykład, jeśli masz Foo<T>klasę, kompilator Java generuje kod bajtowy tak, jakby był Foo<Object>. Oznacza to, że rzutowanie, a także boksowanie / rozpakowywanie będzie musiało zostać wykonane w „tle”.

Od jakiegoś czasu gram w Javie / C # i, moim zdaniem, główną różnicą na poziomie językowym są, jak wskazałeś, delegaci.

Bruno Conde
źródło
Jest to błędne, ogólne usuwanie lub weryfikacja (odpowiednio Java i C #) niekoniecznie wpływają na wydajność.
Miguel Ping,
Mylisz autoboxing z castingiem.
JesperE
3
Nie, Bruno ma rację co do różnicy w wydajności. Nie ma możliwości uzyskania odpowiednika List <byte> (ogólnie) w Javie. Musiałbyś mieć List <Byte>, co wiązałoby się z karami bokserskimi (czas i pamięć).
Jon Skeet,
(Nie) boksowanie dzieje się tylko w przypadku typów pudełkowych, które są typami pierwotnymi.
Miguel Ping
1
Proszę zobaczyć ten artykuł: jprl.com/Blog/archive/development/2007/Aug-31.html
bruno conde
0

Proszę przejść przez link podany poniżej msdn.microsoft.com/en-us/library/ms836794.aspx Obejmuje zarówno podobieństwo, jak i różnicę między C # a java

Kanwar Singh
źródło