私の研究中、構造体は値型なので、コピーされた構造体の変更はクラスに対してではなくオリジナルを変更します。これは私が欲しい、期待している行動です。しかし、以下の最小コード例では、コピーされた構造体の変更が、リストと配列の両方についてオリジナルに反映されていることが明らかです。あなたがテストできるボタンが1つ付いたシンプルなWFA
です。コピーされた構造体のフィールドの変更元の構造体フィールドの変更
どうしてですか? I readこれは、構造体を配列のメンバーとして渡すときに発生する可能性があります。これは、私がやっていない配列です。同様のトピックで見つかった他の質問は、この動作を示していません。重複または関連する質問がある場合、私はそれらを見つけられなかったし、今後それらを見つける方法のヒントに感謝します。
namespace TestingStructs
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
struct SingleLevel
{
public int Level { get; }
public int Property1 { get; }
public decimal Property2 { get; }
public SingleLevel(
int level,
int prop1,
decimal prop2)
{
Property1 = prop1;
Property2 = prop2;
Level = level;
}
}
struct Levels
{
public int NumberOfLevels { get; }
public readonly List<SingleLevel> RightLevels;
public readonly SingleLevel[] RightLevelsArray;
public Levels(int numberofLevels)
{
NumberOfLevels = numberofLevels;
RightLevels = new List<SingleLevel>();
RightLevelsArray = new SingleLevel[numberofLevels + 1];
for (int i = 1; i <= 3; i++)
{
SingleLevel rightToAdd = new SingleLevel(i, i * 100, 10 + i);
RightLevels.Add(rightToAdd);
RightLevelsArray[i - 1] = rightToAdd;
}
}
}
private void button1_Click(object sender, EventArgs e)
{
Levels lastLevels = new Levels(3);
Levels temporaryLevels = lastLevels;
MessageBox.Show("temp");
MessageBox.Show(string.Join(Environment.NewLine, temporaryLevels.RightLevels.Select(right => right.Property2)));
MessageBox.Show(string.Join(Environment.NewLine, temporaryLevels.RightLevelsArray.Select(right => right.Property2)));
MessageBox.Show("last");
MessageBox.Show(string.Join(Environment.NewLine, lastLevels.RightLevels.Select(right => right.Property2)));
MessageBox.Show(string.Join(Environment.NewLine, lastLevels.RightLevelsArray.Select(right => right.Property2)));
SingleLevel rightLevelToAdd = new SingleLevel(1, 50, 9.5m);
temporaryLevels.RightLevels.Insert(0, rightLevelToAdd);
temporaryLevels.RightLevelsArray[0] = rightLevelToAdd;
MessageBox.Show("temp after insert");
MessageBox.Show(string.Join(Environment.NewLine, temporaryLevels.RightLevels.Select(right => right.Property2)));
MessageBox.Show(string.Join(Environment.NewLine, temporaryLevels.RightLevelsArray.Select(right => right.Property2)));
MessageBox.Show("last after insert");
MessageBox.Show(string.Join(Environment.NewLine, lastLevels.RightLevels.Select(right => right.Property2)));
MessageBox.Show(string.Join(Environment.NewLine, lastLevels.RightLevelsArray.Select(right => right.Property2)));
}
}
}
出力:挿入後のtempとlastは、同じ値のProperty2を含みます。
背景:私のコードでは、実行時に変更される場合とされない場合があるオブジェクトインスタンスを使用します。したがって、私はそれをコピーし、コピーを修正し、元のオブジェクトに戻したいと考えています。もしそうでなければ、私はオリジナルを変更して、オリジナルのステージの変更を適用したくないのです。デザインに欠陥があるかもしれませんが、質問は構造の問題に関するものです。これについてのヒントもありますが、私は感謝します。
Ok ..どうすれば変更できますか?自分の目的のためにリストとは異なるコレクションを使用しているとは思わないので、それらをコピーして個別に変更できる必要があります。何か提案がありますか? – pun11
私は私の元の答えを編集し、可能な解決策を追加しました。 –