0

私は今朝、MSDNの「C#クラスと構造体」を読んで、これら2つの概念をよりよく理解しようとしています。

クラスは参照型です。クラスのオブジェクトが作成されると、オブジェクトが割り当てられる変数は、そのメモリへの参照のみを保持します。オブジェクト参照が新しい変数に割り当てられると、新しい変数は元のオブジェクトを参照します。一方の変数で行われた変更は、両方とも同じデータを参照するため、もう一方の変数に反映されます。

構造体は値型です。構造体が作成されると、構造体が割り当てられている変数は、構造体の実際のデータを保持します。構造体が新しい変数に割り当てられると、それがコピーされます。したがって、新しい変数と元の変数には、同じデータの2つの別々のコピーが含まれています。一方のコピーに加えられた変更は、もう一方のコピーには影響しません。」-MSDN

私はOOPの概念を理解して説明しようとしている若い女子高生なので、誰かがこの概念を説明するために数行のサンプルコードを書いていただけませんか?

参考と価値(シナリオ):本の中に、誰もが理解できるとは限らない難しい用語のページがあるので、著者は用語の定義を括弧で囲むことにしました(用語に精通していない人のために) 。これは価値を渡すようなものですか?

代わりに、著者が用語の直後にページ番号の参照を括弧で囲んでいて、用語に精通していない読者が用語の意味を見つけるために参照できる場合、これは参照によって渡されますか?

4

2 に答える 2

3

これを簡単な言葉で表現しようとすると、違いは主にインスタンスの保存方法と使用方法です。

参照型は、その名前が示すように、常に参照を通じてアドレス指定されます。これは、変数がオブジェクト自体ではなく、情報がメモリ内のどこに効果的に格納されているかに関する情報のみを保持することを意味します。ここで、この変数を別の値に割り当てると、インスタンスではなく参照のみがコピーされます。つまり、両方の変数が同じインスタンスを参照するようになります。

一方、値型は、それらが存在する場所(変数など)に直接格納されます。したがって、別の変数に割り当てると、インスタンスがコピーされ、両方が分離されたままになります。

インスタンスaとbがあり、それらにフィールドxがあると仮定します。

a = new MyReferenceType();
a.x = 5;
b = a;
a.x = 10;
// b.x is now also 10, because both a and b reference the same instance

a = new MyValueType();
a.x = 5;
b = a;
a.x = 10;
// b.x is still 5, because both a and b are distinct instances

参照になることで、柔軟性が高まります。参照のサイズは一定ですが、参照するオブジェクトインスタンスのサイズは異なる場合があります。これにより、一般的なオブジェクト指向の原則、特にポリモーフィズムを実装できます。また、値型とは対照的に、参照は「何も」を参照できません。その場合、参照はnullです。

注:これは主に.NETFrameworkの実装の詳細です。値型(構造体)には用途があり、値型と同じセマンティクスを共有するプリミティブ型の概念にうまく適合します。ただし、サポートするOOPの概念は厳しく制限されています。

于 2012-08-05T17:42:12.437 に答える
2

クラスFooと構造体バーがあるとしましょう

class Foo
{
  public string Name;
}

struct Bar
{
  public string Name;
}

Foo f = new Foo();
Foo g = f;
f.Name = "Larry";
//Since g and f point to the same object both have a name of "Larry"
//changes to one, change all instances that point (refer) to the same object (memory location)
Bar b = new Bar();
Bar c = b;
b.Name = "Paul";
//Since Bar is a value type, when we set the name of b, c is not altered because 
//b and c do not refer to the same object, they are independent variables
//each allocated their own memory
//and can vary separately after the initial assignment. 
于 2012-08-05T17:29:55.910 に答える