Z jakich powodów powinienem wybrać C # zamiast Java i C ++? [Zamknięte]

46

Wydaje się, że C # jest obecnie popularny. Słyszałem, że składniowo jest prawie taki sam jak Java. Java i C ++ istnieją od dłuższego czasu. Z jakich powodów powinienem wybrać C # zamiast Java i C ++?

Mroczny Templariusz
źródło
16
Jak napisano, pytanie było podręcznikowym przykładem niekonstruktywnego „który język jest lepszy?” pytania nie na temat tutaj. Próbowałem uczynić go bardziej konstruktywnym dzięki edycji, ponieważ faktycznie ma dobre, przemyślane odpowiedzi. Zadając pytania o tym charakterze , pamiętaj o często zadawanych pytaniach i tym blogu .
Adam Lear
Pozwól mi dodać trochę ostrzejszych przedmiotów. .NET ma dobrze zdefiniowany DOM ( np. CodeDOM ) dla swojego języka, a zatem dynamiczne generowanie rzeczy w czasie wykonywania jest o wiele prostsze i bardziej wydajne. Może to być również przydatne jako funkcja infrastruktury. Ponadto system typów ma dopasowanie 1 do 1 ze wszystkimi rodzimymi typami W3. U podstaw W3 i inne interopsy były pieczone od samego początku. W przypadku innych języków obawy te zostały po prostu wzmocnione i stanowią dla nich wiele wyzwań. Ponadto, jeśli będziesz wchodził w interakcje z wieloma językami i / lub protokołami, to .NET jest również bardzo silny
JoeGeeky,
5
Hej, JoeGeeky, dodaj swój komentarz jako odpowiedź na pytanie.
Anthony Mastrean,
1
Prawdziwe pytania brzmią: z jakich powodów powinienem wybrać Nemerle, F * i F # zamiast C #? (tzn. wszystkie trzy języki pochodzą ze stwardnienia rozsianego, a wszystkie trzy są lepsze)
mrsteve
Naprawdę nie sądzę, aby jakiekolwiek stwierdzenie gatunku „język / platforma X w porównaniu do języka / platformy Y było ZAWSZE lepsze” jest poprawne i uważam również, że dla każdego X i Y można je łatwo unieważnić w niektórych kontekstach. Jaki jest sens tego pytania?
Shivan Dragon,

Odpowiedzi:

76

Pytanie powinno brzmieć: „Który język lepiej nadaje się do nowoczesnego, typowego tworzenia aplikacji?”.

Edycja: Odniosłem się do niektórych komentarzy poniżej. Mała uwaga: zastanów się, że gdy masz wiele rzeczy natywnie, jako idiomy, to duża różnica niż wdrażanie lub pobieranie i używanie ich za każdym razem. Prawie wszystko można zaimplementować w dowolnym z tych języków. Pytanie brzmi - co natywnie zapewniają ci języki.

Więc z góry mojej głowy (niektóre argumenty dotyczą obu języków) ...

C # jest lepszy niż C ++, ponieważ:

  • Ma natywne odśmiecanie.
  • Pozwala traktować podpisy metod klasowych jako funkcje bezpłatne (tj. Ignorując statycznie typowany thisargument wskaźnika), a tym samym tworzyć bardziej dynamiczne i elastyczne relacje między klasami. edytuj, jeśli nie wiesz, co to oznacza, a następnie spróbuj przypisać metodę członkowską zwracającą wartość void i akceptującą void dla void (*ptr)()zmiennej. Delegaci C # noszą ze sobą thiswskaźnik, ale użytkownik nie zawsze musi się tym przejmować. Mogą po prostu przypisać void()metodę dowolnej klasy dowolnemu innemu void()delegatowi.
  • Ma ogromną standardową bibliotekę z tak wieloma przydatnymi rzeczami, które są dobrze zaimplementowane i łatwe w użyciu.
  • Pozwala zarówno na bloki kodu zarządzanego, jak i natywnego.
  • Wersjonowanie zestawu łatwo rozwiązuje problemy z piekłem DLL.
  • Możesz ustawić klasy, metody i pola, które mają być wewnętrznie asemblerowe (co oznacza, że ​​są dostępne z dowolnego miejsca w bibliotece DLL, w której są zadeklarowane, ale nie z innych zestawów).

C # jest lepszy niż Java pod tym względem:

  • Zamiast dużego hałasu (EJB, prywatne implementacje klas statycznych itp.) Otrzymujesz eleganckie i przyjazne natywne konstrukcje, takie jak Właściwości i Zdarzenia.
  • Masz prawdziwe generyki (a nie zły dowcip, który Java nazywa rodzajami) i możesz się nad nimi zastanowić.
  • Obsługuje natywne idiomy zarządzania zasobami ( usinginstrukcja). Java 7 również to obsługuje, ale C # ma go już od dłuższego czasu.
  • Nie sprawdzono wyjątków :) (dyskusyjne, czy jest to dobre czy złe)
  • Jest głęboko zintegrowany z Windows, jeśli tego właśnie chcesz.
  • Ma Lambdas i LINQ, dlatego obsługuje niewielką ilość programowania funkcjonalnego.
  • Pozwala to wyraźnie zarówno na ogólne kowariancje, jak i na kontrawariancję.
  • Ma zmienne dynamiczne, jeśli chcesz.
  • Lepsza obsługa wyliczeń dzięki yieldoświadczeniu.
  • Pozwala zdefiniować nowe typy wartości (lub odniesienia).

Edytuj - adresowanie komentarzy

  • Nie powiedziałem, że C ++ nie obsługuje natywnego RAII. Powiedziałem, że Java go nie ma (musisz jawnie spróbować / wreszcie). C ++ ma automatyczne wskaźniki, które są świetne dla RAII i (jeśli wiesz, co robisz) mogą również zastąpić zbieranie śmieci.
  • Nie mówiłem nic o emulacji darmowych funkcji. Ale na przykład, jeśli potrzebujesz uzyskać dostęp do pola za pomocą thiswskaźnika i powiązać metodę, która robi to ze wskaźnikiem funkcji ogólnej (tj. Nie w tej samej klasie), to po prostu nie ma natywnego sposobu, aby to zrobić. W C # dostajesz za darmo. Nie musisz nawet wiedzieć, jak to działa.
  • Przez „traktowanie metod składowych jako wolnych funkcji” miałem na myśli, że nie możesz na przykład natywnie powiązać metody składowej z podpisem wolnej funkcji, ponieważ metoda składowa „potajemnie” potrzebuje thiswskaźnika.
  • To usingoświadczenie, 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 potrzebach możesz jawnie użyć usinginstrukcji. Kolejne małe przypomnienie: zwolnienie pamięci jest kosztowną procedurą. GC ma przewagę wydajności w wielu przypadkach (szczególnie, gdy masz dużo pamięci). Pamięć nie wycieknie i nie będziesz spędzać dużo czasu na zwolnieniu. Co więcej, alokacja jest również szybsza, ponieważ nie alokujesz pamięci za każdym razem, tylko raz na jakiś czas. Wywołanie newto po prostu zwiększenie wskaźnika ostatniego obiektu.
  • „C # jest gorszy, ponieważ ma wyrzucanie elementów bezużytecznych”. Jest to rzeczywiście subiektywne, ale jak powiedziałem na górze, w przypadku większości nowoczesnych, typowych aplikacji, odśmiecanie jest ogromną zaletą.
    W C ++ masz do wyboru albo ręczne zarządzanie pamięcią za pomocą newi delete, co empirycznie zawsze prowadzi do błędów tu i tam, lub (z C ++ 11) możesz używać natywnie wskaźników automatycznych, ale pamiętaj, że dodają dużo i dużo hałasu do kodu. Więc GC wciąż ma tam przewagę.
  • „Generyczne są znacznie słabsze niż szablony” - po prostu nie wiem skąd je masz. Szablony mogą mieć swoje zalety, ale z mojego doświadczenia wynika, że ​​ogólne sprawdzanie typów parametrów, kontrawariancja i kowariancja są znacznie mocniejszymi i eleganckimi narzędziami. Siła w szablonach polega na tym, że pozwalają ci trochę bawić się językiem, co może być fajne, ale także powoduje wiele problemów, gdy chcesz coś debugować. Podsumowując, szablony mają swoje fajne funkcje, ale uważam, że generyczne są bardziej praktyczne i czyste.
Yam Marcovic
źródło
5
A jeśli nadal chcesz Garbage Collectora dla C ++, możesz go pobrać .
fredoverflow,
3
niech nam kontynuować tę dyskusję w czacie
Yam Marcovic
6
Inną ważną funkcją w języku C # w porównaniu z Javą, ze względu na wydajność, jest „struct”, rodzaj obiektu, który może być przechowywany na stosie (lub w rejestrach procesora, w szczególnych przypadkach) lub osadzony w innych obiektach sterty. Często stosuje się je do małych obiektów o 1-4 polach, takich jak pary współrzędnych X, Y.
Qwertie,
2
@LokiAstari Wyjaśnianie umysłu? Dopóki pamiętasz wyrejestrowanie programów obsługi zdarzeń i używanie wzorca Dispose w klasach zawierających natywne opakowania, wszystko będzie dobrze. To o wiele mniej wiedzieć i pamiętać niż zarządzanie pamięcią w C ++.
Yam Marcovic,
2
-1, ponieważ brakuje mi sekcji „C ++ jest lepszy niż C # pod tym względem ...” i „Java jest lepszy niż C # ...”. Nie sądzę, aby C # był lepszy we wszystkich obszarach, więc w odpowiedzi bez tych dwóch sekcji prawdopodobnie brakuje ważnych informacji.
Giorgio
30

Ś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 pracy z .NET Framework i jego interfejsami API jest C # . Java nie jest alternatywą dla tego. 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, które zwiększają produktywność. C ++ może nadal być najlepszą opcją w niektórych przypadkach, ale nie w przypadku aplikacji bazodanowych wymagających dużej ilości formularzy, które są powszechne w biznesie.

IIS i Windows Server

Jeśli jesteś przyzwyczajony do pracy w środowisku Windows i w języku C #, będziesz potrzebować najmniejszej inwestycji, aby nauczyć się IIS do programowania serwerów i Windows Server do podstawowej administracji.

Active Directory i Windows Server

Jeśli opracowujesz oprogramowanie, które ma zostać wdrożone w sieciach firmowych, prawdopodobne jest, że korzystają one ze środowiska skoncentrowanego na systemie Windows za pomocą systemu Windows Server z usługą Active Directory. W takim środowisku najłatwiej jest zintegrować i wdrożyć rozwiązanie wykonane w C # i .NET Framework .

Osobiście jestem programistą Java, nie programistą C #, ale pracuję w sieci. Przejdę na C #, gdybym rozwijał aplikacje sieciowe dla sieci Windows. Ale wolę serwery sieciowe oparte na Javie dla Linuxa. Wybrałbym C ++ dla systemów wbudowanych, gdyby nie było wielu zależności.

Tak, C # jest lepszym językiem z bardziej nowoczesnymi funkcjami niż C ++ i Java, ale to nie jest najważniejsze przy wyborze C # .

Podsumowanie

Środowisko dla twojego oprogramowania jest najważniejsze przy wyborze C # . Jeśli pracujesz w środowisku z klientami Windows, serwery Windows, Active Directory, IIS , a może SQL Server następnie C # jest zdecydowanie najlepszym językiem z .NET Framework .

Jeśli pracujesz w środowisku uniksowym z np. Usługami internetowymi, Java będzie moim wyborem. A jeśli pracujesz z systemami wbudowanymi lub musisz zintegrować się z urządzeniami sprzętowymi, C ++ byłby dobrym wyborem.

Jonas
źródło
3
Oczywiście - dlatego używam C # nie z żadnego innego powodu
Murph
Z pewnością możesz korzystać z .NET na innych platformach za pośrednictwem Mono, MonoTouch i MonoDroid, ale moje testy wykazały, że Mono jest znacznie wolniejszy niż .NET dla Windows, a własna platforma Compact Framework firmy Microsoft jest bardzo wolna w Windows CE: codeproject.com/KB/cross -platform / BenchmarkCppVsDotNet.aspx ... oczywiście WPF jest dostępny tylko w systemie Windows (ale i tak mi się nie podoba.)
Qwertie
Jakie masz na myśli zależności, które „wybrałbym C ++ dla systemów osadzonych, gdyby nie było wielu zależności”. Masz na myśli biblioteki Java?
Puckl,
@Puckl tak, ale głównie jvm / jre.
Jonas,
„Jeśli pracujesz w środowisku uniksowym z np. Usługami internetowymi”, można wziąć pod uwagę inne języki i frameworki: ruby, Python, node.js itp.
MarkJ
15

C # i Java

C # to bardzo dobry język, jeśli:

  • Chcesz wykonywać programowanie obiektowe ogólnego przeznaczenia. Jest to klasyczny, statycznie pisany język OOP.
  • Kierujesz reklamy tylko na platformy Microsoft (warto pamiętać, że Microsoft skutecznie sklonował Javę, aby utworzyć C #, ponieważ chcieli języka podobnego do Java, który blokowałby ludzi w systemie Windows. Mogliby używać Java, ale umożliwiłby ludziom łatwe uruchamianie aplikacji na inne platformy ....)

C # jako język jest ładniejszy niż Java na różne sposoby (lepsza składnia dla właściwości, typów wartości, zmienionych generycznych itp.). Wolę C # jako język niż Java, ale w ogólnym rozrachunku są to dość podobne języki i odpowiednie dla podobnych aplikacji.

Z drugiej strony Java ma również kilka dużych zalet:

  • Ogromny ekosystem open source - biblioteki Java, które można uzyskać za darmo, są zdecydowanie najlepsze w każdym języku. Trudno przecenić znaczenie tego - od samego początku Java jest bardzo skuteczna.
  • Narzędzia - narzędzia Java są moim zdaniem lepsze niż to, co można uzyskać w świecie .Net. np. Maven (po opanowaniu go!) robi szczególne wrażenie.
  • Utrzymywalność - 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 wsteczną kompatybilność. Prosta i nieco szczegółowa składnia pomaga również w Javie - łatwiej jest czytać i utrzymywać kod, jeśli kod jest bardzo jasny i wyraźny.
  • Nowe języki - JVM ma niesamowite nowe języki (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 # jest dość blisko i naprawdę sprowadza się do tego, czy chcesz być w obozie Microsoft, czy w obozie Open Source / cross-platform.

Osobiście wolę Javę, ponieważ:

  • Moim zdaniem ekosystem biblioteczny jest 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 działał poprawnie na różnych platformach i mógł działać na dużych klastrach tanich maszyn linuxowych w chmurze.
  • Clojure jest obecnie najbardziej obiecującym językiem na świecie, a jeśli pozostanę przy platformie JVM, z czasem będę mógł z łatwością przenieść mój kod i umiejętności na Clojure.

C / C ++

C / C ++ to w zasadzie zupełnie inna bestia. Bym nie polecam go dla rozwoju aplikacji ogólnego przeznaczenia w dzisiejszych czasach z następujących powodów:

  • Zarządzanie pamięcią - w dzisiejszych programach ogólnego przeznaczenia nie chcesz zarządzać własną pamięcią. Odśmiecanie w C # lub Javie jest znacznie lepsze dla twojej produktywności i zdrowia psychicznego niż którakolwiek z jawnych technik 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żonym językiem. Opanowanie kodu zajmuje dużo czasu, a sam kod może być diabelnie skomplikowany. (Na przykład szablony C ++ są szczególnie owłosione ....)
  • Wydajność - przez większość czasu, a wszystko inne na tym samym poziomie, zajmie Ci więcej czasu, aby załatwić sprawy w C / C ++.

Jest to jednak niewątpliwie świetny wybór w pewnej ograniczonej liczbie specjalnych domen, w szczególności:

  • Systemy operacyjne - prawdopodobnie używasz C / C ++, jeśli piszesz system operacyjny.
  • Rozwój gier - prawie wszystkie najlepsze komercyjne silniki gier to C / C ++. Jest to nadal najlepszy wybór, jeśli tworzysz wymagający tytuł AAA (C # i Java są idealnie odpowiednie dla mniej wymagających / zwykłych gier)
  • Przetwarzanie o wysokiej wydajności - zoptymalizowany C / C ++ jest prawdopodobnie najlepszym sposobem na stworzenie kodu o bardzo wysokiej wydajności. W przypadku większości aplikacji przeprowadzanie tego poziomu optymalizacji nie jest warte wysiłku, ale w niektórych domenach może być niezwykle cenne (na przykład handel z wysoką częstotliwością)
  • Dostęp sprzętowy - Potrzebujesz bezpośredniego dostępu do sprzętu (np. Dla systemu wbudowanego)

Zasadniczo C / C ++ to świetny wybór tylko wtedy, gdy koncentrujesz się na jednej z domen, w których jest szczególnie odpowiedni.

mikera
źródło
1
Wspominasz maven jako przykład lepszych narzędzi dla Java. Nie jestem z tym szczególnie zadowolony, ale patrząc na dokumentację, Maven wygląda trochę podobnie do natywnego narzędzia do budowania .Net MSBuild. Co sprawia, że ​​Maven jest lepszy od MSBuild?
Kevin Cathcart,
1
+! (tylko dlatego, że mam tylko jeden głos): bardzo dobrze wyjaśniłeś, dlaczego ekosystem Java jest lepszy i dlaczego nie należy porównywać tylko składni C # vs Java. Java ma coraz lepsze biblioteki i narzędzia. W samym języku Java niewiele się dzieje, ale pojawiają się nowe, bardzo interesujące języki dla JVM, które są (IMO) o wiele bardziej interesujące niż C #. Nie znam Clojure, ale uważam, że Scala jest bardzo interesująca: od samego początku ma być OOP + FP.
Giorgio
2
dlaczego wszyscy uważają, że kod C ++ jest pełen ręcznego zarządzania pamięcią. Wiesz, że to nie C, RAII oznacza, że ​​prawie nigdy nie musisz ręcznie przydzielać / zwalniać pamięci (robisz to w czasach, gdy język taki jak C # byłby dla ciebie bezużyteczny).
gbjbaanb
3
@gbjbaanb - prawdopodobnie dlatego, że RAII jest nieodpowiedni do ogólnego zarządzania pamięcią. W żaden sposób nie jest równoważny elastycznością z pełnym systemem GC, jak widać w Javie lub C #. Gdy tylko przekroczysz granice RAII, wrócisz na terytorium ręcznego zarządzania pamięcią.
mikera
3
@mikera Chciałbym tylko podkreślić, że na platformie .NET jest także sporo rozwoju językowego. Np. F # jest zgrabnym językiem funkcjonalnym, który płynnie integruje resztę .NET, a Python został niedawno przeniesiony do .NET jako Iron Python (i ma też ładne IDE !).
ikh
13
I heard that syntactically they are almost the same.

Składniowo? Kto daje latającym małpom składnię? Składnia jest korzystna tylko z jednego powodu: umożliwia szybszą migrację z podobnych języków składniowych. Otóż ​​to.

C # jest znacznie lepszy niż Java. Zastanów się nad ich ogólną i funkcjonalną obsługą programowania - C # wyprzedza Javę. Nie wspominając o przeciążeniach operatora i innych dobrych rzeczach - C # jest znacznie lepiej prezentowany. Nie ma mowy, aby Java mogła być uważana za lepszą niż C #.

C ++ i C # to raczej konkurs. C ++ ma niewiarygodnie irytujący archaiczny model kompilacji i szereg starszych chorób z C, ale jego szablony są znacznie potężniejsze niż generyczne, a metody zarządzania zasobami są znacznie bardziej elastyczne i potężne, podobnie jak usingcałkowita porażka i wykonuje szybciej.

DeadMG
źródło
6
Myślę, że należy porównać obie funkcje językowe i dostępność języka na różnych platformach. Z C # jeden jest zablokowany z Microsoftem, z Javą nie jest: to duża zaleta, przynajmniej dla programistów UNIX / Linux. OOP + FP to fajne funkcje, ale po co zawracać sobie głowę C #, jeśli możesz użyć Scali, która działa na JVM i może współpracować ze starszym kodem Java? Nigdy nie nauczyłbym się języka specyficznego dla platformy, chyba że jestem do tego zmuszony.
Giorgio
2
@Giorgio: Projekt Mono istnieje. Po drugie, Microsoft faktycznie dba o swoją platformę - regularnie aktualizuje ją. Java prawie nie miała nic nowego. Pytanie dotyczy także C # vs Java, a nie CLR vs JVM.
DeadMG,
4
@DeadMG: O ile mi wiadomo, nie mogę wziąć żadnego programu C # opracowanego na Windows i zbudować go za pomocą Mono. Nie CLR vs JVM? Pytanie dotyczy tego, dlaczego ludzie używają C # lub Java. Aby ludzie mogli używać języka, potrzebują środowiska wykonawczego i systemu operacyjnego. Nie dyskutuję o tym, że C # ma więcej funkcji niż Java, ale Java jest znacznie bardziej przenośna: jest to czynnik, który może wpłynąć na adopcję języka. W rzeczywistości Java jest nadal używana znacznie częściej niż C #, nawet jeśli brakuje pewnych zaawansowanych funkcji.
Giorgio
3
@Giorgio, to można wziąć dowolny program C # i zbudować go z Mono. Nie można używać niektórych bibliotek (które i tak nie są częścią języka C #). A Java nie jest „dużo bardziej przenośna”. Możesz napisać kod na iOS w C #, ale nie na przykład w Javie.
SK-logic,
2
@ Giogio, Mono jest co najmniej tak samo przenośne jak JVM.
SK-logic,
7

Dobrze C#ma kilka fajnych wbudowanych funkcji, takich jak LINQi delegaci. Wydobywa to, co najlepsze z obu światów - Javai C++. Zajrzyj tutaj, aby zobaczyć pełne porównanie.

Ale Javaświat bardziej mi się podoba - dużo więcej frameworków open source i działa na każdej platformie. I nie mów mi o tym Mono- nie jest to niezawodna opcja.

Petar Minchev
źródło
9
+1: „Ale ja bardziej lubię świat Java - znacznie więcej frameworków open source i działa na każdej platformie.” Miejmy nadzieję, że Oracle tego nie zmieni!
Giorgio
15
Wyjaśnij, co nie jest „niezawodne” w Mono?
SK-logic,
2
@Petar Minchev, To tylko twoja wina. Musisz postępować zgodnie z wytycznymi dotyczącymi przenoszenia i nie należy używać bibliotek nieprzenośnych - w ten sposób każda złożona aplikacja będzie działała niezawodnie z Mono. Rzeczy takie jak WPF nigdy nie zostaną przeniesione.
SK-logic,
2
@Petar Minchev, istnieje wiele nieprzenośnych bibliotek Java. Zawsze musisz zachować ostrożność, jeśli chodzi o przenośność, niezależnie od używanego języka. W każdym razie pytanie dotyczy języków, a nie bibliotek stron trzecich.
SK-logic,
3
@Petar Minchev, GTK # jest przenośny. Użyj go zamiast tego.
SK-logic,
3

Według niektórych źródeł (patrz np. Http://www.indeed.com/jobtrends ) C # jest nadal mniej popularny niż Java i tak popularny jak C ++.

C # zapewnia funkcje, których brakuje w Javie, np. Bezpośrednie wsparcie dla niektórych idiomów programowania, takie 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 struktur i aplikacji typu open source, działa wszędzie, jest mniej związana z konkretnym dostawcą i systemem operacyjnym. C ++ ma podobne zalety, chociaż kod często wymaga adaptacji przechodzących z jednej platformy na drugą. Ponieważ wolę rozwijać się w systemie Linux i, o ile wiem, nie mogę w pełni rozwinąć języka C # w systemie Linux, nigdy nie interesowałem się językiem C #, ponieważ moje potrzeby programistyczne są pokrywane 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 pracy. Dlatego wielu programistów IMO przyjmuje C #, ponieważ oprócz tego, że jest językiem bogatym w funkcje, jest to również dobra inwestycja.

Giorgio
źródło
„Nie mogę w pełni rozwinąć C # w systemie Linux” - czy mógłbyś to rozwinąć? Czy masz na myśli to, że pełna struktura .Net nie jest dostępna, ponieważ nie napotkałem żadnych problemów z samym językiem C # (lub F # jeśli o to chodzi) w systemie Linux?
Wesley Wiser,
@wawa: Według mojej wiedzy .NET Framework odpowiada JDK, a .Net jest dostępny tylko dla Windows, natomiast JDK jest dostępny dla kilku systemów operacyjnych. Jeśli to nie jest poprawne, mogę edytować swoją odpowiedź (i również zmienić zdanie).
Giorgio,
1
Myślę, że bliższą analogią byłaby biblioteka klas podstawowych dla JDK. BCL ma znormalizowane i niestandardowe części. Projekt mono implementuje zarówno standardowe, jak i wiele niestandardowych elementów.
Wesley Wiser,
@wawa: Dziękuję za informację. Rozważam wypróbowanie C # przy użyciu Mono. Jednak nadal mam dość silne przeczucie, że C # jest znacznie silniej związany z Microsoftem niż Java z Oracle (lub Sunem w przeszłości).
Giorgio
3

Co powiesz na „Które ramy programistyczne, w tym język programowania”, są lepsze?

Zapomniałeś dołączyć inne rzeczy, takie jak „środowisko”, z którym będziesz pracować.

  1. Czy zamierzasz pracować tylko dla systemu operacyjnego Windows, ale nie musi to być niski poziom i mieć dużo pamięci i innych zasobów?

    Wybierz .NET jako platformę dla Windows i użyj C #.

  2. Czy zamierzasz pracować tylko dla systemu Windows, ale nie musi to być poziom niski, ALE, nie ma dużo zasobów?

    Wybierz Delphi Framework (i język programowania Object Pascal Delphi lub język programowania Lazarus Object Pascal)

  3. To twoja aplikacja. wymagane do obsługi kilku platform, takich jak gra, w różnych telefonach komórkowych?

    Wybierz Java Framework i język programowania Java.

  4. Czy to Linux z KDE jako interfejsem graficznym?

    Wybierz framework QT z C ++

  5. Czy to Linux z Gnome jako interfejsem graficznym?

    Wybierz framework GObject / GLib z C ++

  6. Czy zamierzasz pracować z wieloma niskopoziomowymi operacjami, takimi jak opracowywanie sterowników?

    Zwykły C lub C ++ jest używany w kilku systemach operacyjnych, ze standardowymi bibliotekami, jako framework.

Tylko moje 2 centy.

umlcat
źródło
1
Nie jestem pewien co do 3. Smartfony są dziś bardzo popularne i AFAIK, wszystkie obsługują C # w jakiejś formie, ale tylko Android obsługuje Javę.
svick,
Czy Delphi nie żyje? :)
šljaker
@ šljaker Nie, ale teza nie jest zbyt popularna.
umlcat,
1
@svick: To kłamstwo. Oprócz Androida, Java istnieje również w pewnej formie na iOS, Symbian, WinMo, Blackberry, Maemo i WebOS (tj. Wszystko, co ma znaczenie lub nadal ma znaczenie; nie zaczynaj od jeszcze mniejszych platform). Android, Blackberry i Symbian oficjalnie obsługują Javę jako opcję programistyczną; Firma Sun obsługiwała Javę w systemie iOS, nawet jeśli Apple jej nie lubi. Java jest podstawowym językiem programowania w telefonach z Androidem i Blackberry. Nie mogę powiedzieć tego samego o C #, AFAICT jest oficjalnie obsługiwany tylko w WinMo.
Lie Ryan,
1

Jeśli przeprowadzisz wyszukiwanie, prawdopodobnie natkniesz się na dyskusję na temat najlepszych 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ę najpopularniejszym językiem.

Java próbowała usunąć niektóre niedociągnięcia C ++ (i uprościć życie programistom w aplikacjach nie działających w czasie rzeczywistym i niekrytycznych). C # spóźniając się na imprezę, uniknął pewnych niedociągnięć języka Java. C # zrobił duży postęp (ponieważ Microsoft ma nad nim dużą kontrolę), podczas gdy postępy w Javie były blokowane przez znaczny okres czasu z powodu konfliktu między jego interesariuszami.

Satyajit
źródło
1

Kilka rzeczy, o których jeszcze nie wspomniano:

C # jest lepszy niż C ++, ponieważ:

Eliminuje pliki nagłówkowe, co przekłada się na wielką prostotę.

C # jest lepszy niż Java, ponieważ:

Obsługuje zarówno typy zdefiniowane przez użytkownika typu referencyjnego (klasa), jak i typu wartości (struct), 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 jednoprocesowe, co znacznie upraszcza kodowanie często występujących konstrukcji zawierających obiekty jednoprocesowe.

Mike Nakis
źródło
Czy możesz wyjaśnić, w jaki sposób posiadanie zarówno typu odniesienia, jak i typu wartości może przynieść korzyści w zakresie wydajności w języku C #?
Giorgio
Na przykład, jeśli chcesz mieć tablicę rekordów, w Javie nie masz innej opcji niż opisanie rekordu za pomocą klasy, więc tablica będzie tablicą odniesień do wielu osobno przydzielonych obiektów. W C # możesz opisać swój rekord za pomocą struktury, więc twoja tablica będzie tylko jednym ciągłym obszarem pamięci zawierającym twoje struktury jeden po drugim, tak jak w C.
Mike Nakis
Jako kolejny przykład, jeśli chcesz zdefiniować mały nowy typ (typ, który pasowałby do słowa maszynowego), nie musisz definiować dla niego nowej klasy; możesz po prostu uczynić go strukturą, aby był zgodny z semantyką wartości. Przekazywanie takich struktur nie będzie droższe niż przekazywanie odniesień do obiektów, ale będziesz mieć korzyść z nieprzydzielania, konstruowania i zbierania śmieci żadnych obiektów.
Mike Nakis
Rozumiem. Tak więc klasy są tworzone na stosie i dostępne za pomocą referencji, podczas gdy struktury są tworzone na stosie (?)
Giorgio
Prawie poprawnie. Jedyną niedokładnością tego stwierdzenia jest to, że struktura zostanie znaleziona na stercie, jeśli zostanie osadzona w innym obiekcie lub w tablicy struktur. Zostanie również znaleziony na stercie, jeśli kiedykolwiek zostanie zapakowany, dokładnie w taki sam sposób, jak typy wartości są zapakowane w Javie.
Mike Nakis
1

Powinieneś wybrać najlepszy język dla swojego oczekiwanego środowiska i swojej wiedzy.

Wybierz C #, jeśli pracujesz w środowisku Microsoft. Podczas gdy C # jest znormalizowany zgodnie z ISO / IEC 23270: 2003, wersja Microsoft pozostaje jedyną pełną implementacją. Kilka kluczowych części języka nie jest objętych standardem, a zatem podlegają patentom Microsoft. Nikt inny nie wdroży w pełni kompatybilnej wersji języka dla innych systemów, więc w efekcie jesteś zablokowany na Microsoft Windows i .Net tak długo, jak długo używasz tego języka. Jeśli szukasz umiejętności korzystania z rynku mobilnego, najlepiej poszukaj innego języka.

Java działa, ale ma sporo narzutu, częściowo ze względu na takie funkcje, jak wyrzucanie elementów bezużytecznych. Java również nie jest znormalizowana przez ISO / IEC, więc nie masz żadnych gwarancji, jeśli zmienisz platformy i wersje Java, tylko najlepsze intencje Sun / Oracle. Jeśli w końcu planujesz pracować z Androidem, zdecydowanie jest to odpowiedni sposób. Programowanie Androida jest w zasadzie Java, z kilkoma zmianami.

C ++ jest ustandaryzowany i prawie wszystkie kompilatory są zgodne z międzynarodowym standardem, więc masz gwarantowane zachowanie, ALE język nie chroni przed tobą. Musisz samodzielnie wykonać czyszczenie i kontrolę 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 celować w Apple, zalecamy spróbować zamiast tego.

Jeśli zauważysz, że w pewnym momencie zostawiasz system Windows w tyle, sugeruję nauczenie się zarówno C / C ++, jak i Java - które są obecnie dostępne na rynku.

TJ
źródło
0

W stosunku do C ++ vs C # (ponieważ nie jestem wystarczająco biegły w Javie), brakuje mi tutaj dostępu do rzeczy niskiego poziomu w systemie Windows. Na przykład nie można opracować natywnego sterownika wyświetlania w języku C # (jeszcze), ale można to zrobić w języku C ++. To nie czyni C ++ lepszym. Widzę C ++ kontra C # jako Asembler kontra C.

Moim zdaniem C # jest o wiele bardziej wydajny, jeśli spojrzysz na czas potrzebny na wdrożenie funkcji. Ograniczenie wydajności środowiska uruchomieniowego .Net jest znikome w przypadku 99% opracowanych aplikacji. Może to mieć znaczenie, jeśli używasz ciasnej pętli, tak, na pewno, ale przez większość czasu aplikacja jest bezczynna, czeka na jakiekolwiek wejście, sygnał lub przerwanie (IO dysku, kliknięcie przycisku, sieć, zakończenie animacji) .

Biblioteka CLR ze wszystkimi jego funkcjami ma jeszcze jedną wielką zaletę. Kiedy trenowałem C # dla młodszych programistów, większość z nich stwierdziła, że ​​podoba im się logiczna konwencja nazewnictwa klas, członków i przestrzeni nazw. Znalezienie cechy metody było logiczne w całym zestawie SDK, coś w czym Visual Basic 5 był poważnie wadliwy. To ogromnie pomogło im w przyjęciu biblioteki. Po nauczeniu się składni języka nauczenie się nowej biblioteki ma duże znaczenie dla dobrego opanowania dowolnego zestawu SDK. Dzięki temu nie musisz od nowa wymyślać koła.

Rob van der Veer
źródło