Różnice C# i C++ z perspektywy kodera C++

0

hej,

kodzę od paru lat w c++, powiedzmy, ze ogarniam wskaźniki, polimorfizm, programowanie obiektowe- ogólnie wiem czym jest C++.
Coraz częściej słyszę od znajomych(tych bardziej doświadczonych), gdy dziele się pomysłami na apkę, ze to by lepiej było zrobić w c# i że c# to i tamto :P Często są to proste apki albo gry. Tutaj powstaje moje pytanie- dlaczego c# jest w takich sytuacjach często polecany zamiast c++? Co takiego daje c#? Jak wygląda sprawa tworzenia grafiki w aplikacjach? C++ zwykle kojarzy mi się bardziej z apkami które mają działać a nie wyglądać, jak wygląda sprawa w c#? Szukałem nieco w necie, ale otrzymuje jedynie suche informacje z których często oba języki nadają się do pisania np gier, ale żadnych praktycznych przykładów, które realnie pokazą mi różnicę.

Ogólnie moglibyście napisać kiedy i dlaczego warto używać c# a nie c++?

Dzięki!

5

Uzywac C# zawsze gdzie sie da
Uzywac C++ tylko i wylacznie jak zalezy nam na wydajnosci/pamieci ram.

Dlaczego?
Development w C# jest duzo szybszy niz w C++. Pisanie aplikacji w C# bedzie po prostu szybsza. W dzisiejszych czasach wydajnosc schodzi na bardzo daleki plan (nie wliczam gier, czy stock-market). Ja wole spedzic 8 godzin na napisanie prostego edytora/generatora map niz spedzic 40 godzin robiac to w C++.
W C# masz wiekszosc juz napisana i gotowa. Tak jak w przykladzie wyzej, chcesz generator map? GUI zrobisz w mgnieniu oka. W C++ tak prosto tego nie zrobisz.

Ten przyklad jest oczywiscie windows-only

zapytam Ciebie w takim razie. Dlaczego chcesz uzywac wszedzie C++? Jakie C++ ma przewagi nad C#?

0

naucz sie C# to sobie porownasz, skupiajac sie na jednej technologii troche sie ograniczasz.
jesli rozumiesz c++ to przejscie na c# nie powinno byc dla ciebie wiekszym wyzwaniem.

fasadin napisał(a):

Uzywac C# zawsze gdzie sie da
Uzywac C++ tylko i wylacznie jak zalezy nam na wydajnosci/pamieci ram.

od siebie dodam tylko ze wiele zalezy od programisty. jestem sklonna stwierdzic ze gdyby sie wzielo lebskiego programiste c++ i drugiego - wymiatacza w c# to pojedynek na wydajnosc kodu bylby dosyc wyrownany (choc duzo zalezy od typu projektu).
przy duzych systemach, przy ktorych pracuje wielu programistow na roznym poziomie zaawansowania, nie sadze aby byla namacalna roznica w wydajnosci kodu wynikowego, a tak jak @fasadin wspomnial - czas tworzenia rozwiazan rozni sie dosc znacznie

2

Według mojej opinii C# ma przewagę nad C++ z następujących powodów:

  1. Więcej jest rzeczy dostępnych od razu "z pudełka" - biblioteka standardowa języka C++ kiedyś była dość skąpa i wydaje mi się, że nadal jest. Można posiłkować się dodatkowymi bibliotekami, ale nie jest już to takie wygodne.
  2. Systemy napisane w języku C++ bywają trochę pomieszane. Dla przykładu, jeżeli chciałbyś wysłać maila z poziomu aplikacji napisanej w języku C++ to pewnie dołączysz sobie jakąś bibliotekę obsługującą protokół SMTP. Problem tylko w tym, że te biblioteki są czasem pisane w C, czasem w C++. Czasem obsługa błędów jest oparta o wyjątki a czasem o zwracane kody błędów. Czasem kod jest napisany obiektowo a czasem nie. To powoduje taki trochę bałagan.
  3. Trudniej w C# popełnić błędy typu "niechcący wyjechałem poza zakres tablicy". W C# od razu się o tym dowiesz bo poleci wyjątek. W C++ może dojść do takiej sytuacji, że zaczniesz pisać po tablicy zaalokowanej w zupełnie innym miejscu programu. Program się nie wysypie, ale zaczną dziać się różne dziwne rzeczy i może się okazać, że naprawienie takiego błędu będzie dość trudne.

Ogólnie mówiąc uważam, że C# w lepszym stopniu pozwala skupić się na celu zamiast skupiać się na celach pobocznych. C++ po prostu jest na ogól bardziej problematycznym językiem (subiektywna opinia).

Jeżeli masz wybór pomiędzy C++ a C# to myślę, że w znacznej większości przypadków lepiej będzie jak wybierzesz to drugie. C++ stosowałbym raczej tam gdzie istotne są takie rzeczy jak niskie zużycie pamięci czy praca blisko sprzętu.

Co do wydajności to jest to często poruszany argument w dyskusjach typu C++ vs reszta. Program napisany w języku C++ może być wydajniejszy od programu napisanego w C#, ale raczej wtedy kiedy piszący go ludzie wiedzą co robią. Jak ktoś np. przekazuje łańcuchy znaków czy kolekcje przez wartość w sytuacji kiedy można spokojnie przekazywać przez referencje to chyba prędzej uzyska efekt odwroty do zamierzonego niż uzyska przewagę w stosunku do C# (tam większość rzeczy przekazywana jest domyślnie przez referencje). No chyba, że optymalizator sobie to poprawi :)

1

Rób w czym Ci wygodniej. W generalnym przypadku @fasadin ma rację, ale jeśli już znasz C++ i, dajmy na to, Qt, to znacznie szybciej napiszesz aplikację okienkową w C++/Qt niż ucząc się C# i konwencji tworzenia GUI w nim.

C# ma przewagę w postaci async/await i LINQ (C++ będzie miał coś podobnego dopiero w 2017, ale niestety i tak prawdopodobnie mniej wygodne/potężne). Do tego, ze względu na mniej zawiłą semantykę narzędzia wspomagające programistę mogą więcej, mniejszym nakładem sił. Aha, no i prawda jest taka, że .NET Framework w rozsądnej wersji każdy ma na swoim windowsie. Biblioteki C++ będziesz musiał rozprowadzać wraz ze swoim programem w formie instalatora.

C++ ma głównie przewagę w wieloparadygmatowości (nie musisz wszystkiego wpakowywać w klasę, nawet jeśli to kompletny bezsens) i, z tego co piszesz, Twojej znajomości. To ostatnie jest nie do przecenienia, możesz w ten sposób stracić wiele godzin na debugowaniu jakiejś prostoty, bo działa ciut inaczej w C# i C++. (opinia) No i dla mnie GUI w Qt jest znacznie sensowniejsze od C#/XAML.

Wydajność - nie ma znaczenia, inaczej byś w ogóle nie podejmował tematu. A nawet jeśli, to prawdopodobnie możesz ten kawałek kodu napisać w C++ i podłączyć za pomocą NativeInvoke czy jakoś tak od strony C#.
Przenoszalność - na linuksach jest Mono, a od niedawna CLR core jest open source. To był problem w roku 2005, ale nie teraz.

edit: zapomniałem o GC, ale C++ ma RAII i jeśli piszesz kod zgodnie z zasadami to brak GC nie jest żadnym problemem (tak samo jak np. w języku Rust).

0

Najważniejsze zalety C# nad C++

  • garbage collector
  • delegaty (coś jak sygnały sloty z Qt tyle, że bardziej uniwersalne)
  • zarządzanie zasobami za pomocą using (potrzebne z racji gc)
  • brak durnych plików nagłówkowych
  • obszerne standardowe biblioteki
  • metadane

Zalety C++:

  • multiplatformowy (w C# są wyjątki, ale w zasadzie jesteś skazany na Windows, podobno MS planuje przeportować .net na inne platformy)
  • brak garbage collecora
  • mnogość dostępnych IDE (VS nie jest tak wspaniały jak niektórzy twierdzą).
0

Dodałbym jeszcze do zalet C# to, że z góry wiadomo, które typy danych są referencyjne, a które są wartościowe. Nawet jak ktoś jest bardzo początkujący i będzie chciał przekazać wielgachną klasę jako parametr funkcji to domyślnie przekaże ją referencyjnie. Eliminuje to nieświadome niepotrzebne kopiowanie obiektów o jakie nietrudno w C++ pomijając znak referencji lub wskaźnika w argumentach.

Dla mnie to bardzo wygodne podejście, bo nie muszę zastanawiać się nad znaczkami przy obiekcie tylko piszę [typ][nazwa] i gotowe, a resztę zrobi kompilator :)

5

Większość zalet C# względem C++ została już wymieniona. Od siebie dorzucę coś moim zdaniem bardzo istotnego:

  • brak UB
  • stosunkowo proste reguły typowania (C++ od zawsze a od C++11 to już szczególnie ma ogromny problem z type deduction i nie zanosi się żeby to miało kiedykolwiek ulec uproszczeniu)

Największą zaletą C++ jest możliwość ręcznego konfigurowania poszczególnych elementów. Dla przykładu alokatorów, wszelakich zasobów, czy wpływu na to jaka semantyka danych zostanie użyta w danym miejscu, itd. To wszystko sprawia, że w C++ można pisać programy, które są zorientowane na wydajność. Z drugiej strony ta zaleta jest często czysto teoretyczna, bo zanim napisze się taki "wydajny" program w C++ to prędzej zje się zęby na próbie zrozumienia o co w tym języku tak na prawdę chodzi i jak należałoby go używać (bez UB).

1

Do wad C# można dopisać niedeterminizm w niszczeniu obiektów, co jest problematyczne np. przy działaniach na plikach. W C++ jest RAII, które ten problem rozwiązuje niejako za nas.

Jeśli chodzi o to kiedy używać C++ odpowiedź jest prosta - unikać kiedy się da. O ile nie trzeba pracować z wielkim frameworkiem w C++ (czyt. gry AAA) to prawie zawsze jest lepsze rozwiązanie (zwłaszcza ostatnio, kiedy pojawiło się trochę fajnych nowych języków).

1 użytkowników online, w tym zalogowanych: 0, gości: 1