5

テストのために理解しなければならない方法で何が起こっているのかを理解するのに苦労しています。得られた結果が得られている理由を理解するのに苦労しています。 「メソッドは機能します。大歓迎です

class Program {
  static void Main(string[] args)
  {
    A b = new A(); b.y = b.x;
    b.f(b.y); b.g();
    Console.WriteLine(b.x[0] + " " + b.x[1]); // Prints 1 7
    Console.WriteLine(b.y[0] + " " + (b.x[1] + b.y[1])); // 1 14
  }
}

public class A {
  public int[] x = {1, 2};
  public int[] y;
  public void f(int[] z)
  {
      z[1] += 5;
  }

  public void g()
  {
      A a = new A ();
      a.x[0]++;
      a.x[1]--;
  }
}

私が理解したことを説明しましょう。配列として作成され、bx の値を取得します。bf を呼び出すと、[1, 2] であるメソッドが渡されます。ここで行き詰まります。 、z は by 配列のように見えるため、値として [1, 2] を持ちます。メソッドが位置 1 (2) の要素に 5 を追加すると、その結果として [1, 7] が得られます。メソッドが終了し、私のプログラムはメインに戻ります。どういうわけか、AND bx BOTH are now [1, 7], どうやってそれが起こったのですか?, メソッドは渡されたものなので、によってのみ変更されていると思いました. また、「a」値はメソッドが終了すると「死ぬ」ローカル変数であるため、g 関数は何も追加しません。誰かが私を助けてくれることを願っています、私はこのテストに合格しなければなりません!. ありがとう ;]

4

3 に答える 3

2

どうぞ:

  • という名前の新しい変数bは、 の型で初期化されますA
  • b作成されると、 の値が に設定さb.x{1, 2}ます。
  • b.yは次に に割り当てられb.xますが、これらは配列であるため、同じデータを参照しています。
  • b.fが呼び出され、それにb.y渡されました (思い出してください、b.yb.xは現在同じデータを参照しています)。基本的に、z は関数中も同じデータを指しfます。
  • b.f共有データのインデックス 1 の値である 2 に 5 を加算します。つまり、2 + 5 = 7 です。
  • 最初はConsole.WriteLineまだb.x[0]1 であると表示されます。次に、b.x[1]現在 7 であると表示されます (上記のように)。
  • 2 番目Console.WriteLineの出力b.y[0]は、まだ 1 です (同じデータを共有しているため)。次に、b.x[1]+を出力しb.y[1]ます。どちらも同じデータを共有しています。インデックス 1 のデータは 7 です。7 + 7 = 14 です。

g変数がローカルであり、何もしないという点で、メソッドについては正しいです。

それが役立つことを願っています。

于 2012-11-22T02:21:54.057 に答える
1

プログラミング言語で「アイデンティティ」と呼ばれるものについて混乱しているだけです。単純化した観点として、プログラミング言語には、純粋な値と同一性を持つ値の 2 つのカテゴリの値があります。

純粋な値にはいくつかの異なる意味がありますが、基本的には期待どおりの動作を示します。各サブプログラムは、X が与えられた他のすべてのサブプログラムから分離された配列 X の独自の「コピー」を取得します。

ID を持つ値は、上記のコピー動作には従いません。インスタンス X は、X が渡されるすべてのサブプログラム間で共有されます。つまり、すべてのサブプログラムは、他のすべてのサブプログラムによって行われた変更を認識します。

一般的に言えば、.NET/C# ドキュメントでは、ID を持つ値は参照型と呼ばれます。.NET の値の型は、コピー セマンティクスを持つ一種の「純粋な値」です。ただし、値型には ID を持つ値を含めることができ、参照型は意図的に純度を守ることができるため、必ずしもそれほど単純ではありません。

于 2012-11-22T02:35:51.977 に答える
1
b.y = b.x;

xこのコード行は、変数に保持されている参照を変数にコピーするだけyです。したがって、両方の変数が 1 つの同じ配列を参照します。したがって、1 つの配列とそれを参照する 2 つの変数しかありません。

public void g(){...}

このメソッドは新しい要素を作成し、何かを行いますが、どこにも保存しないため、メソッドが戻った後は失われます (参照はなく、ガベージ コレクションの準備ができています)。

ここに画像の説明を入力

値と参照を読んでみてください

于 2012-11-22T02:17:38.987 に答える