Definitia C++ : C++ is a general-purpose programming language with high-level and low-level capabilities. C++ is regarded as a mid-level language. (adik e o combinatie intre low level (lucrul cu pointerii, adresele de memorie etc) si high level (oop).
Definitia C# : C# is a simple, modern, object oriented, and type-safe programming language derived from C and C++. (type-safe adica nu te lasa sa faci “matrapazlacuri” ca in C++ gen pointeri void, iar erori de genu “Access violation” (cand incerci sa accesezi o zona de memorie nealocata in c++) sunt INEXISTENTE, (ca si in java de altfel).
Mai jos o sa prezint cateva diferente intre limbaje, o comparatie a timpilor in ambele limbaje(cei care sustin ca c++ e mai rapid vor avea o surpriza:D), precum si o alta problema prost tratata pe majoritatea blogurilor/forumurilor: PORTABILITEA.
1).Net au implementat o chestie GENIALA: Garbage Collectoru. Cu “unealta” asta practic scapi de “delete” sau “delete[]” din c++, framework-ul se ocupa de memorie, decide daca anumite zone de memorie si-au incetat activitatea si le dealoca automat. (de aceea destructorii in c# au doar un rol simbolic).
2)Codul C++ este compilat in cod assembly, pe cand c# este compilat in “Intermediate language” (sau pe scurt IL), apoi acesta este compilat in executabil printr-o metoda Just-In-Time Compilation. O alta mare diferenta fata de c++.
Sa presupunem ca avem o aplicatie cu 1000 de fct, clase si metode, dar in functie de datele de intrare poate folosi chiar si 1-2 functii din toata gramada. C++ incarca TOT la compilare, pe cand compilatorul de c# incarca fct/clasele pe masura ce acestea sunt cerute.
3)Alocarea pe stiva/ pe coada. In c# obiectele simple precum int, float, double, sau struct-urile sunt create pe stiva, iar clasele intotdeauna in coada. Diferenta fata de c++:
Myclass mine=new Myclass(); //C#
Myclass *pMine=new Myclass; //C++ – este stocat in coada
Myclass Mine; //C++ – este sotcat pe stiva
4)if /else , while , for sunt la fel ca in C++. switch e un pic schimbat (daca in c++ nu e obligatoriu sa pui break dupa fiecare case, in C# este obligatoriu). C#u mai are insa o chestie faina: foreach (contestat de unii pt ca se creaza obiecte virtuale si cica ingreauneaza lucrul, procesoarele de azi chiar NU mai simt diferenta)
int[] v = new int { 1, 4, 7, 9, 11, 25, 6 };
foreach (int i in v)//aici practic se creaza de fiecare data un obiect virtual int
if (i % 2 == 0)
Console.WriteLine(i);//echivalent cout<<i<<endl;
5)in c# exista 2 mari tipuri de date: value type si refference type.
Tipurile simple precum int, float , double , bool , precum si struct sunt value type, adik daca am codul urmator:
mystruct m=new mystruct();
mystruct m2=m;//se face copierea bit cu bit din m in m2
Refference type sunt toate clasele si tipurile ce deriva din object. Spre ex codul urmator:
myclass m= new myclass();
myclassm2=m;//nu se face copiere bit cu bit, m2 va fi o referinta pt m
m2.camp=10;//practic m.camp va fi egal tot cu 10
6)Ar fi cazul sa prezint tipurile de variabile din c#, sunt ceva mai multe
* char – care (spre surprinderea unora are size 2, nu 1 ca in c++, cuprinde ascii extins)
* byte – ia valori de la 0 la 255
* short (sau Int16) -32768 – 32767 (pt unsigned exista ushort )
* int (sau Int32) -2,147,483,648 – 2,147,483,647 (la fel exista si uint )
* long (sau Int64) –9,223,372,036,854,775,808 – 9,223,372,036,854,775,807 (la fel, ulong )
* un tip nou este decimal : ±1.0 × 10^−28 to ±7.9 × 10^28(pe 16 octeti)
* float, double , bool la fel ca in C++
* exista string , ca variabila, si cu o groaza de metode:
string s = “Mama Are Mere”;
string[] vec = s.Replace(‘m’, ‘n’).ToLower().Remove(4, 4).Split(‘ ‘); //in final da un vector {“mana”, “mere”}
O alta parte faina, el stie exact cata memorie sa aloce in vec.
* object, care practic poate tine orice:
object o1 = “mama mere”;
object o2 = 13.4F;
float f = (float)o2;
object[] o = new object[] { “mama”, 13, null, DateTime.Now };
7)”Chestiile” conditionale (if, while etc) nu mai merg ca in C++, spre ex:
int x = 4;
if (x) ;//in c# iti tipa compilatorul, incearca sa transforme int la bool si nu merge, conditiile trebuie sa fie musai bool
if (x != 0) ;//asa e ok
bool b = true;
8)try–catch– and finally
baietii au mai adaugat un finally care este very useful la lucru cu DB (conexiunile se inchid intotdeauna in finally
, la fel si cu stream-urile)
9) O chestie faina sunt proprietatile. Presupun ca majoritatea ati auzit de getteri si setteri, in c++ au o forma primitiva:
class mycls
{int variabila;
public: int get(){return variabila;}
void set(int _var){variabila=_var;}
}
in c# 2.0 suna cam asa:
public class Employee
{
private int age;
public int Age
{
get { return age; }
set { age = value; }//value este cuvant cheie, si bine inteles poti lasa doar get-ul, doar set-ul, sau sa faci get-uri si seturi mai complicate gen return Math.Pow(age,3);
}
}
de la 3.5 incolo suna cam asa (foarte util pt variabille in care ai si get si set, aici getnu poate fi despartit de set):
public class Employee
{
public int Age { get; set; }//That’s all:)
}
10)Ce are c++u si nu are c#u: mostenirea multipla. De asemenea nu poti deriva decat cu public
class B:A //numai si numai asa se poate deriva (si se deriva public)
Si cam astea ar fii diferentele principale. In posturile viitoare o sa va mai prezint niste chestii faine precum eventurile, interfetele si delegates (echiv function pointers din c++)
Acum v-am promis ca va arat cam cum sta treaba cu timpii. Ei bine DA, C++ e mai rapid decat C#…2.0
Am luat un exemplu micut: crearea unui vector de 10 milioane de nr random, iar apoi in alt vector copierea variabilelor care %3==0. Mi-e prea lene sa fac charturi si alte prostii, trageti si voi concluziile:D Iata codurile:
C++: (compilator microsoft visual c++ 6.0)
int t1=clock();
short *v=new short[10000000];
for(register long i=0;i<10000000;i++)
v=rand()%32000;
int t2=clock();
printf(“%d\n”,t2-t1);
short *rez=new short[10000000];
long cont=0;
for(register long j=0;j<10000000;j++)
if(v[j]%3==0)rez[cont++]=v[j];
int t3=clock();
printf(“%d”,t3-t2);
C# 2.0
Random rnd = new Random();
DateTime t1 = DateTime.Now;
short[] v = new short[10000000];
for (long i = 0; i < 10000000; i++)
v = (short)rnd.Next(32000);
DateTime t2 = DateTime.Now;
Console.WriteLine(t2 – t1);
short[] rez = new short[10000000];
long cont = 0;
for (long j = 0; j < 10000000; j++)
if (v[j] % 3 == 0) rez[cont++] = v[j];
DateTime t3 = DateTime.Now;
Console.WriteLine(t3 – t2);
Console.ReadKey();
Si timpii(Intel Celeron D220 cu 1.20GHz si 2GB of RAM, windows xp sp3, imediat dupa restart, cand prog intrau pt prima data in memorie, veti vedea ca la rularile viitoare timpi vor fi mai buni)
C++:
0.109 si 0.282 //rulare 1
0.109 si 0.266 //rulare 2
0.109 si 0.266 //rulare 3
C# 2.0 (un singur avantaj, se pastraza in memorie unele date, iar cautarile devin vizibil mai rapide, ceea ce la c++ nu exista, oricum per-total, timpi mai buni pentru c++ la crearea vectorului, iar la verificare C#-ul se apropie ce C++)
0.578 si 0.687 //rulare 1
0.546 si 0.328 //rulare 2
0.562 si 0.296 //rulare 3
Si acum timpii aceluiasi program cu LINQ (framework 4.0), mentionez ca timpii c#-ului de mai sus sunt tot sub framework 4.0, deci f probabil mai mari, deoarece ultimu framework se bazeaza pe o cu totul alta abordare):
0.546 si 0.515 //rulare 1 (am fost fair play si am pus primul timp, sincer nush ce dracu a avut pt ca am mai incercat alte “prime rulari” – cu prog apelat pt prima oara de la restart – si nu mi-a dat atata). probabil procesorul in momentul ala avea treburi mai importante
0.546 si 0.015 //rulare 2
0.546 si 0.015 //rulare 3
Deci un timp de 20 de ori mai bun (pe laptopul meu scot timpu asta cand o operatie e instanta). Si iata codul (o sa abordez in alt post ce-i cu linq asta si cu ce se manca):
Random rnd = new Random();
DateTime t1 = DateTime.Now;
short[] v = new short[10000000];
for (long i = 0; i < 10000000; i++)
v = (short)rnd.Next(32000);
DateTime t2 = DateTime.Now;
Console.WriteLine(t2 – t1);
var rez = from vv in v where vv % 3 == 0 select v;
DateTime t3 = DateTime.Now;
Console.WriteLine(t3 – t2);
Console.ReadKey();
ps: cand zic timp mai bun ma refer la timpul de cautare, caci acesta e singurul care conteaza, spre ex la lucru cu bazele de date. Si ca sa vedeti adevarata lui putere, va dau un exemplu al unei cunostiinte, programator cu experienta: avea o baza de date cu cateva zeci de mii de intrari si ca sa faca un raport (join-uri peste join-uri) ii lua in jur de 10 minute cu C# 2.0 (si sql bineinteles), cu linq neoptimizat 6 secunde, iar dupa ce au stat baietii si i-au mai facut niste optimizari au ajuns la 1.2 secunde….de la 10 minute, stiu k suna a fantasy, dar asa este.
ps2: am incercat si cu 500 milioane cu linq. iata rezultatul:
27.32 secunde si cautarea in 0.015 (aceeasi valoare pt operatii instant, pt 500 de milioane!)
Portabilitatea o sa v-o prezint intr-un post viitor ca m-am intins cam mult. Pe scurt: programele c# merg portate pe orice sistem de operare
Si inca o ultima chestie si inchei. Cand zic c# probabil toti se gandesc la windows aplication (fie k sunt in consola, fie k au un gui atasat) GRESIT! C# se afla si in spatele aspx-ului, in spatele silverlight-ului care vine incet din urma si cu pasi marunti devanseaza flsh-ul (un exemplu: ipad-ul nu suporta flash, dar suporta silverlight), wpf, ajax, webservicies, dll-uri si multe alte nebunii