Autor Wątek: C++ i kod natywny kontra C# i kod managed  (Przeczytany 46262 razy)

Offline DarkJarek

  • Użytkownik
    • DarkJarek HomePage

# Kwiecień 14, 2006, 14:50:02
IMHO C# jest jednym z tych wynalazków (jak Visual) które się Microsoftowi udały. Pisze się w nim dość wygodnie aczkolwiek trzeba poznać go dość dobrze aby módz w pełni wykorzystać jago możliwości.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Tewux

  • Użytkownik

# Kwiecień 14, 2006, 19:44:59
Sam pomysł Visual Basica był dobry, coś na wzór Delphi.
Borland odświeżył starego wysłużonego Pascala, a MS sięgnął jeszcze dalej i odmłodził Basica.
Szczerze za Basiciem nie przepadam, zbyt udziwniona składnia, jak dla mnie.
Jedynego Basica jakiego lubiłem to Amos Pro na Amige :P

a C# i w ogóle .NET naprawdę im się udał. Szkoda tylko, że nie przenieśli go na inne platformy... tylko środowisko open-sourcowe samo musi się martwić, o przenośność kodu, projekt Mono, sponsorowany przez Novella.
Więc dziwi mnie z jednej strony, że MS chce przenośności programów (jak Java), a z drugiej strony co to za przenośność? Między róznymi wersjami Windowsa?? Co prawda MS wydał wersje na FreeBSD, ale tylko do niekomercyjnego użytku.

Offline Radko

  • Użytkownik

# Kwiecień 18, 2006, 18:45:52
Czy w VS dla C# jest dorobiony jakiś mega system, że wpisuje się jedną litere i robi za nas wszystko? Jak dotąd jedyną rzeczą co InteliSense nie robi w C++ a robi w C# jest wstawianie ciała do pętli for.

Patrząc na VS2005, można odnieść wrażenie, że edytor C# i C++ pisały zupełnie 2 różne działy i inni ludzie. W C# jest 2x więcej ułatwień niż w C++. I nie tylko chodzi o wstawianie ciała do pętli for. Kilka przykładów z głowy.

1. Jesli napiszesz
   System.Windows.Control c = new
Intellisence automatycznie Ci "podpowie", że chcesz wpisać "System.Windows.Control", więc wciskasz tylko ENTER co da w efekcie:
   System.Windows.Control c = new System.Windows.Control();

2. W 2005 dodali generiki. Jeśli napiszesz:
   public System.Collections.Generics.List< float > moja_lista;
To gdy będziesz chciał dodać element do tej list, poprzez metode Add(), to intelisense Ci wyświetli w podpowiedzi
   moja_lista.Add( float value );
zamiast (jak to ma miejsce w C++)
   moja_lista.Add( Type value );

3. W C++ nie ma #region. Przeciez to zaden problem dodać nową dyrektywę która już była w C# 2003

4. Generowanie kodu do eventów. Gdy podczepiasz jakąś metode pod "event" to nie dość że sam Ci wygeneruje kod podczepiający gdy wpiszesz "+=" to w dodatku wygeneruje Ci w źródle zarys metody razem z parametrami wejściowymi. W C++ eventy to jest straszny crap.

5. Gdy chcesz zaimplementować interface w swojej klasie, to po wpisaniu nazwy interface'u, edytor sam wygeneruje/doda do klasy metody z tego interface'u

To są rzeczy które teraz pamiętam, a których jest dużo więcej. Generalnie widać ze C++ jest mocno zaniedbywany a C# mocno rozwijany.
Jeśli chodzi o całą dyskusję, to jak to ktoś zauważył C# to jest "słuszna koncepcja" i o ile C# jeszcze nie będzie na konsolach przez jakiś czas, to już niedługo większość kodu do gier będzie powstawać właśnie w C#. W tej chwili C# jest głównie używany w narzędziach (patrz np. narzędzia do Sims2 oraz NWN2) w których jest poprostu rewelacyjny.


Offline shyha

  • Użytkownik
    • Shyha@Flickr

# Kwiecień 19, 2006, 09:37:01
3. W C++ nie ma #region. Przeciez to zaden problem dodać nową dyrektywę która już była w C# 2003

Po co #region skoro można sekcję obudować klamrami?

int fun ( int x )
{
int p, z;

p += x;
// jakis tam region
{
for ( int i = 1; i < p; i++ )
{
cout << i;
}
z = x / 2;
}
return z;
}

btw. funkcja nie ma sensu - chodzi tylko o pokazanie 'klamrowania' :)

bies

  • Gość
# Kwiecień 19, 2006, 10:18:52
1. Jesli napiszesz
   System.Windows.Control c = new
Intellisence automatycznie Ci "podpowie", że chcesz wpisać "System.Windows.Control", więc wciskasz tylko ENTER co da w efekcie:
   System.Windows.Control c = new System.Windows.Control();
Fajnie - tylko ze w C++ po new moze byc pelno innych "rzeczy". Skad ma wiedziec co chce wstawic ?.

2. W 2005 dodali generiki. Jeśli napiszesz:
   public System.Collections.Generics.List< float > moja_lista;
To gdy będziesz chciał dodać element do tej list, poprzez metode Add(), to intelisense Ci wyświetli w podpowiedzi
   moja_lista.Add( float value );
zamiast (jak to ma miejsce w C++)
   moja_lista.Add( Type value );
Mi to osobiscie nie przeszkadza.

3. W C++ nie ma #region.
Jest - #pragma region

5. Gdy chcesz zaimplementować interface w swojej klasie, to po wpisaniu nazwy interface'u, edytor sam wygeneruje/doda do klasy metody z tego interface'u
Pewnie dlatego, ze byc moze ktos chce zrobic tylko czesciowa implementacje metod, a reszte w innej klasie ?. Zreszta to i tak w sumie zbedny bajer (choc czasem moze i by sie przydal).

To są rzeczy które teraz pamiętam, a których jest dużo więcej. Generalnie widać ze C++ jest mocno zaniedbywany a C# mocno rozwijany.
C# w stosunku do C++ jest jezykiem prostym, malo skomplikowanym. Mozna bylo sobie pozwolic na taka "inteligencje" w edytorku. Natomiast C++ jest zbyt rozbudowany, i gdyby mi ed zaczal pisac kod za mnie to bym chyba zabil ;p
« Ostatnia zmiana: Kwiecień 19, 2006, 11:25:00 wysłana przez st3tc »

Offline Radko

  • Użytkownik

# Kwiecień 19, 2006, 11:33:08
   System.Windows.Control c = new System.Windows.Control();
Fajnie - tylko ze w C++ po new moze byc pelno innych "rzeczy". Skad ma wiedziec co chce wstawic ?.

To jest przykład z C# a nie C++. W C++ w kodzie używa się w 90% standardowych konstrukcji (nazwa klasy obiekt = new nazwa klasy) i takim konstrukcjom jest dedykowane to ułatwienie. Ponad to, to jest podpowiedź intelisense. Nie chcesz, to nie używasz, chcesz, wciskasz enter.  W C++ przeciętny program używa jednego globalnego namespace'a, więc nazwy się ograniczają do CMojaKlasa. W C# standardowe jest zakopanie klasy w 3-4 namespace'ach, więc takie ułatwienia są wręcz niezbędne.


Cytuj
   moja_lista.Add( float value );
zamiast (jak to ma miejsce w C++)
   moja_lista.Add( Type value );
Mi to osobiscie nie przeszkadza.

I... ? Przecież to tylko jeden z "bajerów" które ułatwiają pisanie w 5%. Uważasz, to za wadę ? Czy może twój komentarz wnosi coś ciekawszego ?

3. W C++ nie ma #region.
Jest

"fatal error C1021: invalid preprocessor command 'region'"

Sprawdź zanim napiszesz.

Cytuj
Pewnie dlatego, ze byc moze ktos chce zrobic tylko czesciowa implementacje metod, a reszte w innej klasie ?

Interface ma taką ciekawą właściwość, że musi być implementowany w całości a nie częściowo.

Sprawdź zanim napiszesz.

Cytuj
Mozna bylo sobie pozwolic na taka "inteligencje" w edytorku.

Lol. Twój ton pozostawie bez komentarza.

Nie zamierzam się sprzeczać który język jest lepszy czy C# czy C++ bo taka dyskusja to wkładanie kija w mrowisko i nigdy do niczego nie prowadzi. Porównałem tylko edytory. I poprostu edytor C# jest bardziej rozbudowany (w funkcje, które Ci się podobają albo i nie), niż C++.

Offline shyha

  • Użytkownik
    • Shyha@Flickr

# Kwiecień 19, 2006, 11:41:46
3. W C++ nie ma #region.
Jest

"fatal error C1021: invalid preprocessor command 'region'"

Sprawdź zanim napiszesz.

#pragma region

Offline Radko

  • Użytkownik

# Kwiecień 19, 2006, 11:46:00

Po co #region skoro można sekcję obudować klamrami?

int fun ( int x )
{
}

#region służy tylko do obudowania wizualnego. można zwinąć np. metodę albo całą klasę, do jednej linijki i opatrzeć to komentarzem.

Chodzi tylko o to, żeby "ukryć" implementację czegoś, żeby nie mącić za bardzo. Dla przykładu:


#region [Property] : float Height - zwraca obliczoną wysokość
public float Height
{
    get
    {
        return CalculateHeight();
    }
    set
    {
        AddSpace( value );
    }
}


co w edytorze zostanie przedstawione jako
[Property] : float Height - zwraca obliczoną wysokość

Gdy takie konstrukcje zaczynają mieć 2 ekrany, to dobrze jest je sobie uporządkować :)

W C++ jest co prawda outlinening ale nie jest tak wygodny jak w C#.

[Edit]

#pragma region

Ożesz, faktycznie jest :) Mea culpa. Nie szukałem dokładnie :) Nie zmieniam jednak zdania, że jest to przydatne :)

« Ostatnia zmiana: Kwiecień 19, 2006, 11:51:52 wysłana przez Radko »

Offline shyha

  • Użytkownik
    • Shyha@Flickr

# Kwiecień 19, 2006, 11:49:43
Ja wiem do czego służy region :)
Osobiście to outlineing w C# mi się nie podoba. Może lepiej "nie wkładajmy kija w mrowisko"  8).


edit: btw. #pragma region działa identycznie
« Ostatnia zmiana: Kwiecień 19, 2006, 12:26:56 wysłana przez shyha »

bies

  • Gość
# Kwiecień 19, 2006, 13:41:31
To jest przykład z C# a nie C++.
Cos podobnego !. Myslalem ze to pascal ... Nie rob ze mnie idioty.

3. W C++ nie ma #region.
Jest

"fatal error C1021: invalid preprocessor command 'region'"

Sprawdź zanim napiszesz.
Podalem Ci odpowiedz a tu prosze - dostaje zjeby od eksperta.

Cytuj
Pewnie dlatego, ze byc moze ktos chce zrobic tylko czesciowa implementacje metod, a reszte w innej klasie ?
Interface ma taką ciekawą właściwość, że musi być implementowany w całości a nie częściowo.
Mowilem o czyms na wzor interfejsu nakladkowego. Nie musze implementowac wszystkiego - moge sobie zrobic, nazwijmy to czesciowa specjalizacja (np czesc uniwersalnych metod oprogramowac) a reszte w kolejnych klasach pochodnych. O co za przeproszeniem sie czepiasz ?. Cos Ci sie nie podoba w zwrocie "a reszte w innej klasie" ?. Zamiast sie rzucac trzeba bylo pomyslec o co mi chodzilo.

Lol. Twój ton pozostawie bez komentarza.
...

Offline Vic

  • Użytkownik

# Kwiecień 19, 2006, 13:48:53
Interface ma taką ciekawą właściwość, że musi być implementowany w całości a nie częściowo.
Inna ciekawa właściwość to możliwości częściowej implementacji w jednej klasie oraz dopełnienia implementacji w klasie dziedziącej, i pewnie o to chodziło.

(ja się jakoś nie mogę przemóc do tego C#, chociaż Mono już dawno zainstalowane i podobno przyjemnie się z GTK# pracuje)

Edit: no i mnie st3tc uprzedził, niepotrzebnie mi telefonem przeszkadzali. :-/
« Ostatnia zmiana: Kwiecień 19, 2006, 13:56:26 wysłana przez Vic »

Offline Radko

  • Użytkownik

# Kwiecień 19, 2006, 14:37:09
Myslalem ze to pascal ... Nie rob ze mnie idioty.
(...)
Podalem Ci odpowiedz a tu prosze - dostaje zjeby od eksperta.

omfg. zrób tak: wdech wydech, wdech wydech...

Cytuj
Cos Ci sie nie podoba w zwrocie "a reszte w innej klasie" ?

C# nie zezwala na częściową implementację interface'u (interface to definicja poprzedzona słowem kluczowym interface a nie klasa i metody wirtualne). A cały czas piszę o C#.


Offline Radko

  • Użytkownik

# Kwiecień 19, 2006, 14:42:38
Inna ciekawa właściwość to możliwości częściowej implementacji w jednej klasie oraz dopełnienia implementacji w klasie dziedziącej, i pewnie o to chodziło.

W C# nie jest to możliwe. Różnica między interfacem (czymś co wogóle nie istnieje w C++ więc nie miałbym po co o tym pisać) a klasami z metodami wirtualnymi:

"An additional benefit of abstract classes is that when new versions of your component are required, additional methods may be added to the base class as needed, whereas interfaces must remain invariant."

bies

  • Gość
# Kwiecień 19, 2006, 14:43:05
C# nie zezwala na częściową implementację interface'u (interface to definicja poprzedzona słowem kluczowym interface a nie klasa i metody wirtualne). A cały czas piszę o C#.
To czytaj uwazniej wypowiedzi innych. Napisales ze masz takie cos w ed od C#, a ja napisalem, ze takie cos w ed od C++ byloby bez sensu (juz prosciej Ci nie potrafie wyjasnic o co mi chodzilo).

C++ posiada interfejsy. To ze nie ma slowa kluczowego "interface" (choc MS sobie wprowadzil) nie oznacza, ze ich nie ma.

PS Juz Ci ktos zwracal uwage zebys edytowal posty a nie nabijal licznik

edit:
Cytuj
Różnica między interfacem (czymś co wogóle nie istnieje w C++ więc nie miałbym po co o tym pisać) a klasami z metodami wirtualnymi
Do implementacji interfejsow (ISO IEC 14882:1998(E), 10.4, 1, strona 172) uzywa sie klas abstrakcyjnych - czyli z metodami pure virtual, a nie samo virtual.

Dla mnie eot.

//edit2 - Radko jesli myslisz, ze ciagłe zabieranie mi karmy mnie rusza - to lol :). (Tak tak - widze przeplyw karmy na forum ;p)
« Ostatnia zmiana: Kwiecień 19, 2006, 15:59:07 wysłana przez st3tc »

bies

  • Gość
# Kwiecień 19, 2006, 16:53:04
Jeszcze co do new. Odpowiednikiem Bla.blabla.Blaa bla = new Bla.blabla.Blaa(); z C# w C++ jest zazwyczaj Bla::blabla::Blaa bla;Jak dla mnie wersja C++ jest czytelniejsza, i nie muszę podpierać się ,,zaawansowaną inteligencją edytora'' aby łatwo coś takiego napisać. :)

A z tym #pragma region czy też #region to mnie rozbawiliście. Chłopcy z MS naprawdę zrobili dyrektywę preprocesora do zwijania kodu. ROTFL. Btw: też tak mam: :set foldmarker=#pragma\ region,#endregion a później :set foldmethod=marker i mogę zwijać tekst nawet pisząc tą wiadomość. ROTFL^2.

#pragma region Test regionu

To jest test!

#endregion

wygląda po zwinięciu:
+-- 5 lines: Test regionu-----(...)--

BP NMSP