|
■No97033 (魔界の仮面弁士 さん) に返信
> 2021/03/17(Wed) 17:53:55 編集(投稿者)
>
>無数とは言いますが、変更したいのは引数で指定されたメンバーだけなのですよね?
実際には引数も一つだけではありません。
>何のために this を書き換えたいと思っているのか、まず先に目的を教えてもらえないでしょうか。
>メンバーの一部を書き換える事だけが目的なのか、
>そうではなく、this が指し示す参照先を別インスタンスにしたいのか、
>それとも、もっと何か特殊な理由があるのか…。
目的としては引数で渡った値で自身のメンバーを書き換える(コピーする)ことです。
> 言語仕様的にそれは叶わないわけですが、
> もし仮に this が readonly で無かったとしたら、
>
> var c1 = new Test(100);
> var c2 = c1;
> c1.Method(50);
> Console.WriteLine($"{ReferenceEquals(c1, c2)}, {c1.A}, {c2.A}");
>
> とした場合の動作は、どうなって欲しいのでしょうか。
>
> 案1) True, 50, 50
> 案2) False, 50, 100
> 案3) False, 50, 50
>
>
> 案1 が目的なら、this.A を書き換える形で代用してみてください。
>
> 案2 が目的なら、c2 への代入を参照コピーから複製コピーに変更するため、
> ICloneable.Clone を実装して呼び出すか、または、Method の戻り値として
> 新規インスタンスを得られるようにすることで代用します。
> あるいは record 化して with 式で複製するのも良いかもしれません。
>
> 案3 となると、案2 と同様に別インスタンスを生成しつつ、さらに
> 値の変更通知をコールバックさせるような仕組みを設ける必要がありそうです。
先ほど申し上げたように書き換えを行いたいですので案1になってほしいです。
|