Zamknięte . To pytanie jest
oparte na opiniach . Obecnie nie przyjmuje odpowiedzi.
Komentarze
Odpowiedź
Pytanie powinno brzmieć " Który język lepiej nadaje się do tworzenia nowoczesnych, typowych aplikacji? ".
Edytuj : Odniosłem się do niektórych poniższych komentarzy. Mała uwaga: weź pod uwagę, że kiedy masz wiele rzeczy natywnie, takich jak idiomy, jest to duża różnica niż ich samodzielne wdrażanie lub pobieranie i używanie za każdym razem. Prawie wszystko można zaimplementować w dowolnym z tych języków. Pytanie brzmi – co języki, które dostarczają ci natywnie.
A więc z góry (niektóre argumenty dotyczą obu języków) …
C # jest lepszy niż C ++ w tym:
- Ma natywne zbieranie śmieci.
- Pozwala traktować podpisy metod klas jako funkcje wolne (tj. ignorując statycznie wpisane
this
argument wskaźnika), a tym samym stwórz bardziej dynamiczne i elastyczne relacje między klasami. edytuj jeśli nie wiesz, co to znaczy, spróbuj przypisać metodę składową zwracającą void i akceptującą void do void (*ptr)()
. Delegaci C # niosą ze sobą wskaźnik this
, ale użytkownik nie zawsze musi się tym przejmować. Mogą po prostu przypisać metodę void()
dowolnej klasy do dowolnego innego void()
delegata.
- Ma ogromny standard Biblioteka z tak wieloma przydatnymi rzeczami, która jest dobrze zaimplementowana i łatwa w użyciu.
- Pozwala zarówno na zarządzane, jak i natywne bloki kodu.
- Wersjonowanie asemblera z łatwością rozwiązuje piekielne problemy DLL.
- Możesz ustawić klasy, metody i pola tak, aby były wewnętrzne w zestawie (co oznacza, że są dostępne z dowolnego miejsca w bibliotece DLL, w której zostały zadeklarowane, ale nie z innych zestawów).
C # jest lepszy niż Java pod tym względem:
- Zamiast dużo szumu (EJB, implementacje prywatnych klas statycznych itp.) otrzymujesz eleganckie i przyjazne konstrukcje natywne, takie jak Właściwości i Zdarzenia .
- Masz prawdziwe typy generyczne (nie jest to zły żart dotyczący rzutowania, który Java nazywa rodzajami) i możesz dokonać nad nimi refleksji.
- Obsługuje natywne idiomy zarządzania zasobami (
using
). Java 7 również będzie to obsługiwać, ale C # ma to od dłuższego czasu.
- Nie ma sprawdzonych wyjątków 🙂 (dyskusyjne, czy to dobrze, czy źle)
- Jest głęboko zintegrowany z systemem Windows, jeśli tego chcesz.
- Ma Lambdy i LINQ, dzięki czemu obsługuje niewielką ilość programowania funkcjonalnego.
- Pozwala na zarówno ogólna kowariancja, jak i kontrawariancja jawnie.
- Ma zmienne dynamiczne, jeśli ich potrzebujesz.
- Lepsza obsługa wyliczania dzięki instrukcji
yield
.
- Pozwala zdefiniować nowe typy wartości (lub bez odwołań).
Edycja – adresowanie komentarzy
- Nie powiedziałem, że C ++ nie obsługuje natywnego RAII. Powiedziałem, że Java tego nie ma (musisz jawnie spróbować / w końcu). C ++ ma automatyczne wskaźniki, które są świetne dla RAII i (jeśli wiesz, co robisz) może również zastąpić zbieranie śmieci.
- Nie mówiłem nic o emulowaniu bezpłatnych funkcji. Ale na przykład jeśli chcesz uzyskać dostęp do pola za pomocą wskaźnika
this
i powiązać metodę, która to robi, z ogólnym wskaźnikiem funkcji (tj. nie w tej samej klasie), to po prostu nie ma natywnego sposobu, aby to zrobić. W C # otrzymujesz za darmo. Nie musisz nawet wiedzieć, jak to działa.
- Poprzez " traktowanie metod składowych jako bezpłatnych funkcji " Chodziło mi o to, że nie można na przykład natywnie powiązać metody składowej z podpisem funkcji wolnej, ponieważ metoda składowa " potajemnie " potrzebuje wskaźnika
this
.
- Instrukcja
using
, oczywiście wraz z opakowaniami IDisposable, jest doskonałym przykładem RAII. Zobacz ten link . Weź pod uwagę, że nie potrzebujesz RAII tak bardzo w C #, jak w C ++, ponieważ masz GC. W określonych sytuacjach możesz jawnie użyć using
Kolejne małe przypomnienie: zwalnianie pamięci jest kosztowną procedurą. GC mają przewagę wydajnościową w wielu przypadkach (szczególnie gdy masz dużo pamięci). Pamięć nie zostanie przecieka i nie będziesz wydawać dużo czas zwalniania. Co więcej, alokacja jest szybsza, ponieważ nie alokujesz pamięci za każdym razem, tylko raz na jakiś czas. Wywołanie new
jest po prostu zwiększeniem ostatniego wskaźnik do obiektu.
- " C # jest gorszy, ponieważ ma funkcję czyszczenia pamięci ". To jest rzeczywiście subiektywne, ale jak powiedziałem na początku, w przypadku większości nowoczesnych, typowych aplikacji, zbieranie śmieci jest ogromną zaletą.
W C ++ możesz ręcznie zarządzać pamięcią za pomocą new
a nd delete
, co empirycznie zawsze prowadzi do błędów tu i tam, lub (w C ++ 11) możesz natywnie używać automatycznych wskaźników, ale pamiętaj, że dodają dużo i dużo szumu do kodu. Tak więc GC nadal ma przewagę.
- " Typy generyczne są znacznie słabsze niż szablony " – po prostu nie ” nie wiem, skąd to masz. Szablony mogą mieć swoje zalety, ale z mojego doświadczenia wynika, że ograniczenia, sprawdzanie typów parametrów ogólnych, kontrawariancja i kowariancja są znacznie silniejszymi i eleganckimi narzędziami. Zaletą szablonów jest to, że pozwalają one bawić się językiem bit, co może być fajne, ale powoduje też wiele bólu głowy, gdy chcesz coś debugować. Podsumowując, szablony mają swoje fajne funkcje, ale generyczne uważam za bardziej praktyczne i przejrzyste.
Komentarze
Odpowiedź
Środowisko
.NET Framework i klienci Windows
Windows jest dominującym systemem operacyjnym na komputerach klienckich. Najlepsze frameworki GUI dla aplikacji Windows to Winforms i WPF wraz z .NET Framework . Najlepszym językiem programowania do współpracy z .NET Framework i jego interfejsami API jest C # . Java nie jest dla tego alternatywą.A C ++ to starszy język bez automatycznego zarządzania pamięcią. C # jest podobny do C ++, ale ma automatyczne zarządzanie pamięcią i nie musisz pracować ze wskaźnikami, co zwiększa produktywność. C ++ może być nadal najlepszą opcją w niektórych przypadkach, ale nie w przypadku aplikacji bazodanowych intensywnie korzystających z formularzy, które są powszechne biznes.
IIS i Windows Server
Jeśli jesteś przyzwyczajony do pracy w środowisku Windows i C #, będziesz potrzebować najmniejszych inwestycji, aby nauczyć się IIS do programowania serwera i Windows Server dla podstawowa administracja.
Active Directory i Windows Server
Jeśli tworzysz oprogramowanie, które ma zostać wdrożone w sieciach firmowych, jest prawdopodobne, że używają one środowiska skoncentrowanego na systemie Windows przy użyciu Windows Server z Active Directory. W takim środowisku łatwo jest zintegrować i wdrożyć rozwiązanie wykonane w C # i .NET Framework .
Osobiście jestem programistą Java, a nie programistą C #, ale pracuję w sieci. Przerzuciłbym się na C #, gdybym tworzył aplikacje sieciowe dla sieci Windows. Ale wolę Javę dla serwerów WWW opartych na Linuksie. Wybrałbym C ++ dla systemów wbudowanych, gdybym nie „wygrał” bez wielu zależności.
Tak, C # to lepszy język z nowocześniejszymi funkcjami niż C ++ i Java, ale to a nie najważniejsza rzecz przy wyborze C # .
Podsumowanie
Środowisko oprogramowania jest najważniejsze przy wyborze C # . Jeśli pracujesz w środowisku z klientami Windows, serwerami Windows, Active Directory, IIS i być może SQL Server następnie C # to zdecydowanie najlepszy język z .NET Framework .
Jeśli pracujesz w środowisku Unix, np. usługi internetowe, Java byłaby moim wyborem. A jeśli pracujesz z systemami wbudowanymi lub musisz przeprowadzić integrację z urządzeniami sprzętowymi, C ++ byłby dobrym wyborem.
Komentarze
Odpowiedź
C # i Java
C # jest bardzo dobrym językiem, jeśli:
- Chcesz tworzyć programowanie obiektowe ogólnego przeznaczenia. Jest to klasyczny, statycznie wpisywany język OOP.
- Celujesz tylko w platformy firmy Microsoft (warto pamiętać, że firma Microsoft skutecznie sklonowała Javę, aby utworzyć C #, ponieważ potrzebowali języka podobnego do Javy, który blokowałby ludzi Windows. Mogli używać Javy, ale to umożliwiłoby ludziom łatwe uruchamianie aplikacji na innych platformach ….)
C # jako język jest ładniejszy niż Java na różne sposoby (lepiej składnia właściwości, typów wartości, reified generics itp.). Wolę C # jako język od Javy, ale ogólnie rzecz biorąc, są to dość podobne języki i odpowiednie do podobnych aplikacji.
Z drugiej strony Java ma również duże zalety:
- Ogromny ekosystem open source – biblioteki dla Javy, które można pobrać za darmo, są przez daleko najlepsze ze wszystkich języków. Trudno przecenić wagę tego – z punktu widzenia załatwiania spraw Java jest bardzo skuteczna.
- Narzędzia – moim zdaniem narzędzia Java są lepsze niż to, co można uzyskać w świecie .Net . na przykład Maven (kiedy już go opanujesz!) Jest szczególnie imponujący.
- Konserwacyjność – Java istnieje już od jakiegoś czasu i odnosi sukcesy w dużych firmach właśnie dlatego, że jest stosunkowo stabilna i włożono wiele wysiłku w kompatybilność wsteczną. Prosta i nieco rozwlekła składnia pomaga również Javie w tym miejscu – łatwiej jest czytać i utrzymywać kod, jeśli kod jest bardzo jasny i wyraźny.
- Nowe języki – JVM ma kilka niesamowitych nowych języków (Scala, Clojure , Groovy itp.), Które są przyszłością platformy Java. To tutaj dzieje się wiele innowacji językowych i dzieje się to znacznie szybciej niż w Javie lub C #.
Tak więc Java vs C # to bardzo blisko i naprawdę sprowadza się to do tego, czy chcesz być w obozie Microsoft, czy w obozie Open Source / międzyplatformowym.
Osobiście wolę Javę, ponieważ:
- Ekosystem bibliotek jest moim zdaniem o wiele ważniejszy niż fakt, że C # ma ładniejszą składnię niż Java
- Na dłuższą metę chcę, aby cały mój kod był poprawnie krzyżowany -platformę i mogącą działać na dużych klastrach tanich maszyn linuxowych w chmurze.
- Clojure to obecnie IMHO najbardziej obiecujący język na świecie, a jeśli będę trzymał się platformy JVM, będę w stanie to tran z czasem łatwo umieszczaj mój kod i umiejętności w Clojure.
C / C ++
C / C ++ to w zasadzie zupełnie inna bestia. Nie polecałbym go obecnie do tworzenia aplikacji ogólnego przeznaczenia z następujących powodów:
- Zarządzanie pamięcią – w większości dzisiejszych programów ogólnego przeznaczenia nie chcesz być zarządzanie własną pamięcią. Zbieranie elementów bezużytecznych w C # lub Javie jest znacznie lepsze dla produktywności i rozsądku niż jakiekolwiek jawne techniki zarządzania pamięcią, których będziesz musiał używać w C / C ++
- Złożoność – w szczególności C ++ jest niezwykle złożony język. Opanowanie go zajmuje dużo czasu, a sam kod może być również diabelnie skomplikowany (na przykład szablony C ++ są szczególnie skomplikowane …)
- Produktywność – przez większość czasu i wszystko inne pozostanie równym zajmie więcej czasu, aby wykonać pracę w C / C ++.
Jednak jest to niewątpliwie świetny wybór w niektórych ograniczonych domenach specjalnych, w szczególności:
- Systemy operacyjne – prawdopodobnie chcesz używać C / C ++, jeśli piszesz system operacyjny.
- Tworzenie gier – prawie wszystkie t Najlepsze komercyjne silniki gier to C / C ++. Jest to nadal najlepszy wybór, jeśli tworzysz wymagający tytuł AAA (C # i Java nadają się idealnie do mniej wymagających / zwykłych gier)
- Wysokowydajne obliczenia – zoptymalizowany C / C ++ to prawdopodobnie najlepszy sposób tworzyć kod o bardzo wysokiej wydajności. W przypadku większości aplikacji wykonanie tego poziomu optymalizacji nie jest warte wysiłku, ale w niektórych domenach może być niezwykle cenne (na przykład handel z dużą częstotliwością).
- Dostęp do sprzętu – potrzebujesz bezpośredniego dostęp do sprzętu (np. do systemu wbudowanego)
Zasadniczo C / C ++ jest doskonałym wyborem wtedy i tylko wtedy, gdy koncentrujesz się na jednej z domen, w której jest szczególnie dobrze dopasowana .
Komentarze
Odpowiedź
I heard that syntactically they are almost the same.
Składniowo? Kto mówi latającym małpom o składni? Składnia jest dobra tylko w jednym: umożliwia szybszą migrację z języków podobnych pod względem składni. Otóż to.
C # jest znacznie lepszy niż Java. Rozważ ich ogólne i funkcjonalne wsparcie dla programowania – C # wyprzedza Javę. Nie wspominając o przeciążeniach operatorów i innych dobrych rzeczach – C # jest znacznie lepiej wyposażony. Nie ma mowy, żeby Java mogła być uważana za lepszą niż C #.
C ++ i C # to raczej rywalizacja. C ++ ma niesamowicie irytujący archaiczny model kompilacji i kilka starszych chorób z C, ale jego szablony są znacznie bardziej wydajne niż generyczne, a podejścia do zarządzania zasobami są znacznie bardziej elastyczne i wydajniejsze, ponieważ using
to kompletna porażka i działa szybciej.
Komentarze
Odpowiedź
Cóż, C#
ma kilka fajnych wbudowanych funkcji, takich jak LINQ
i delegaci. Wydobywa to, co najlepsze z obu światów – Java
i C++
. Spójrz tutaj , aby uzyskać pełne porównanie.
Ale bardziej podoba mi się Java
świat – dużo więcej frameworków open source i działa na każdej platformie. I nie mów mi o Mono
– to nie jest niezawodna opcja.
Komentarze
Odpowiedź
Według niektórych źródeł (patrz np. http://www.indeed.com/jobtrends ) C # jest nadal mniej popularny niż Java i tak samo popularny jak C ++.
C # zapewnia funkcje, których brakuje w Javie, na przykład bezpośrednie wsparcie dla niektórych idiomów programowania, takich jak właściwości, funkcjonalny styl programowania i tak dalej. C # ma wyższy poziom abstrakcji niż C ++, co jest zaletą, gdy czas programowania jest ważniejszy niż szybkość programu.
Osobiście nadal wolę światy Java / C ++. Jak powiedział Petar Minchev, Java ma więcej frameworków i aplikacji typu open source, działa wszędzie, jest mniej powiązana z określonym dostawcą i systemem operacyjnym. C ++ ma podobne zalety, mimo że kod często wymaga dostosowań przechodzących z jednej platformy na drugą. Ponieważ wolę programować na Linuksie i, o ile wiem, nie mogę mieć w pełni rozwiniętego C # w Linuksie, nigdy nie zainteresowałem się C #, ponieważ moje potrzeby programistyczne są obsługiwane przez C, C ++, Java, Scala.
Z drugiej strony, dla wielu programistów przywiązanie do konkretnego dostawcy nie stanowi problemu: Microsoft ma dominującą pozycję na rynku systemów operacyjnych, a C # daje wiele możliwości zatrudnienia. Dlatego wielu programistów IMO przyjmuje C #, ponieważ oprócz tego, że jest językiem bogatym w funkcje, jest to również dobra inwestycja.
Komentarze
Odpowiedź
A co z " Platformą programistyczną obejmującą język programowania " lepiej?
Zapomniałeś dołączyć inne rzeczy, takie jak " środowisko ", z którym będziesz pracować.
-
Czy zamierzasz pracować tylko z systemem operacyjnym Windows, ale czy nie musi to być niski poziom i mieć dużo pamięci i innych zasobów?
Wybierz .NET jako framework w systemie Windows i użyj C #.
-
Czy zamierzasz pracować tylko dla Windows, ale nie musi to być niski poziom, ALE, nie masz dużo zasobów?
Wybierz Delphi Framework (i język programowania Object Pascal Delphi lub język programowania Lazarus Object Pascal)
-
Czy Twoja aplikacja jest wymagana wspierać seve platformy ral, takie jak gra, w różnych telefonach komórkowych?
Wybierz środowisko Java i język programowania Java.
-
Czy to Linux z KDE jako grafiką
Wybierz framework QT z C ++
-
Czy to Linux z Gnome jako interfejsem graficznym?
Wybierz framework GObject / GLib , z C ++
-
Czy zamierzasz pracować z wieloma niskopoziomowymi operacjami, takimi jak tworzenie sterowników?
Zwykły C lub C ++ jest używany przez kilka Systemy ze standardowymi bibliotekami jako szkielet.
Tylko moje 2 centy.
Komentarze
Odpowiedź
Jeśli szukasz czegoś, prawdopodobnie natkniesz się na dyskusję na temat najpopularniejszych języków programowania. Oto jeden z wyników wyszukiwania – http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html – Java nadal wydaje się być najpopularniejszym językiem.
Java próbowała usunąć niektóre niedociągnięcia C ++ (i uprościć życie programistom w przypadku aplikacji nie czasu rzeczywistego i niekrytycznych). C # jako późno przybyły na imprezę pozwolił uniknąć niektórych niedociągnięć języka Java. C # poczynił duże postępy (ponieważ Microsoft ma nad nim dużą kontrolę), podczas gdy postępy w Javie były blokowane przez dłuższy czas z powodu konfliktu między jego interesariuszami.
Odpowiedź
Kilka rzeczy, o których jeszcze nie wspomniano:
C # jest lepszy niż C ++, ponieważ:
z plikami nagłówkowymi, co przekłada się na wielką prostotę.
C # jest lepszy niż Java, ponieważ:
Obsługuje zarówno typ referencyjny (klasa), jak i typ wartości (struktura) zdefiniowany przez użytkownika typy, które, jeśli wiesz, co robisz, mogą przynieść znaczące korzyści w zakresie wydajności.
Obsługuje delegatów, które są jak interfejsy jednej metody, co znacznie upraszcza kodowanie często występujących konstrukcji, które obejmują obiekty z jedną metodą.
Komentarze
Odpowiedź
Należy wybrać najlepszy język dla oczekiwanego środowiska i swojej wiedzy.
Wybierz C #, jeśli pracujesz w środowisku Microsoft. Chociaż C # jest znormalizowany zgodnie z ISO / IEC 23270: 2003, wersja firmy Microsoft pozostaje jedyną pełną implementacją. Kilka kluczowych części języka nie jest objętych tym standardem, a zatem są objęte patentami firmy Microsoft. Nikt inny nie zaimplementuje całkowicie kompatybilnej wersji języka dla innych systemów, więc w efekcie jesteś dostawcą zablokowanym na Microsoft Windows i .Net tak długo, jak używasz tego języka. Jeśli szukasz umiejętności do wykorzystania na rynku mobilnym, najlepiej poszukaj innego języka.
Java działa, ale ma sporo narzutów, po części ze względu na takie funkcje, jak czyszczenie pamięci. Java również nie jest standaryzowana przez ISO / IEC, więc nie masz gwarancji, jeśli zmienisz platformy i wersje Javy, tylko najlepsze intencje Sun / Oracle. Jeśli ostatecznie planujesz pracować z Androidem, to zdecydowanie jest droga do zrobienia . Programowanie Androida to w zasadzie Java, z kilkoma zmianami.
C ++ jest znormalizowany i prawie wszystkie kompilatory są zgodne z międzynarodowym standardem, więc masz gwarantowane zachowanie, ALE język nie chroni cię przed tobą. Musisz samodzielnie przeprowadzić czyszczenie i sprawdzanie przepełnienia. To nie jest trudne. Programiści C / C ++ robią to od wielu lat. Apple używa celu C do wszystkiego, więc jeśli chcesz dążyć do Apple, polecam spróbować tego.
Jeśli w którymś momencie zauważysz, że zostawiasz Windows w tyle, sugerowałbym naukę zarówno C / C ++, jak i Java – oba są obecnie dostępne do sprzedaży.
Odpowiedź
W stosunku do C ++ kontra C # (ponieważ i „nie jestem wystarczająco biegły w Javie), brakuje mi tutaj możliwości dostępu do rzeczy niskiego poziomu w systemie Windows. Na przykład nie możesz opracować natywnego sterownika ekranu w C # (jeszcze), ale możesz to zrobić w C ++. To nie czyni C ++ lepszym. Widzę C ++ w porównaniu z C # jako Assembly versus C.
C # jest w moim zobacz znacznie wydajniej, jeśli spojrzysz na czas potrzebny do rzeczywistego zaimplementowania funkcji. Spadek wydajności środowiska uruchomieniowego .Net jest pomijalny w przypadku 99% opracowanych aplikacji. Może to mieć znaczenie, jeśli wykonujesz ścisłą pętlę, tak jak najbardziej, ale przez większość czasu aplikacja jest bezczynna, czekając na jakiekolwiek wejście, sygnał lub przerwanie (IO dysku, kliknięcie przycisku, sieć, zakończenie animacji).
Biblioteka CLR ze wszystkimi swoimi ma inne funkcje r duża korzyść. Kiedy szkoliłem C # dla młodszych programistów, większość z nich powiedziała, że podoba im się logiczna konwencja nazewnictwa klas, członków i przestrzeni nazw. Znalezienie cechy metody było logiczne w całym SDK, coś, w czym Visual Basic 5 miał poważne błędy. To ogromnie pomogło im w adaptacji biblioteki. Po opanowaniu składni języka poznanie nowej biblioteki jest istotne dla dobrego zrozumienia dowolnego zestawu SDK. Dzięki temu nie musisz wymyślać koła na nowo.