私はC#に少し慣れていないので、デフォルトでコピーとして渡されるクラス(一般的に使用される)のリストがあるかどうか疑問に思っていました。どうすればそれらを識別できますか?
基本的な基本オブジェクトタイプ(int、uint、float、strings、...)がコピーによって渡されることを知っています。
私はC#に少し慣れていないので、デフォルトでコピーとして渡されるクラス(一般的に使用される)のリストがあるかどうか疑問に思っていました。どうすればそれらを識別できますか?
基本的な基本オブジェクトタイプ(int、uint、float、strings、...)がコピーによって渡されることを知っています。
C#/ .Netでは、オブジェクトは値型または参照型として分類できます[1]。値型は、型宣言を使用してC#から派生しSystem.ValueType
、C#で定義される任意の型です。struct
これらはコピー/値によって渡されます。
参照型は、派生せずSystem.ValueType
、C#でclass
キーワードを使用して定義される型です。参照型のインスタンスへの識別子は、参照と呼ばれます(ポインターと同様)。これらもデフォルトで値によって渡されますが、オブジェクト全体ではなく、参照のみが渡されます。
あなたの質問は、string
インスタンスがコピーによって渡されることにも言及しました。 String
in .Netは参照型(から直接派生System.Object
)であるため、完全なコピーでは渡されません。
[1]ポインターはここで独自のクラスに値するかもしれませんが、私はこの議論のためにそれらを無視しています。
デフォルトでは、すべてのタイプが値で渡されます。値型(struct
)と参照型(class
)の違いは、値型の場合は値のコピーがメソッドに渡されるのに対し、参照型の場合は参照のみが渡されることです。
詳細については、MSDNを参照してください。
また、値/参照型の概念と、値または参照によるパラメーターの受け渡しの概念を混同しないでください。詳細については、JonSkeetによるこの記事を参照してください。
一般に、
ネイティブ型(、、 ...)とsを含む値型は、int
( float
あなたがstruct
言うように)「コピーによって」渡されますが、
esを含む参照型class
は、完全なオブジェクトではなく、参照のみがコピーされます。
ただし、その文字列は「コピーによって」渡されないことに注意してください。これは参照型ですが、不変であるため、値型と同様に動作します。
キーワードは両方の場合に役立つ可能性があることに注意してくださいref
。値型の場合、値がコピーバックされることを意味します。参照型の場合、参照を変更できることを意味します(つまり、オブジェクトのプロパティを変更するだけでなく、変数を新しいオブジェクトに割り当てることができます)。
構造体オブジェクトには参照型を含めることができることにも注意してください。
struct Currency
{
int Amount {get;set;} // is referenced by value (copy)
string Code {get;set;} // is referenced by reference
}
このような構造体を使用する場合:
var obj1 = new Currency{Amount = 1, Code = "USD"};
var obj2 = obj1;
それで
object.ReferenceEquals(obj1.Code, obj2.Code); // false - string is reference type, but used inside value type
Currencyをクラスとして宣言した場合、Codeへの参照は同じです。