struct
私は頻繁にs が不変であるべきだと読んでいます - それらは定義上そうではありませんか?
int
不変だと思いますか?
int i = 0;
i = i + 123;
大丈夫そうです - 新しい を取得し、int
に割り当て直しi
ます。これはどうですか?
i++;
わかりました、ショートカットと考えることができます。
i = i + 1;
はどうstruct
Point
ですか?
Point p = new Point(1, 2);
p.Offset(3, 4);
これは本当にポイントを変更し(1, 2)
ますか? Point.Offset()
新しいポイントを返すことで、次のショートカットと考えるべきではないでしょうか。
p = p.Offset(3, 4);
この考えの背景はこれです - アイデンティティのない値の型はどのようにして変更可能になるのでしょうか? 変更されたかどうかを判断するには、少なくとも 2 回確認する必要があります。しかし、アイデンティティなしでどうやってこれを行うことができますか?
ref
パラメータとボクシングを考慮して、これについての推論を複雑にしたくありません。p = p.Offset(3, 4);
が不変性を表現するよりもはるかに優れていることも認識してp.Offset(3, 4);
います。しかし、疑問が残ります - 定義上、値型は不変ではないのでしょうか?
アップデート
変数またはフィールドの可変性と、変数の値の可変性という、少なくとも 2 つの概念が関係していると思います。
public class Foo
{
private Point point;
private readonly Point readOnlyPoint;
public Foo()
{
this.point = new Point(1, 2);
this.readOnlyPoint = new Point(1, 2);
}
public void Bar()
{
this.point = new Point(1, 2);
this.readOnlyPoint = new Point(1, 2); // Does not compile.
this.point.Offset(3, 4); // Is now (4, 6).
this.readOnlyPoint.Offset(3, 4); // Is still (1, 2).
}
}
この例では、可変フィールドと不変フィールドを使用する必要があります。値型フィールドには値全体が含まれるため、不変フィールドに格納される値型も不変である必要があります。私はまだ結果に非常に驚いています.readonlyフィールドが変更されないままになるとは思っていませんでした.
変数 (定数を除く) は常に変更可能であるため、値型の変更可能性に対する制限はありません。
答えはそれほど単純ではないようですので、質問を言い換えます。
以下を考える。
public struct Foo
{
public void DoStuff(whatEverArgumentsYouLike)
{
// Do what ever you like to do.
}
// Put in everything you like - fields, constants, methods, properties ...
}
の完全なバージョンFoo
と使用例 (ref
パラメーターとボックス化が含まれる場合があります) を提供していただけますか?
foo.DoStuff(whatEverArgumentsYouLike);
と
foo = foo.DoStuff(whatEverArgumentsYouLike);