string - typ referencyjny??

string - typ referencyjny??
AN
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 10 lat
  • Postów:33
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?

Kopiuj
 
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:

Kopiuj
 
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??

msm
gdybyś w Metoda2 zrobił x = new Klasa() to również byś nie zaobserwował zmiany.
Bumcykowy
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 8 lat
0

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

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

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

edytowany 1x, ostatnio: Bumcykowy
DC
  • Rejestracja:około 12 lat
  • Ostatnio:około 10 godzin
  • Postów:411
0

Zadziała w ten sposób

Kopiuj
 

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

            string s = "a";
            s = Metoda1(s);
Zenek1999
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 12 lat
  • Postów:51
3

String jest niezmienny (immutable).

Bumcykowy
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 8 lat
0

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

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

        static void Metoda1(ref string x)
        {
            x = "b";
        } 
edytowany 2x, ostatnio: Bumcykowy
AN
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 10 lat
  • Postów:33
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?

Bumcykowy
Zbyt dużo jest w internecie poradników żeby to tutaj opisywać.
Zenek1999
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 12 lat
  • Postów:51
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
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.

edytowany 2x, ostatnio: Azarien

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.