-1

私はオブジェクトクラスを持っていますTimeDuration。配列 Span から取得したオブジェクトの値を変更しようとすると、配列内の値も変更されます。親オブジェクトの値を変更しないオブジェクトのコピーを取得するにはどうすればよいですか? このコピーを別の関数に渡す必要があり、そこでこのオブジェクトを変更する必要があります

 public void test()
        {
            List<TimeDuration> Span = new List<TimeDuration>();
            TimeDuration ob = new TimeDuration();
            ob.FromTime = DateTime.Now;
            ob.ToTime = DateTime.Now.AddDays(1);
            Span.Add(ob);

           //Trying to assign value here!
           TimeDuration ob2= Span[1];
           ob2.FromTime = DateTime.Now.AddDays(3);

        }

public class TimeDuration
    {
        public DateTime FromTime { get; set; }
        public DateTime ToTime { get; set; }
    }
4

5 に答える 5

6

まず、現在のコードがなぜそのように動作するのかを理解する必要があります。詳細については、参照型と値型に関する私の記事を参照してください。

親オブジェクトの値を変更しないオブジェクトのコピーを取得するにはどうすればよいですか?

2つの簡単なオプション:

  • 既存のオブジェクトのコピーを作成する、ある種のクローン作成メソッドを作成します。これを明示的に行う必要がありますがobject.MemberwiseClone、場合によってはショートカットとして使用できます。多くの場合、それは非常に単純ですが、継承によって困難になります。
  • たとえば、新しいバージョンを返すTimeDurationメソッドを使用して、クラスを不変にします。WithToTime

    public TimeDuration WithFromTime(DateTime newFromTime)
    {
        return new TimeDuration(newFromTime, ToTime);
    }
    

    プロパティを読み取り専用にし、両方の値をとるコンストラクターを提供します(これにより、それらを検証することもできます)。この時点で構造体にすることを検討することもできます。

于 2013-03-21T15:52:49.947 に答える
1

クラスを構造体に変えることを検討してください。もちろん、クラスを不変にすることもできます。

public struct TimeDuration
{
    public DateTime FromTime { get; private set; }
    public DateTime ToTime { get; private set; }

    public TimeDuration(DateTime fromTime, DateTime toTime) : this()
    {
        FromTime = fromTime;
        ToTime = toTime;
    }

    public TimeDuration SetFromTime(DateTime fromTime)
    {
        var copy = this;
        copy.FromTime = fromTime;
        return copy;
    }

    public TimeDuration SetToTime(DateTime toTime)
    {
        var copy = this;
        copy.ToTime = toTime;
        return copy;
    }
}
于 2013-03-21T15:53:59.563 に答える
1

TimeDurationa のstruct代わりに aを作成してくださいclass: 値の型は値によって渡されるため、一種の「コピー」動作が得られます。

于 2013-03-21T15:54:40.427 に答える
0

常にTimeDurationこの方法を使用している場合は、をからに変更することを検討してclassくださいstruct。を複製するには、 ICloneableclassを実装し、メソッドを呼び出す必要があります。Clone

于 2013-03-21T15:53:23.647 に答える
0

クラスは参照型です。TimeDuration配列内の値は、オブジェクトの新しいインスタンスではなく、オブジェクトのメモリ位置へのポインターです。したがって、値を変更すると、配列にも影響します。

TimeDuration の新しいオブジェクトを作成し、それを渡す必要があります。

于 2013-03-21T15:52:39.273 に答える