Second Opinion
Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale. Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit. www.neurohope.ro |
Abordarea tipului referințã versus tipul pointer (C++/C#)
Last Updated: Sep 26 2015 23:53, Started by
Rhesus
, Sep 26 2015 23:02
·
0
#1
Posted 26 September 2015 - 23:02
O chestiune foarte interesantă, pe care o putem înțelege foarte ușor. Totuși, dacă începi cu C++ și continui cu C# e mai ușor în a înțelege diferențele majore dintre reference type și pointer type. Dacă incepi direct cu un tutorial C# pt. incepători, ai dat de necuratu De ce? Vedem mai jos.
Un articol f. interesant a lui Eric Lippert http://blogs.msdn.co...-addresses.aspx . Voi comenta puțin acest aspect. În primul rând, mai toate resursele, tutorialele C#, definesc o variabilă de tipul referință ca o adresă a referentului . Nimic mai fals!. Pornim de la C++. Încă de la începuturi, pointerul (o variabilă de tip pointer) se dorește a fi (și este) o adresă a referentului. Bun. Dacă citim două tutoriale, unul de C++ și unul de C#, in același timp ce realizăm? Că tipul referință este cam același lucru cu tipul pointer. Fals. Pointerul este o adresă de memorie, din spațiul virtual de adrese. int *p = new int(); int i = 20; p=&i; Pointerul p contine o referință a lui i, prin reținerea adresei lui. Tipul referinta, spre deosebire de tipul pointer, nu contine [neaparat] adresa de memorie a referentului. In ciuda numelui pe care il poarta, referinta nu contine efectiv adresa referentului. Atunci ce conține ? Conform surselor interne o referință ... Conceptul de referință fără a face referire la pointer este vag definit, și așa a și rămas. În sensul că deși mă refer la un obiect, nu utilizez, neaparat, adresa lui ca element de identificare! C# a permis prin introducerea ambelor tipuri, atât ,,programatorilor” certați cu pointerii (înțelegeți de ce am pus in ghilimele) cât și cei profesioniști să realizeze aplicații după bunul plac. Pointerii includ ideea de referință, dar invers nu. Din acest punct de vedere, diferența majoră de notat este aritmetica pointerilor, un lucru extrem de utilizat in practică. Tipul referință, neavând (neutilizând) adresa de memorie a referentului pentru identificare este utilizat doar in 2 moduri. 1. dereferentiere (ajungand la obiectul propriu-zis) , 2. comparare (egalitate) intre 2 referinte. Compararea nu se refera la o simpla comparatie intre adrese. Chiar autorul articolului, dezvoltator principal in cadrul echipei C#, spune sa tratăm tipul referintă ca ceva vag care ne permite să facem referire la un obiect. Pe când, îmi permit să adaug, tipul pointer este referință a unui obiect prin reținerea exactă a adresei lui. Ca o concluzie: O referință este o variabilă care face referire la un obiect, și poate fi folosită ca un alias pt. acel obiect. Pointer-ul este o variabilă care face referire la un obiect prin adresa lui. Dacă pleacă de acasă, nu mai face referire la el. Un subiect interesant de abordat, pe care astept sa-l discutam! Edited by Rhesus, 26 September 2015 - 23:19. |
#2
Posted 26 September 2015 - 23:12
Inca n-ai zis nimic de referintele din C++
int& i = ... Eu zic ca cel mai usor ar fi sa vezi referintele C#/Java ca niste smart pointers in C++. Au menirea de a identifica un obiect, se pot copia prin valoare dar tintesc inca spre acelasi obiect, nu permit operatii fara sens dar care ar avea sens cu pointeri (ex. ++), dar, spre deosebire de C++, dealocarea memoriei e gestionata de un GC si e permisa si o operatiune mai ciudata, dar intalnita la tot pasul: mutarea obiectelor de colo-colo in memorie cand are chef GC'ul. In C# de exemplu, trebuie sa ceri explicit "fixarea" unui obiect in memorie (as in: lasa-l acolo si ia mana de pe el) cand vrei sa-i iei adresa si s-o trimiti spre unamanged code. Edited by dani.user, 26 September 2015 - 23:14. |
#3
Posted 26 September 2015 - 23:53
Mulțumesc că participi la subiect!
Referința e mai legată de obiectul în sine, nu de adresa lui. Cum ai spus și tu, referința identifică obiectul. Dacă obiectul își schimbă adresa, referința obiectului nu este atinsă, fiind mai mult un alias pt. obiectul in sine. La pointeri e invers. Pointerul nu este atat de legat de obiectul in sine, ci de adresa lui. Dacă la un moment dat, obiectul ,,pleacă” (își schimbă adresa), pointer-ul rămâne cu ochii în soare. Pointerul acționează asupra adresei de memorie, pe când referința acționează asupra unui obiect strict, indiferent unde pleacă acesta. Este impropriu, cel puțin in limbajele avansate, să afirmăm că o adresă identifică un obiect (cum se folosește foooooooarte des, din păcate). Edited by Rhesus, 26 September 2015 - 23:57. |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users