原則:データの変更を可能な限り制御する。あるデータが変更されない、または変更されるべきでないと予測できる場合は、そのデータを使用する呼び出し側が値を変更しないことを期待するのではなく、制御する必要がある。

パラメータが使用中に予期せず変更されると、予測不能な結果をもたらし、そのようなエラーは検出が困難である。そのため、メソッドのパラメータを設計する際には、参照型パラメータを渡すことや、参照渡しで参照型パラメータを渡すことで生じる可能性のある結果を十分に考慮する必要がある。

データが受け渡しの過程で変更されてはならない場合、そのオブジェクトを構築する時点で、その値(フィールドまたはプロパティ)が変更されないようにする必要がある。


一、単純なパラメータの制御について

1、値型パラメータの渡し方

この場合、パラメータのコピーが渡されるため、元の値には影響せず、制御は不要である。

2、参照型パラメータの渡し方

a、値型で構成されるデータ構造

フィールドを読み取り専用に設定し、プロパティはgetのみにする必要がある。代入はコンストラクタを通じてのみ行える。

b、参照型フィールドを含むデータ構造

この場合、再帰的であり、フィールドがreadonly、プロパティがgetのみであることを保証すると同時に、参照型フィールドで使用される型もその要件を満たす必要がある。

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;
    }
}

二、複雑な参照型パラメータの渡し方の制御について

いわゆる複雑とは、パラメータが配列またはコレクション型であるか、パラメータがこれらの型のデータを含む場合である。この場合、上記の方法ではパラメータデータが変更されないことを保証できない。オブジェクトが読み取り専用であっても、オブジェクト内の配列またはコレクションのフィールド(プロパティ)は変更できるためである。

1、コレクションパラメータ(コレクションフィールドを含む参照パラメータも同様)

.net 4.5以前のバージョンでは、コレクション要素を変更するメソッドを含まないインターフェースを使用して、具体的なコレクション型の代わりにすることができる。例えば、IEnumerableインターフェースをListの代わりに使用する。4.5バージョンでは、IReadOnlyCollectionインターフェースまたはそのインターフェースを実装するコレクション型を直接使用できる。

2、配列パラメータ

配列型パラメータを変更から保護する良い方法はないため、オプションのパラメータを使用する場合を除き、配列型をメソッドのパラメータとして使用することは避けるべきである。


三、上記を理解するには、概念の違いを明確に区別する必要がある

  • 1、値型と参照型の違い
  • 2、値渡しと参照渡し(refとout)の違い
  • 3、参照型パラメータを渡すことと、参照渡し(refとout)で参照型パラメータを渡すことの違い [この点が最も混同しやすい]

違いは、パラメータを使用する過程でその参照のために新しいオブジェクトを作成した場合、前者は元の値に影響せず、後者は元の値に影響することである。例:

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
}

1つの原則を覚えておくこと:値型は値のコピーを渡し、参照型はオブジェクトの参照を渡す。したがって、値パラメータの変更は元の値に影響せず、参照型の変更は元の値に影響する。値渡しのパラメータの構築は元の値に影響せず、参照渡し(refとout)は元の値に影響する。

原文アドレス:https://www.cnblogs.com/from1991/p/5335585.html