ホームページ  >  記事  >  バックエンド開発  >  C# 配列をパラメータとして渡す問題を解決する

C# 配列をパラメータとして渡す問題を解決する

黄舟
黄舟オリジナル
2017-09-19 11:28:212243ブラウズ

原則: 特定のデータが変更されない、または変更されるべきではないと予測できる場合は、そのデータを使用する呼び出し元がその値を変更しないことを期待しないでください。

使用中にパラメータが誤って変更されると、予期しない結果が発生し、このエラーを検出するのが困難です。そのため、メソッドのパラメータを設計するときは、参照型パラメータを渡すことによって起こり得る結果を十分に考慮する必要があります。このようにして。

転送プロセス中にデータの一部を変更できない場合、オブジェクトの構築時に値 (フィールドまたは属性) を変更してはなりません。

1. 単純なパラメータの制御

1. 値型パラメータの受け渡し

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

2. 参照型パラメータの転送

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

は、フィールドを読み取り専用に設定し、属性を取得のみに設定する必要があります。代入はコンストラクターを介してのみ実行できます。

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

この状況は、フィールドが読み取り専用であり、参照型フィールドで使用される型も満たしていることを確認する必要があります。この要件。


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

2. 複雑な参照型パラメータの転送の制御

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

1. コレクション パラメーター (コレクション フィールドを含む参照パラメーターにも同じことが当てはまります)

4.5 より前のバージョンでは、特定のコレクション タイプの代わりにコレクション要素を変更するメソッドを含まないインターフェイスを使用できます。たとえば、List8742468051c85b06f0a0af9e3e506b5c の代わりに IEnumerable8742468051c85b06f0a0af9e3e506b5c インターフェイスを使用します。バージョン 4.5 では、IReadOnlyCollection インターフェイスまたはこのインターフェイスを実装するコレクション型を直接使用できます。

2. 配列パラメータ

配列型のパラメータを変更から保護する良い方法はないため、オプションのパラメータが使用されない限り、メソッドのパラメータとして配列型を使用することは避けるようにしてください。

3. 上記のことを理解するには、概念の違いを区別する必要があります

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) は元の値に影響します。価値。

以上がC# 配列をパラメータとして渡す問題を解決するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。