• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Płytkie kopiowanie, a typ string

Object Storage Arubacloud
+1 głos
636 wizyt
pytanie zadane 6 czerwca 2015 w C# przez Surykat Stary wyjadacz (14,780 p.)
Czołem. ;) Uczę się o płytkim i głębokim kopiowaniu obiektów i mam dylemat. Z tego, co się dowiedziałem wynika, że płytkie kopiowanie pozwala na skopiowanie obiektów, które nie mają pól referencyjnych, przy urzyciu metody Clone(). No i faktycznie, jeśli obiekt, który próbowałem tą metodą skopiować, posiadał pola referencyjne, kopiowały się tylko właśnie referencje do tych pól, a nie całe pola (obiekty).

Stwierdziłem, że skoro string jest typem referencyjnym, to w jego przypadku będzie to samo. A tu zonk, przy przy użyciu metody Clone(), string zachowuje się jak zwykły typ prosty.

Dlaczego?

2 odpowiedzi

+1 głos
odpowiedź 6 czerwca 2015 przez Dorion300 Szeryf (90,250 p.)
wybrane 14 czerwca 2015 przez Surykat
 
Najlepsza
Wszystkie podstawowe typy danych (int,double a nawet string) to tak zwany "typ prosty" w C#.
komentarz 6 czerwca 2015 przez Surykat Stary wyjadacz (14,780 p.)
Czyli jednak? Gubie się w tym wszystkim trochę, na kursie pewnego znanego blogera .NET'owego było właśnie napisane, że string to typ referencyjny, zresztą string dziedziczy z typu Object, co mnie jeszcze w tym przekonaniu utwierdziło.

 

Ale dzięki, na razie przyjmę taką informację do głowy. ;)
komentarz 6 czerwca 2015 przez Dorion300 Szeryf (90,250 p.)
WSZYSTKO dziedziczy z typu object. nawet int i double.
komentarz 6 czerwca 2015 przez Surykat Stary wyjadacz (14,780 p.)
Okey, to dużo wyjaśnia. sądziłem że wszystko, prócz typów prostych. ;)
+1 głos
odpowiedź 7 czerwca 2015 przez niezalogowany

Typem wartościowym w C# są typy proste, wyliczeniowe, oraz struktury. Niejawnie rozszerzają one klasę System.ValueType, która warunkuje m.in. umieszczenie ich na stosie.

Typy referencyjne natomiast to np.: klasy, tablice, interfejsy i delegaty. I to właśnie w tej grupie znajduje się string. Wydaje mi się, że łatwiej będzie Ci to zauważyć na przykładzie z klasą:

using System;

namespace stringProject
{
	class MainClass
	{
		public static void Main(string[] args)
		{
			Foo someOtherFoo = new Foo("B");
			Foo foo = someOtherFoo;
			someOtherFoo = new Foo("C");
		}
	}

	class Foo 
	{ 
		public string SomeProperty { get; private set; }
		public Foo(string bar) { SomeProperty = bar; } 
	}
}

W przykładzie, zmiennej someOtherFoo przypisujesz referencję do nowopowstałego obiektu Foo("B"), a zmiennej foo, przypisujesz referencję zmiennej someOtherFoo. Teraz obie zmienne wskazują na ten sam obiekt. Następnie zmiennej someOtherFoo przypisujesz referencję do zupełnie nowego obiektu Foo("C"), foo natomiast, cały czas posiada referencję do starego obiektu Foo("B"). To samo jednak dzieje się w sytuacji gdy po prostu przypisujesz wartości dwóm stringom:

using System;

namespace anotherstringproject
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			string me = "Jurek";
			string copy = me;
			me = "Marek";
		}
	}
}

Nie kopiujesz tutaj jednego stringa do drugiego. Zmienna -me- otrzymuje referencję do "Jurek", zmienna -copy- otrzymuje tę samą referencję, czyli obie zmienne wskazują to samo miejsce. Następnie -me- podajesz nową referencję na "Marek", ale -copy- cały czas pokazuje starą wartość (poprzedni adres). Teraz rozumiesz? W stringu nie jest to tak widoczne, bo posługujemy się zwykłym operatorem "=", który w przypadku tej klasy w pewien sposób symuluje zachowanie typu wartościowego.

komentarz 14 czerwca 2015 przez Eryk Andrzejewski Mędrzec (164,260 p.)
NIe ma to jak napisać się przez pół godziny a i tak wybiorą odpowiedź kogoś innego :D
komentarz 14 czerwca 2015 przez niezalogowany
Jeszcze mi bezczelnie łapkę w dół dali :/

BTW. W poście chodziło mi o "uchwyt", nie "referencję" - brakowało mi wtedy słowa.
komentarz 14 czerwca 2015 przez Eryk Andrzejewski Mędrzec (164,260 p.)
No widzisz dziadów :(

Podobne pytania

0 głosów
1 odpowiedź 107 wizyt
pytanie zadane 23 sierpnia 2017 w C# przez Rout Bywalec (2,350 p.)
0 głosów
1 odpowiedź 278 wizyt
+1 głos
1 odpowiedź 118 wizyt
pytanie zadane 14 kwietnia 2021 w C# przez Jacuchna0 Użytkownik (640 p.)

92,555 zapytań

141,402 odpowiedzi

319,546 komentarzy

61,939 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...