Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Prosledjivanje reference (upucivaca)

[es] :: .NET :: Prosledjivanje reference (upucivaca)

Strane: 1 2

[ Pregleda: 2254 | Odgovora: 28 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Zevs85
Zeljko Todorovic
Novi Sad, Sabac

Član broj: 24612
Poruke: 303
*.vdial.verat.net.



Profil

icon Prosledjivanje reference (upucivaca)17.09.2006. u 23:39

c#.NET
Pitanje, hocu da posaljem referencu (npr objekta RichTextBoxa) nekoj funkciji i da ta funkcija izvrsi upis u RTB, kako?
Sta treba da pise u deklaraciji funkcije i kako treba da je definisem...?

btw: Jel postoji u C# rad sa pokazivacima? Kako bi ovaj problem od gore uradio putem pokazivaca?

Hvala...!
17.09.2006. u 23:39 

negyxo
Aleksandar Perkuchin
unknown

Član broj: 29751
Poruke: 655
*.sksyu.net.



Profil

icon Re: Prosledjivanje reference (upucivaca)17.09.2006. u 23:51
Postoje pointeri u C# u okviru unsafe bloka ali za ovaj tvoj problem nema potrebe za tim. Ako bas hoces da prosledis bilo sta funkciji uvek mozes da stavis da ti je tip argumenta koji prosledjujes object. Konkretno za tvoj problem stavi da ti je tip argumenta RichTextBox i moci ces samo da prosledjujes objekte klase RichTextBox-a.

Code:

void SomeMethod(RichTextBox rtBox)


Pogledaj i starije teme o tipovima podatka. Neki su vec lepo opisali kako se objekti alociraju i prosledjuju.
Only Time Will Tell
17.09.2006. u 23:51 

Zevs85
Zeljko Todorovic
Novi Sad, Sabac

Član broj: 24612
Poruke: 303
*.vdial.verat.net.



Profil

icon Re: Prosledjivanje reference (upucivaca)18.09.2006. u 00:35
Plasim se da me nisi razumeo...
Ja hocu da izvrsim upis u RichTextBox, npr

Code:

void SomeMethod([b]RichTextBox rtBox[/b]){

rtBox.text = "neki tekst";
.
.
rtBox.text = "n-ti tekst";
}


To pozivem iz glavnog programa koji na sebi ima RTB i u njemu zelim upis.

Napomena: Ovaj bold tekst me konkretno zanima. Sta treba da napisem da bi radilo?

Citat:
negyxo:
Pogledaj i starije teme o tipovima podatka. Neki su vec lepo opisali kako se objekti alociraju i prosledjuju.

Ne mogu da nadjem....
18.09.2006. u 00:35 

negyxo
Aleksandar Perkuchin
unknown

Član broj: 29751
Poruke: 655
*.sksyu.net.



Profil

icon Re: Prosledjivanje reference (upucivaca)18.09.2006. u 01:08
I ja se plasim da te nisam razumeo, u stvari plasim se da te i dalje nisam razumeo

Probaj prvo. A ako to nije to onda bojim se da zaista ne razumem.

Starija tema: http://www.elitesecurity.org/t172066-0#1118871
Only Time Will Tell
18.09.2006. u 01:08 

dusty
Predrag Glumac
Konacno u Srbiji :)

Član broj: 15383
Poruke: 508
213.137.127.*

Sajt: www.mika.rs


Profil

icon Re: Prosledjivanje reference (upucivaca)18.09.2006. u 05:53
Da bi 'preneo' neki objekat po referenci u metodu koristi se kljucna rec ref. Naravno, po referenci mogu da se prenesu samo referencijalni tipovi, u protivnom moras da radis boxing.

Code:

public void MyMethod(ref RichTextBox rtb){..........}

.
.
.
this.MyMethod(ref myRichBox);
.
.
.


Slicno se ponasa i out, stim da objekat ne mora da bude instanciran pre poziva metode, vec se pravi nova instanca unutar metode.
Live long and prosper :)
18.09.2006. u 05:53 

negyxo
Aleksandar Perkuchin
unknown

Član broj: 29751
Poruke: 655
*.sksyu.net.



Profil

icon Re: Prosledjivanje reference (upucivaca)18.09.2006. u 09:35
Citat:
dusty: Da bi 'preneo' neki objekat po referenci u metodu koristi se kljucna rec ref. Naravno, po referenci mogu da se prenesu samo referencijalni tipovi, u protivnom moras da radis boxing.


Referencijalni tipovi vec se prosledjuju preko reference. Koristiti ref za referencijalne tipove ima smisla jedino ako ce funkcija da koristi new operator nad tim argumentom. Sa ovim treba biti obazriv. Recimo, u ovom Zevs85-om problemu koristiti new operator unutar funkcije za RichTextBox koji je vec inicijalizovan i verovatno vec u nekoj controls kolekciji, moze dovesti samo do kreiranja novog RichTextBox-a koji nece referencirati onom u controls kolekciji.
ref je, koliko sam ja shvatio, najvise namenjen bas za value tipove. Boxing nema veze sad sa ovim. Boxing se radi - radi toga da bi objekat presao iz value tipa u object tip, recimo int se prevodi u object.

Citat:

negyxo: Ako bas hoces da prosledis bilo sta funkciji uvek mozes da stavis da ti je tip argumenta koji prosledjujes object.


Da ispravim sebe. Znaci stavljati da ti je tip object kojem ce se vrednost izmeniti unutar funkcije ima smisla samo nad reference types. Za value types koristiti ref ili out.
Only Time Will Tell
18.09.2006. u 09:35 

Dejan Vesic
Dejan Vesic
CTO, GTECH Belgrade
Beograd

Član broj: 84929
Poruke: 210
82.117.193.*

Sajt: www.vesic.org


Profil

icon Re: Prosledjivanje reference (upucivaca)18.09.2006. u 09:55

Ovde je mnogo što šta pomešano :-S

- koristi ref kada izmenu radiš nad postojećim objektom (recimo kontrolom)
- koristi out kada šalješ referencu nad tek definisanim objektom

I to je to.
18.09.2006. u 09:55 

dusty
Predrag Glumac
Konacno u Srbiji :)

Član broj: 15383
Poruke: 508
*.ptt.yu.

Sajt: www.mika.rs


Profil

icon Re: Prosledjivanje reference (upucivaca)18.09.2006. u 11:13
Da, pogresio sam za value type.

Citat:
Referencijalni tipovi vec se prosledjuju preko reference


Da, ali se na stek ne stavlja referenca na objekat ako se ne koristi ref.

Citat:
Koristiti ref za referencijalne tipove ima smisla jedino ako ce funkcija da koristi new operator nad tim argumentom


Ovo nema smisla To je samo sintaksa. Ako se koristi new nekog tipa kao argument, JIT ce prvo da kreira objekat, pa ce da ga stavi na stek i pozove metodu. Samo ce da ti ustedi da ne moras da radis nekiObj obj = new nekiObj(); metoda(ref obj);.
Live long and prosper :)
18.09.2006. u 11:13 

negyxo
Aleksandar Perkuchin
unknown

Član broj: 29751
Poruke: 655
*.sksyu.net.



Profil

icon Re: Prosledjivanje reference (upucivaca)18.09.2006. u 11:49
Citat:

Da, ali se na stek ne stavlja referenca na objekat ako se ne koristi /ref/.


To, znam. Zato sam i napisao da ima smisla koristiti jedino ako ce funkcija da koristi new operator nad tim argumentom

Code:

void SomeMethod(ref MyClass mc)
{
    mc = new MyClass();
    ...
}


A pretostavljam da si ti mislio na ovo kod poziva funkcije

Code:

SomeMethod(ref new MyClass())


Sto ti nece ni proci jer ces dobiti compile time error.

Only Time Will Tell
18.09.2006. u 11:49 

mmix
Miljan Mitrovic
Software Architect
Pancevo, Srbija

SuperModerator
Član broj: 17944
Poruke: 2408
198.207.16.*



Profil

icon Re: Prosledjivanje reference18.09.2006. u 11:57
Ajoj. "upucivac", gde si to pokupio?


Dalje, Nemo se ljutite, ali ja ne mogu da verujem koliko vas je zbunjeno oko ove veoma osnovne stvari.

1. Svi tipovi u .NETu su ili value ili reference (string je reference), ako niste sigurni koji je tip, verovatno je referentni

2. Svi reference tipovi se prosledjuju kao pointeri (type*). Tacka. .NET NIKAD nece napraviti kopiju objekta na steku pri formiranju stvarnih parametara (ali NIKAD), ni kao obican, ni kao ref ni kao out parametar.

3. Svi value tipovi se prosledjuju kopiranjem na stek sem kad su ref i out.

4. Ref parametar oznacava "pointer na". Posto je reference tip vec pointer, to znaci da se (ref TextBox x) prosledjuje kao pointer na pointer na objekat X (TextBox**). Jedini razlog da se ovo koristi je da bi promenila sama referenca u pozivnom kodu:

Code:


...
object x = new object();
PoRef(ref x);
// ovde x vise nije onaj koji je kreiran u konstruktoru
...

void PoRef(ref object x)
{
   x = new object();
}


5. Ako hoces da menjas interno stanje objekta, ne treba da koristis ref parametre. Posto vec dobijas referencu po defaultu mozes da joj menjas interno stanje i ta promena ce ostati nakon povratka iz tela metoda.
6. ref na value type je dozvoljen i time se kompajler forsira da kreira pointer na value type. Proces je u pozadini isti kao proces boxovanja, ali je ovo "boxovanje" implicitno kao sto je i "unboxovanje" u telu funkcije implicitno, u prevodu potpuno transparentno. Iako radis sa pointerom na value type, sors kod je isti, kompajler je taj koji pravi razliku.

Znaci ref ne koristis kad radis izmenu NAD objektom, ref koristis kad radis ZAMENU objekta, out radis kad funkcija treba da vrati vise od jednog rezultata pa sam return value nije dovoljan. Princip out je isti kao princip za ref samo sto kompajler nece izbaciti warning ako stvarni parametar nije kreiran (pointer na null value je dozvoljen kao stvarni parametar).

▪ The quicker a phone is answered in sales, the slower it's answered in customer services - Brownridge's Law
▪ Democracy is a device that ensures we shall be governed no better than we deserve - George Bernard Shaw
▪ To err is human--and to blame it on a computer is even more so - Robert Orben
18.09.2006. u 11:57 

Zevs85
Zeljko Todorovic
Novi Sad, Sabac

Član broj: 24612
Poruke: 303
213.244.197.*



Profil

icon Re: Prosledjivanje reference (upucivaca)18.09.2006. u 15:39
@mmix
Citat:
Ajoj. "upucivac", gde si to pokupio?


Znas kako, tesko pitanje :), mislim da je jedna od Krausovih knjiga ili posledica nekih predavanja vezanih za objektno programiranje. Mada, sve u svemu, nazvao bi ih sinonimima, pa sam iz tog razloga naveo oba.

Citat:
Dalje, Nemo se ljutite, ali ja ne mogu da verujem koliko vas je zbunjeno oko ove veoma osnovne stvari.

Ja sam u .NET-u, konkretno C# toliko svez da se jos dimim :) pre manje od mesec dana sam poceo. Radio sam c++, tako da sam se oko vecine stvari relativno lako uklopio, mada vidis ima problema sa osnovnim stvarima.

@All

Mnoge stvari su mi jasnije, VELIKO HVALA. Inace proradilo je ;)
18.09.2006. u 15:39 

Zevs85
Zeljko Todorovic
Novi Sad, Sabac

Član broj: 24612
Poruke: 303
213.244.197.*



Profil

icon Re: Prosledjivanje reference (upucivaca)18.09.2006. u 15:43
Ne znam da li da otvaram novu temu ili jednostavno da pitam ovde...
U c++u napraviti dinamicku listu (jednostruku) je bilo boza. Sintaksa koja je tamo palila ovde mi nesto ne prolazi (naravno sa izmenama). Gde bih mogao naci neki tutorijal ili osnovni primer, sta, kako...?

btw: Ima veze sa pokazivacima ;) bar je imalo u c++u
18.09.2006. u 15:43 

mmix
Miljan Mitrovic
Software Architect
Pancevo, Srbija

SuperModerator
Član broj: 17944
Poruke: 2408
*.maxre.bm.



Profil

icon Re: Prosledjivanje reference (upucivaca)18.09.2006. u 17:34
Citat:
Zevs85: Ja sam u .NET-u, konkretno C# toliko svez da se jos dimim pre manje od mesec dana sam poceo. Radio sam c++, tako da sam se oko vecine stvari relativno lako uklopio, mada vidis ima problema sa osnovnim stvarima.


To da si radio u C++-u se vidi iz aviona, i nisi prvi, ima nas dosta. C++ programerima treba dugo dugo da savladaju sve vestine vezane za pointere i cemu bi konkretno mogao da posluzi pointer na pointer na pointer . Takodje, C++ ima monolitni kompajler koji (ako izuzmemo pragme) prevodi na osnovu sintakse i nije vezan za nijednu konkretnu biblioteku . C# (.NET generalno) su doneli tu promenu da kompajler ne zavisi samo od koda, nego i od toga koje se klase u kodu koriste (sto je varanje ako mene pitate ). To je C++ programerima donelo najvise glavobolje, da alokacija, instanciranje i prosledjivanje razlicito radi za razlicitim tipovima bez eksplicitne instrukcije programera.

Citat:
Zevs85: Ne znam da li da otvaram novu temu ili jednostavno da pitam ovde...
U c++u napraviti dinamicku listu (jednostruku) je bilo boza. Sintaksa koja je tamo palila ovde mi nesto ne prolazi (naravno sa izmenama). Gde bih mogao naci neki tutorijal ili osnovni primer, sta, kako...?
btw: Ima veze sa pokazivacima bar je imalo u c++u


Ima jos uvek. Samo se opusti i zaboravi na * i -> Kad deklarises sledeci clan niza, deklarisi ga kao polje, kompajler ce ga tretirati kao referencu (pointer):

Code:


public class Element 
{
    ...
    public Element Next;
}


Ako samo hoces da koristis uvezanu listu imas vec gotove implementacije u System.Collection i System.Collection.Generics
▪ The quicker a phone is answered in sales, the slower it's answered in customer services - Brownridge's Law
▪ Democracy is a device that ensures we shall be governed no better than we deserve - George Bernard Shaw
▪ To err is human--and to blame it on a computer is even more so - Robert Orben
18.09.2006. u 17:34 

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 528
217.169.219.*



Profil

icon Re: Prosledjivanje reference (upucivaca)18.09.2006. u 19:52
Citat:
mmix:
1. Svi tipovi u .NETu su ili value ili reference (string je reference), ako niste sigurni koji je tip, verovatno je referentni :)


Nisam radio u c++ .NET (ili c++/cli) pa ne znam da li je tamo string value ili reference ali u c# string je value type. Da bi metoda mogla napraviti izmenu string parametra, taj parametar se explicitno mora proslediti sa ref.

18.09.2006. u 19:52 

Zevs85
Zeljko Todorovic
Novi Sad, Sabac

Član broj: 24612
Poruke: 303
*.vdial.verat.net.



Profil

icon Re: Prosledjivanje reference (upucivaca)18.09.2006. u 20:10
@mmix
Citat:
C++ programerima treba dugo dugo da savladaju sve vestine vezane za pointere i cemu bi konkretno mogao da posluzi pointer na pointer na pointer .

Nadam se da se ovaj kontekst odnosi na c# ne na c++?! Obzirom da pricu oko pokazivaca i pokazivaca na pokazivac mi je kristalno jasna i istko tako jasno vidljiva u c++u. Ovde imam problem sto sam preskocio prvih par koraka, tacnije napravio sam dvokorak i bas se zbog toga gubim.
18.09.2006. u 20:10 

Dragi Tata

Član broj: 1958
Poruke: 3899
*.lionbridge.com.

Sajt: www.novetehnologije.com


Profil

icon Re: Prosledjivanje reference (upucivaca)18.09.2006. u 20:25
Citat:
DarkMan: ali u c# string je value type


String je u svim .NET jezicima reference type. U stvari, to i nije definisano na nivou jezika, već na nivou CLRa.
18.09.2006. u 20:25 

mmix
Miljan Mitrovic
Software Architect
Pancevo, Srbija

SuperModerator
Član broj: 17944
Poruke: 2408
*.maxre.bm.



Profil

icon Re: Prosledjivanje reference (upucivaca)18.09.2006. u 21:14
Citat:
DarkMan: Nisam radio u c++ .NET (ili c++/cli) pa ne znam da li je tamo string value ili reference ali u c# string je value type. Da bi metoda mogla napraviti izmenu string parametra, taj parametar se explicitno mora proslediti sa ref.


Kao sto ti rece DragiTata, nisi u pravu. Vecina ljudi se upeca na string, zato sam specijalno to i naglasio. Ono sto pravi problem je sto vecina string operacija zapravo pravi novi string na heap-u i onda vrati "referencu" u varijablu, i ta referenca se naravno ne vrati u pozivni kod i stice se utisak da je string value type jer se nije promenio. Ako npr. unutar metode promenis prvi karakter stringa sa "a" na "b" videces da ce se promena reflektovati u pozivnom kodu...

Code:

public void Met(string xx)
{
// ova promena ce se videti
xx[0] = "a";

// ova promena u xx ubacuje novu referencu (pointer) i ovo se ne vraca
xx = "aasafa";

// ovo takodje generise novu referencu
xx = xx.Replace("a", "x");
}



Citat:
Zevs85:Nadam se da se ovaj kontekst odnosi na c# ne na c++?! Obzirom da pricu oko pokazivaca i pokazivaca na pokazivac mi je kristalno jasna i istko tako jasno vidljiva u c++u. Ovde imam problem sto sam preskocio prvih par koraka, tacnije napravio sam dvokorak i bas se zbog toga gubim.


Ako mislis na int***, mislio sam na C++ ;) Prosto i jednostavno, 3D matrica za sadomazohiste :) Ako to savladas, C++ pointeri su tvoji prijatelji :)

ja koliko znam, takva konstrukcija nije podrzana u CLR-u (postoje 3d matrice naravno, ali pointer na pointer na pointer, to ne :))

▪ The quicker a phone is answered in sales, the slower it's answered in customer services - Brownridge's Law
▪ Democracy is a device that ensures we shall be governed no better than we deserve - George Bernard Shaw
▪ To err is human--and to blame it on a computer is even more so - Robert Orben
18.09.2006. u 21:14 

NrmMyth
Split, Kaštela

Član broj: 63456
Poruke: 839
*.cmu.carnet.hr.



Profil

icon Re: Prosledjivanje reference (upucivaca)18.09.2006. u 21:34
Citat:
mmix:
Code:
// ova promena ce se videti
xx[0] = "a";

Nije mi pri ruci C#, ni C++/CLI kompajler pa moram pitati.
Zar System::String nije immutable?
18.09.2006. u 21:34 

radoica

Član broj: 12972
Poruke: 134
*.yubc.net.



Profil

icon Re: Prosledjivanje reference (upucivaca)18.09.2006. u 22:02
Immutable je.

A string is a sequential collection of Unicode characters that is used to represent text. A String object is a sequential collection of System.Char objects that represent a string. The value of the String object is the content of the sequential collection, and that value is immutable.

A String object is called immutable (read-only) because its value cannot be modified once it has been created. Methods that appear to modify a String object actually return a new String object that contains the modification. If it is necessary to modify the actual contents of a string-like object, use the System.Text.StringBuilder class.

18.09.2006. u 22:02 

mmix
Miljan Mitrovic
Software Architect
Pancevo, Srbija

SuperModerator
Član broj: 17944
Poruke: 2408
198.207.16.*



Profil

icon Re: Prosledjivanje reference (upucivaca)19.09.2006. u 12:12
Citat:
NrmMyth: Nije mi pri ruci C#, ni C++/CLI kompajler pa moram pitati.
Zar System::String nije immutable?


Jeste, vidim da sam uneo jos vise zabune sad, izvinjavam se. Kod je samo trebao da pokaze da je string referentni tip i da kojim slucajem default indexer ima set :) promenio bi se string u pozivnom kodu...


▪ The quicker a phone is answered in sales, the slower it's answered in customer services - Brownridge's Law
▪ Democracy is a device that ensures we shall be governed no better than we deserve - George Bernard Shaw
▪ To err is human--and to blame it on a computer is even more so - Robert Orben
19.09.2006. u 12:12 

[es] :: .NET :: Prosledjivanje reference (upucivaca)

Strane: 1 2

[ Pregleda: 2254 | Odgovora: 28 ]

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.