2008-11-05 17 views
21

Quiero pasar un tipo de referencia por valor a un método en C#. Hay una manera de hacerlo.Pasar tipos de referencia por valor en C#

En C++, siempre podía confiar en que el constructor de copias entrara en juego si quería pasar por Value. ¿Hay alguna forma en C# excepto: 1. Creación explícita de un nuevo objeto 2. Implementando IClonable y luego llamando al método Clone.

Aquí hay un pequeño ejemplo:

Tomemos una clase A en C++ que implementa un constructor de copia.

Un método func1 (clase A), se puede llamar así diciendo func1 (objA) (crea automáticamente una copia)

¿Existe algo similar en C#. Por cierto, estoy usando Visual Studio 2005.

Respuesta

8

Como ya se explicó, no hay equivalente a los constructores de copia de C++.

Otra técnica es utilizar un diseño donde los objetos son inmutables. Para objetos inmutables no hay diferencia (semántica) entre pasar una referencia y una copia. Esta es la forma en que se diseña System.String. Otros sistemas (especialmente los lenguajes funcionales) aplican esta técnica mucho más.

19

No, no hay copia-constructor equivalente en C#. Lo que está pasando (por valor) es una referencia .

ICloneable es también arriesgado, ya que está poco definido si es profundo vs superficial (además no es muy compatible). Otra opción es utilizar la serialización, pero de nuevo, eso puede atraer rápidamente mucha más información de la que pretendía.

Si le preocupa que no desee que el método realice cambios, podría considerar hacer la clase inmutable. Entonces nadie puede hacer algo desagradable.

0

echar un vistazo a this

public class Product 
{ 
    public string Name; 
    public string Color; 
    public string Category; 

    public Product(Product o) 
    { 
     this.Name=o.Name; 
     this.Color=o.Color; 
     this.Category=o.Category; 
    } 
    // Note we need to give a default constructor when override it 

    public Product() 
    { 
    } 
} 
public Product Produce(Product sample) 
{ 
    Product p=new Product(sample); 
    p.Category="Finished Product"; 
    return p; 
} 
Product sample=new Product(); 
sample.Name="Toy"; 
sample.Color="Red"; 
sample.Category="Sample Product"; 
Product p=Produce(sample); 
Console.WriteLine(String.Format("Product: Name={0}, Color={1}, Category={2}", p.Name, p.Color, p.Category)); 
Console.WriteLine(String.Format("Sample: Name={0}, Color={1}, Category={2}", sample.Name, sample.Color, sample.Category)); 
1

De acuerdo con este enlace (ya publicado): http://msdn.microsoft.com/en-us/library/s6938f28(VS.80).aspx

El paso de un tipo de referencia por el valor se muestra a continuación. El tipo de referencia arr se pasa por valor al método de cambio.

Cualquier cambio afectará al elemento original a menos que a la matriz se le asigne una nueva ubicación de memoria, en cuyo caso, el cambio es completamente local al método.

class PassingRefByVal 
{ 
    static void Change(int[] pArray) 
    { 
     pArray[0] = 888; // This change affects the original element. 
     pArray = new int[5] {-3, -1, -2, -3, -4}; // This change is local. 
     System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]); 
    } 

    static void Main() 
    { 
     int[] arr = {1, 4, 5}; 
     System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr [0]); 

     Change(arr); 
     System.Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", arr [0]); 
    } 
} 

En el cierre, para una discusión más en profundidad, ver el mensaje por Jon Skeet en esta pregunta:

Passing Objects By Reference or Value in C#

Cuestiones relacionadas