Principio:Controle las modificaciones a los datos tanto como sea posible. Si se puede predecir que un dato no será o no debe ser cambiado, contrólelo, y no espere que el llamante que usa estos datos no cambie su valor.

Si un parámetro se modifica accidentalmente durante su uso, traerá resultados impredecibles, y este tipo de error es difícil de detectar. Por lo tanto, al diseñar parámetros de método, debemos considerar plenamente las consecuencias de pasar parámetros de tipo de referencia o pasar parámetros de tipo de referencia por referencia.

Si un dato no puede ser cambiado durante el paso, se debe hacer que su valor (campo o propiedad) no se pueda modificar al construir el objeto.


I. Control de parámetros simples

1. Paso de parámetros de tipo valor

En este caso, como se pasa una copia del parámetro, no se afecta el valor original y no se necesita control.

2. Paso de parámetros de tipo referencia

a. Estructuras de datos compuestas por tipos de valor

Los campos deben establecerse como de solo lectura y las propiedades solo con get. La asignación solo se puede realizar mediante el constructor.

b. Estructuras de datos que contienen campos de tipo de referencia

Esta situación es recursiva; es necesario garantizar que los campos sean de solo lectura y las propiedades de solo get, y que los tipos utilizados por los campos de tipo de referencia también cumplan este requisito.

public class SuperClass
{
    private readonly int  _no;
    private readonly SubClass _tag;

    public int NO
    {
        get{ return _no;}
    }

    public SubClass Tag
    {
        get{ retirn _tag;}
    }

    public SuperClass(int no,SubClass tag)
    {
        _no=no;
        _tag=tag;   
    }
}


public class SubClass
{
    private readonly int _field;

    public int Field
    {
        get{ return _field;}
    }

    public SubClass(int field)
    {
        _field=field;
    }
}

II. Control del paso de parámetros de tipo referencia complejos

Lo complejo significa que el parámetro es de tipo matriz o colección, o que el parámetro contiene datos de estos tipos. En este caso, el método anterior no puede garantizar que los datos del parámetro no se modifiquen, porque incluso si el objeto es de solo lectura, los campos (propiedades) de matriz o colección dentro del objeto aún se pueden modificar.

1. Parámetros de colección (también para parámetros de referencia que contienen campos de colección)

En versiones anteriores a .NET 4.5, se puede usar una interfaz que no contenga métodos de modificación de elementos de la colección en lugar del tipo de colección concreto. Por ejemplo, use IEnumerablecomo interfaz en lugar de List. En la versión 4.5, puede usar directamente la interfaz IReadOnlyCollection o un tipo de colección que implemente esta interfaz.

2. Parámetros de matriz

No hay una buena manera de proteger los parámetros de tipo matriz para que no se modifiquen, así que evite usar tipos de matriz como parámetros de método, excepto cuando se usen parámetros opcionales.


III. Para entender lo anterior, es necesario distinguir claramente las diferencias entre los conceptos

  • 1. Diferencia entre tipos de valor y tipos de referencia
  • 2. Diferencia entre paso por valor y paso por referencia (ref y out)
  • 3. Diferencia entre pasar un parámetro de tipo referencia y pasar por referencia (ref y out) un parámetro de tipo referencia [este punto es el más fácil de confundir]

La diferencia es que cuando se crea un nuevo objeto para la referencia durante el uso del parámetro, el primero no afecta el valor original, mientras que el segundo lo afecta. Ejemplo:

void FunA(MyClass a)
{
     a=new MyClass("A");
}

void FunB(ref MyClass a)
{
    a=new MyClass("B");
}

 

void Test()
{
    MyClass a=new MyClass("A"); 
    FunA(a);
    Print(a);              //a还是原始的对象 TEST
    FunB(ref a);
    Print(a);               //a变为新对象   B
}

Recuerde un principio:Los tipos de valor pasan una copia del valor, los tipos de referencia pasan una referencia al objeto. Por lo tanto, las modificaciones a los parámetros de valor no afectan el valor original; las modificaciones a los tipos de referencia afectan el valor original. La construcción de un parámetro pasado por valor no afecta el valor original; el paso por referencia (ref y out) afecta el valor original.

Dirección original: https://www.cnblogs.com/from1991/p/5335585.html