String jako typ referencyjny

0

Na jakiej zasadzie typ string jest typem referencyjny? Tylko dlatego, że tablica jest typem referencyjnym? No bo co to za typ referencyjny, do którego trzeba używać ref?

Ponadto

string s = "abc";
string ss = "abc";
Console.WriteLine(Object.ReferenceEquals(s,ss)); 

Zwraca true ponieważ jeżeli stringi mają taką samą wartość, to wtedy wskazują na ten sam adres?

0
echoo napisał(a):

Na jakiej zasadzie typ string jest typem referencyjny? Tylko dlatego, że tablica jest typem referencyjnym?

System.String jest typem referencyjnym, bo dziedziczy z System.Object.

No bo co to za typ referencyjny, do którego trzeba używać ref?

Co, gdzie?

Zwraca true ponieważ jeżeli stringi mają taką samą wartość, to wtedy wskazują na ten sam adres?

Nie, w przypadku stringów ta metoda porówna wartości, a nie referencje, bo tak jest przeciążony operator == w klasie System.String.

0
void TestMethod(ref string t)
{
    t = "SIEMA SIEMA";
}

string test = "SIEMA";
Console.WriteLine(test);
TestMethod(ref test);
Console.WriteLine(test);

No mianowicie chodzi mi o to, że bez ref, test dalej będzie miał wartość SIEMA, a przecież jeżeli jest typem referencyjnym to po co używać ref?

0

Typ string jest niezmienny, co znaczy, że każde przypisanie do zmiennej tego typu powoduje utworzenie nowego obiektu i umieszczenie referencji do niego w tej zmiennej (stara jest gubiona i kiedyś zajmie się nią GC).
Ale to nie znaczy, że trzeba używać ref przy korzystaniu ze stringa, a przynajmniej nigdzie indziej niż poza udziwnionymi akademickimi przykładami jak ten powyżej.

0

String wcale nie jest jakiś magiczny i to nie o niezmienność stringa tu chodzi. Bez refa przypisanie zmieniałoby wartość referencji w samej metodzie TestMethod. W metodzie main bez refa referencja test dalej byłaby niezmieniona, więc wskazywałaby na ten sam obiekt co wcześniej.

Żeby zmienić obiekt trzeba albo dostać się do jego pola i coś w nim pogrzebać np obiekt.pole = nowaWartość lub wywołać metodą która zmienia stan obiektu np obiekt.miaszczMnie(). Przypisanie do zmiennej lokalnej nie zmienia stanu żadnego obiektu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1