string - typ referencyjny??

0

String jest typem referencyjnym prawda? Więc jak go się przekaże do metody (bez ref i bez out) i zmodyfikuje w metodzie to powinien mieć nową wartość prawda? To dlaczego tak nie jest?

 
public void Metoda1(string x)
{
    x = "b";
}

string s = "a";
Metoda1(s);
Debug.WriteLine(s); //dalej wartosc 'a'

A jak tak samo zrobimy z instancją klasy (podobnie jak string to też typ referencyjny) to już po powrocie z metody mamy nową wartość - zgodnie z oczekiwaniem:

 
public class Klasa
{
    public int zmienna;
}

public void Metoda2(Klasa x)
{
    x.zmienna = 10;
}

Klasa k = new Klasa();
k.zmienna = 5;
Metoda2(k);
Debug.WriteLine(k.zmienna); //a tu sie zmienilo na '10'

To dlaczego string się nie zmienił a instancja klasy tak??

0

W tej funkcji zrobiłeś coś analogicznego do tego:

string s = "a";
string x = s;
x = "b";

Czyli widać że nie mogłeś mieć wpływu na s.

0

Zadziała w ten sposób

 

public string Metoda1(string x)
        {
            return "b";
        }

            string s = "a";
            s = Metoda1(s);
3

String jest niezmienny (immutable).

0

@Zenek1999 akurat w tym przykładzie to nie ma znaczenia.

        static void Main(string[] args)
        {
            string s = "a";
            Metoda1(ref s);
            Console.WriteLine(s);
        }

        static void Metoda1(ref string x)
        {
            x = "b";
        } 
0

A jaka jest tu zasada? Jak chcemy zmienić wartości pól prostych typów referencyjnych w metodzie to nie trzeba używać ref/out a jak chcemy zmienić referencję do obiektu typów referencyjnych w metodzie to trzeba używać ref/out?

0

String jest typem referencyjnym prawda? Więc jak go się przekaże do metody (bez ref i bez out) i zmodyfikuje w metodzie to powinien mieć nową wartość prawda?

Nie. String tutaj nie różni się od innych typów referencyjnych.
Rzeczywiście string do funkcji przekazywany jest jako referencja, ale ta referencja sama w sobie przekazywana jest przez wartość.
Wewnątrz funkcji podmieniasz referencję, ale wykonujesz tę operację na kopii referencji, przekazanej do wewnątrz funkcji.

Jeśli chcesz podmienić obiekt na zewnątrz funkcji, musisz przekazać referencję przez referencję, czyli z wykorzystaniem ref albo out.

Twój przykład z klasą pokazuje co innego: odwołujesz się do pola klasy, której obiekt został przekazany przez referencję, czyli odwołujesz się do pola oryginalnego obiektu.

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