Passa oggetto per riferimento in C#

Muhammad Maisam Abbas 16 febbraio 2024
  1. Passare variabili per valore a una funzione in C#
  2. Passare variabili per riferimento a una funzione in C#
  3. Passaggio di oggetti per riferimento a una funzione in C#
Passa oggetto per riferimento in C#

Questa esercitazione discuterà i metodi per passare un oggetto a una funzione in C#.

Passare variabili per valore a una funzione in C#

Tutte le variabili del tipo di valore vengono passate per valore per impostazione predefinita in C#. Supponiamo di passare una variabile per valore a una funzione e di modificare quella variabile nella funzione. In tal caso, non vi è alcun effetto sul valore della variabile passata negli argomenti della funzione. Quello che succede qui è che una copia separata della variabile passata viene creata nella memoria e tutte le operazioni vengono eseguite su quella particolare copia. L’esempio di codice seguente mostra come passare una variabile di tipo valore per valore in C#.

using System;

namespace pass_object_by_reference {
  class Program {
    static void method1(string value) {
      value = "something";
      Console.WriteLine("New value = {0}", value);
    }

    static void Main(string[] args) {
      string valueType = "Nothing";
      method1(valueType);
      Console.WriteLine("Original Value = {0}", valueType);
    }
  }
}

Produzione:

New value = something Original Value = Nothing

Nel codice precedente, abbiamo passato la variabile stringa valueType per valore alla funzione method1() che assegna un nuovo valore alla variabile passata. Due diverse copie di variabili con lo stesso valore vengono create nella memoria quando passiamo la variabile valueType per valore alla funzione method1(). E poi, la seconda copia della variabile viene modificata in un valore something. Questa seconda copia è accessibile solo all’interno della funzione method1(). Qualsiasi modifica a questo secondo valore non cambia la variabile originale valueType.

Passare variabili per riferimento a una funzione in C#

Possiamo anche passare una variabile di tipo valore per riferimento con la parola chiave ref in C#. La parola chiave ref specifica che un valore è passato per riferimento a una funzione. Con questo approccio, esisterà solo una copia della variabile nella memoria e un puntatore separato verrà passato alla funzione che punta al valore della variabile. Il seguente esempio di codice ci mostra come passare una variabile di tipo valore per riferimento con la parola chiave ref in C#.

using System;

namespace pass_object_by_reference {
  class Program {
    static void method1(ref string value) {
      value = "something";
      Console.WriteLine("New value = {0}", value);
    }

    static void Main(string[] args) {
      string valueType = "Nothing";
      method1(ref valueType);
      Console.WriteLine("Original Value = {0}", valueType);
    }
  }
}

Produzione:

New value = something Original Value = something

Nel codice precedente, abbiamo passato la variabile del tipo di valore valueType facendo riferimento alla funzione method1() con la parola chiave ref in C#. La funzione method1() accetta un riferimento alla variabile valueType come argomento e modifica il valore della variabile valueType a something. Questa volta, il valore originale viene modificato.

Passaggio di oggetti per riferimento a una funzione in C#

Per impostazione predefinita, tutte le variabili del tipo di riferimento come istanze di classe, istanze di struttura e così via vengono passate per riferimento alle funzioni in C#. Quello che succede qui è che l’oggetto originale non viene mai passato come parametro a una funzione. Un nuovo riferimento all’oggetto viene passato per valore come argomento alla funzione. Quindi, finiamo per avere due copie di puntatori che puntano alla stessa posizione di memoria. Se modifichiamo il valore di quel puntatore, viene modificato anche il valore dell’oggetto originale. L’esempio di codice seguente mostra come passare un oggetto per riferimento a una funzione in C#.

using System;

namespace pass_object_by_reference {
  public class Sample {
    public string s { get; set; }
  }
  class Program {
    static void dosomething(Sample obj) {
      obj.s = "something";
    }
    static void Main(string[] args) {
      Sample sam = new Sample();
      sam.s = "Nothing";
      dosomething(sam);
      Console.WriteLine(sam.s);
    }
  }
}

Produzione:

something

Nel codice precedente, abbiamo passato l’oggetto sam facendo riferimento alla funzione dosomething() che modifica la proprietà s all’interno dell’oggetto sam. Cambia il valore dell’oggetto sam originale e assegna qualcosa alla proprietà sam.s. Sebbene questo sia il modo predefinito per passare gli oggetti per riferimento, esiste un’eccezione a questo approccio. Se inizializziamo l’oggetto passato con la parola chiave new e il costruttore della classe, all’interno della memoria viene creata una copia separata dell’oggetto. Qualsiasi modifica al valore di quell’oggetto non modifica l’oggetto originale passato come parametro. Nell’esempio di codice seguente viene illustrato uno scenario in cui questo oggetto è passato per valore a una funzione in C#.

using System;

namespace pass_object_by_reference {
  public class Sample {
    public string s { get; set; }
  }
  class Program {
    static void dosomething(Sample obj) {
      Console.WriteLine("Initial passed value = {0}", obj.s);
      obj = new Sample();
      obj.s = "something";
      Console.WriteLine("New value = {0}", obj.s);
    }
    static void Main(string[] args) {
      Sample sam = new Sample();
      sam.s = "Nothing";
      dosomething(sam);
      Console.WriteLine("Original Value = {0}", sam.s);
    }
  }
}

Produzione:

Initial passed value = Nothing New value = something Original Value = Nothing

Abbiamo passato l’oggetto sam per valore alla funzione dosomething() in C# nel codice precedente. La funzione dosomething() prende l’argomento, stampa il suo valore iniziale, modifica il valore e stampa il valore modificato. Questo nuovo valore viene assegnato a una nuova posizione di memoria e non è possibile accedervi dall’oggetto originale sam.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

Articolo correlato - Csharp Class