9

変数を別の変数に代入することは可能ですか?2 番目の変数を変更すると、最初の変数にウォーターフォールが適用されますか?

このような。

int a = 0;
int b = a;
b = 1;

これで、b と a の両方が = 1 になります。

私がこれを尋ねる理由は、私が追跡している 4 つのオブジェクトがあり、ユーザーが使用している 4 つのオブジェクトのいずれかに等しい currentObject と呼ばれる 5 番目のオブジェクトを使用して、それぞれを追跡しているためです。ただし、 currentObject に変更を加えて、元の変数にウォーターフォールさせたいだけです。

ありがとう

4

6 に答える 6

19

オブジェクト参照、および変数を区別する必要があります。2 つの異なる変数 (メソッド内で ref/out を介してエイリアス化されていないなど) がある場合、それらは独立しています。

ただし、2 つの変数が同じオブジェクトを参照する場合(つまり、それらの型がクラスであり、それらのが等しい参照である場合)、そのオブジェクトへの変更はいずれかの変数を介して表示されます。これがあなたが達成したいことのようです。例えば:

public class SomeMutableClass
{
    public string Name { get; set; }
}

// Two independent variables which have the same value
SomeMutableClass x1 = new SomeMutableClass();
SomeMutableClass x2 = x1;

// This doesn't change the value of x1; it changes the
// Name property of the object that x1's value refers to
x1.Name = "Fred";
// The change is visible *via* x2's value.
Console.WriteLine(x2.Name); // Fred

参照型とオブジェクトの仕組みに完全に慣れていない場合は、それらに関する私の記事を読んでください。

編集: 私がよく使う類推の 1 つは家です。2 枚の紙 (変数) があるとします。同じ家の住所が両方の紙に書かれています (それが各変数の値、参照です)。家は1つしかありません。誰かが最初の紙を使って家に着き、次にドアを赤く塗った場合、彼らは紙について何も変えていません - 彼らはについて何かを変えています. 次に、誰かが2枚目の紙を使って家にたどり着くと、正面玄関も赤いことがわかります。家は一軒しかないが、住所が書かれた紙がたくさんある。

于 2012-05-15T15:38:22.847 に答える
4

まず第一に、以前のコードで何をしているのかを理解する必要があります

  1. メモリ内に「a」という名前の 4 バイト サイズの変数を作成し、その後、値 0 を指定します。
  2. メモリ内に「b」という名前の 4 バイト サイズの変数を作成し、その後 (a) の値の値を与えます [現在は 0]
  3. 変数「b」の値を 1 に変更します

しかし、これはあなたが望むものではありません、あなたが望むのはもっとこのようなものです

  1. メモリ内に「a」という名前の 4 バイト サイズの変数を作成し、その後、値 0 を指定します。
  2. メモリ内に「b」という名前の 4 バイト サイズの変数を作成し、その後、変数「b」のアドレスを変更して、これらの 4 バイトを参照しないようにしますが、代わりに (a) の 4 バイトを参照します。

あなたが求めているのはBad + Impossibleの両方です

  • 悪い: まったく使用されない 4 バイトの空きスペースを作成し、それらを完全に無視しました。
  • 不可能:値型のアドレスを変更できないため(したがって、「参照」型ではなく「値」型と呼ばれます)

しかし、あなたが「求めるべき」はこれです

  1. メモリ内に「a」という名前の 4 バイト サイズの変数を作成し、その後、値 0 を指定します。
  2. 変数 a を参照するアドレスを作成します
  3. このアドレスから a の値を変更します

そして、このアプローチは実際には完全に問題なく、 Pointers を使用ます。 Pointers は単にメモリ内のアドレスです。

注 : ポインタを使用するには、[プロジェクト] > [ビルド] で安全でないコードを許可する必要があります

コードでは、これを行う方法は次のとおりです。

int a = 5;
unsafe //use unsafe around the areas where pointers exist
{
    int* b = &a; //create an address named b that refers to a
    *b = 1; //change the value of the variable that exists at the address b to 1

    //now a = 1
}
于 2016-12-13T04:46:42.023 に答える
4

構造体/値型の場合 ------- NO

int、boolean、double など。

参照型あり --------はい

クラス、オブジェクトなど。

于 2012-05-15T15:38:14.043 に答える
0

あなたが探しているのは、オブザーバーとして一般的に知られているデザインパターンです。オブジェクト B はオブジェクト A (またはこれが必要なため 4 つのオブジェクト) を監視し、A が変更されると B に通知され、それに応じてその状態が更新されます。

C# の場合は、イベントを使用します。たとえば、A でイベント ValueChanged を定義します。B はこのイベントをリッスンし、その値を更新します。

public delegate void ChangedEventHandler(object sender, EventArgs e);

Class A
{
   public event ChangedEventHandler Changed;
   int val = 0;
   int Val
   {
      get { return val;}
      set { 
          if ( val != value ) val = value
          {
              val = value;
              if (Changed != null) Changed(this, new EventArgs());
          }

   }
}


class B
{
    A obj1, obj2, obj3, obj4;
    int Val {get;set;}
    A CurrentlyWatched {get;set;}

    public B()
    {
       obj1 = new A();
       obj1.Changed += new ChangedEventHandler(ElementChanged);
       obj2 = new A(); 
       ...
    }

    private void ElementChanged(object sender, EventArgs e) 
      {
         this.CurrentlyWatched = sender as A;
         this.Val = CurrentlyWatched.Val;
      }
}
于 2012-05-15T15:52:14.180 に答える
-1

これで、get 関数と set 関数のコードを変更して、ほとんど何でも行うことができます。ただし、これを関数内で宣言することはできません。

    int a;
    int b
    {
        get
        {
            return a;
        }
        set
        {
            a = value;
        }
    }
于 2012-05-15T15:42:28.617 に答える