Autor Wątek: Czym zastapic C++'owy wskaznik?  (Przeczytany 6721 razy)

poopa

  • Gość
# Sierpień 06, 2008, 21:15:43
operator= nie da się w C# przeciążyć.
hmm?
public static implicit operator MyType0(MyType1 s)
{
  // cokolwiek tutaj zostanie wywołane przy próbie przypisania obiektu typu MyType1 do obiektu typu MyType0.
}
edit: Idąc dalej tym tropem można clone-ować zamiast łapać "referencję na", w podany przez maxest-a sposób.
« Ostatnia zmiana: Sierpień 06, 2008, 21:17:29 wysłana przez poopa »

Offline Mr. Spam

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

Offline revo

  • Użytkownik

# Sierpień 07, 2008, 00:08:58
operator= nie da się w C# przeciążyć.
hmm?

http://msdn.microsoft.com/en-us/library/8edha89s(VS.80).aspx

A od kopiowania obiektów jest ręczna implementacja IClonable i używanie metody Clone lub użycie MemberwiseClone.
« Ostatnia zmiana: Sierpień 07, 2008, 00:12:12 wysłana przez revo »

poopa

  • Gość
# Sierpień 07, 2008, 03:36:46
Cytuj
Idąc dalej tym tropem można clone-ować zamiast łapać "referencję na", w podany przez maxest-a sposób.
Tyle ze wlasnie mnie nie interesuje kopiowanie, ale jedynie "chapniecie" referencji na dany obiekt ;)

Cytuj
Wyrzuc te ksiazki Tongue
Oj nie nie nie - ja sobie bardzo cenie ksiazki p. Boducha i p. Matulewskiego :P

Offline albireo

  • Użytkownik

# Sierpień 07, 2008, 08:24:17
Cytuj
Idąc dalej tym tropem można clone-ować zamiast łapać "referencję na", w podany przez maxest-a sposób.
Tyle ze wlasnie mnie nie interesuje kopiowanie, ale jedynie "chapniecie" referencji na dany obiekt ;)

No ale w czym problem, przecież w C# zmienna typu A (jeśli A jest klasą) jest referencją na obiekt (tłumacząc na C/C++ to zwykły wskaźnik tylko bez arytmetyki), więc przypisanie do niej po prostu przypisuje referencje do obiektu a nie kopiuje go.

Offline revo

  • Użytkownik

# Sierpień 07, 2008, 09:01:12
Oj nie nie nie - ja sobie bardzo cenie ksiazki p. Boducha i p. Matulewskiego :P

Tak to już jest jak programiści Delphi biorą się za coś normalnego ;P (joke ;))

Offline Xion

  • Moderator
    • xion.log

# Sierpień 07, 2008, 09:46:05
Oj nie nie nie - ja sobie bardzo cenie ksiazki p. Boducha i p. Matulewskiego :P

Tak to już jest jak programiści Delphi biorą się za coś normalnego ;P (joke ;))
Ale co ciekawe, w Delphi referencje do obiektów klas działają właściwie tak samo jak w C# (no i w Javie) :-)

poopa

  • Gość
# Sierpień 07, 2008, 12:44:12
Czyli w C# KAZDY egzemplarz jest tak jakby wskaznikiem? W sumie to nawet by ladnie pasowalo bo wlasnie sobie przypomnialem ze w C# klasy trzeba tworzyc operatorem new :). Ale nie ma pewnosci, ze ta referencja bedzie miala 4 (albo 8) bajtow?

Offline revo

  • Użytkownik

# Sierpień 07, 2008, 12:50:52
Ale nie ma pewnosci, ze ta referencja bedzie miala 4 (albo 8 ) bajtow?

A po co w ogóle Ci coś takiego? To nie powinno mieć najmniejszego znaczenia.

Offline prophet

  • Użytkownik

# Sierpień 07, 2008, 12:54:39
Czyli w C# KAZDY egzemplarz jest tak jakby wskaznikiem?

Nie, tyczy się to klas, struktur i wyliczeń już nie. Np. typy podstawowe są wartościami bo są to aliasy na odpowiednie struktury w .NET.
Naprawdę posłuchaj SirMike'a i spal te książki. Przeczytaj na początek dogłębnie C# Programming Guide
« Ostatnia zmiana: Sierpień 07, 2008, 12:58:01 wysłana przez prophet »

poopa

  • Gość
# Sierpień 07, 2008, 14:42:34
Zabraklo mi tam slowa. Oczywiscie chodzilo mi o egzemplarze KLAS

Offline Siódmy

  • Użytkownik
    • SourceSDK.pl

# Sierpień 07, 2008, 15:10:17
a uchwyty?
Systemowe ? Można zapamiętywać w System.IntPtr.

chodzi mi o to że w C++/CLI jest coś takiego:
CKlasa^ cośtam;i to zastępuje natywne wskaźniki
nie ma w C# odpowiednika (nie mogę w dokumentacji znaleźć)?

Offline Anton Chigurh

  • Użytkownik

# Sierpień 07, 2008, 15:43:46
To na prawdę nie jest takie skomplikowane, żeby turlać to przez kilka stron.

Klasa zmienna1;
Klasa zmienna2; // teraz mamy dwie referencje - intelisense będzie narzekał że są niezainicjowane;

zmienna1 = new Klasa();
// ważna, nie poruszona wcześniej kwestia.
// nie ma zmiennych powstających i ginących w ramach danego zakresu.
// Zawsze potrzebne jest "new". *

zmienna2 = zmienna1; // mamy jeden obiekt i dwie zmienne nań wskazujące;

zmienna1 = null;
zmienna2 = null;
// podobno takie coś motywuje(może i zmusza) GC do usunięcia obiektu,
// ale nie dam głowy, że jest to idealny odpowiednik delete.

prawdpodobnie "Klasa^ zmienna;" jest odpowiednikiem C#-owych referencji i nie ma co szukać odpowiednika daszka w C#, bo jest to elementarny składnik języka. Jak ktoś już powiedział, to samo jest w Javie.

* wyjątkiem są bloki "using" :

using(Klasa zmienna = new Klasa())
{
// robimy coś ze zmienną...
}

// tutaj już nie ma zmiennej "zmienna" i na pewno zostałą ona usunięta.
// Klasa "Klasa" musi za to implementować interfejs IDisposable,
// aby na koniec bloku mogła być wykonana metoda "Dispose" - odpowiednik destruktora na wypadek,
// gdyby Klasa coś sobie alokowała na boku, albo musiała coś wykonać na "do widzenia".
« Ostatnia zmiana: Sierpień 07, 2008, 15:46:03 wysłana przez kzysiek »

Offline vashpan

  • Użytkownik
    • Strona

# Sierpień 07, 2008, 16:07:43
a uchwyty?
Systemowe ? Można zapamiętywać w System.IntPtr.

chodzi mi o to że w C++/CLI jest coś takiego:
CKlasa^ cośtam;i to zastępuje natywne wskaźniki
nie ma w C# odpowiednika (nie mogę w dokumentacji znaleźć)?

Bo w C# dzieje sie to "domyslnie" i pisanie
Kod: (cs) [Zaznacz]
CKlasa costam; jest rownoznaczne.

poopa

  • Gość
# Sierpień 07, 2008, 17:26:13
operator= nie da się w C# przeciążyć.
hmm?

http://msdn.microsoft.com/en-us/library/8edha89s(VS.80).aspx

A od kopiowania obiektów jest ręczna implementacja IClonable i używanie metody Clone lub użycie MemberwiseClone.

http://msdn.microsoft.com/en-us/library/aa691315(VS.71).aspx
Masz implicit conversion... w tym przypadku konkretnie opisanym przez maxest-a. Ale generalnie masz rację. Nie wymusisz na operatorze by np. olewał indexer-y i właściwości. Masz po prostu konwersję... czytaj dokąłdniej te książki. mhihihi. Złośliwy żart of kors. ;D

A co do klonowania... To tylko przykład zastosowania przecież... oczywiście zmniejsza czytelność... itd. itp. Ale tą drogą można wymusić na klasach np. zachowywania się jak struct-ury. Czy tez ręcznie pominąć box-owanie.
Hmm... od zawsze za objeżdżaniem operatorów się kryła jakaś metoda. Za a + b kryło się zawsze Add... Więc błędu nie popełniłem sugerując że pod "dorozumianą(?) konwersją" można to zrobić.