2016-04-11 8 views
0

私のメソッドはSearchCriteriaパラメータを受け取り、この1つのパラメータを2つのメソッドに渡します。 GetFoo1では、データベースを照会する別のメソッドに渡される前に、基準オブジェクトが変更されます。パラメータとして使用すると変数の値が変化する

私の予想は、このメソッドの範囲内で基準オブジェクトを変更しないことです。つまり、基準となる基準を渡していないため、正確に同じオブジェクトがGetFoo1とGetFoo2に渡されます。この例ではhttps://msdn.microsoft.com/en-us/library/s6938f28.aspx

public virtual async Task<SnapshotObject> GetSnapshot(SearchCriteria criteria) 
    { 
     var snapshot = new SnapshotObject(); 

     snapshot.Foo1 = await GetFoo1(criteria); 
     snapshot.Foo2 = await GetFoo2(criteria); 

     return snapshot; 
    } 

私はGetFoo1を呼び出すときに、私は基準値によって渡されることを期待したいです。何らかの理由で、私がGetFoo1に条件オブジェクトを渡すと、変更をGetFoo2に渡すと、変更がそのまま継承されます。

+0

あなたは、クラスのインスタンスを '複製'したいと思うかもしれません。 – jdweng

+2

Jon Skeetにはこれに関する非常に良い記事があります。 [この記事を参照](http://jonskeet.uk/csharp/parameters.html) – Flott

答えて

4

SearchCriteriaがクラスなので、これが起こっています。したがって、値渡しされても、渡される値はそのオブジェクトへの参照です。

var list = new List<string>(); 
MyMethod(list); 
if(list.Count == 0) // this one will be false because list now have 1 item 
    .... 

void MyMethod(List<string> list) 
{ 
    list.Add("hey!"); 
} 

はしかし、彼らはオブジェクト全体を交換することができません。その手段は、オブジェクト自体の変更は、呼び出し元と同じオブジェクトにアクセスする他の人から見られるとは何

var list = new List<string>(); 
MyMethod(list); 
if(list.Count == 0) // this one will be true 
    .... 

void MyMethod(List<string> list) 
{ 
    list = new List<string>() { "hey!" }; // does not affect the caller. 
} 

この引数を参照渡しに渡した場合、2番目の例では、呼び出し元が、新しく作成されたList<string>を1つの項目で指し示すように変更されます。

それはあなたが「値によって参照型を渡す」の部分ににリンクされている記事で説明しています:

次の例では、方法、Changeに、値によって、参照型パラメータ、arrを渡すことを示しています。 パラメータはarrへの参照であるため、配列要素の値を変更することは可能です。ただし、パラメータを別のメモリ位置に再割り当てしようとすると、メソッド内でのみ動作し、元の変数arrには影響しません。

関連する問題