2009-04-28 17 views
1

次のコードで面白い問題が発生しました。 productObjectは、 'VendorLocationId'を含む多くの製品関連変数を含むカスタムオブジェクトです。リストボックスにこれらの項目を考えるASP.net c#magical array issue

"タウンA" 値:1

"タウンB" 値は:2

また所与:両方の項目がリストボックス内で選択されます。私はこの困惑を見つける

productObjectArray[0].VendorLocationId = 2 
productObjectArray[1].VendorLocationId = 2 

:実行した後

1 productObjectArray[] productObjectArray = new productObjectArray[lstLocation.Items.Count]; 
2 int counter = 0; 
3 foreach (ListItem li in lstLocation.Items) 
4 { 
5 if (li.Selected == true) 
6 { 
7  productObject.VendorLocationId = li.Value; 
8  productObjectArray[counter] = productObject; 
9 } 
10 counter++; 
11 } 

は、上記のコードは、この結果を与えます。 productObjectArray [0] .VendorLocationIdは魔法のように2になり、counter = 1になります。

答えて

1

"productObject"は次のようになります。このコードブロックの外側で宣言されているため、配列の両方の要素をという同じオブジェクトに参照しています。したがって、ループ内の最後の時刻である「productObject」を変更すると、配列内のすべての項目に影響します。これは、すべてが同じ正確なオブジェクトを指しているからです。あなたがする必要があるのは、配列内の各要素がオブジェクトの新しいインスタンスを指すようにすることです。

+0

ありがとうございます。私は、各配列項目に対して新しいオブジェクトを生成することによってコードを修正しました。 – Paulj

1

productObjectの1つのインスタンスを使用していて、productObjectArrayの2つのアイテムをその1つのインスタンスを指すように設定しているようです。 VendorLocationIdはproductObjectに最後に設定された値であるため、両方で2になります。