2

私の知る限り、Class参照Object型です。

値を変更する方法は以下のとおりです

public void ChangeValue(MyClass classobj)
{
    classobj.Number = classobj.Number*2;
}

メソッドを呼び出して値を2倍にします

var myClass=new MyClass();
int myNumber = 10;
myClass.Number = myNumber;
ChangeValue(myClass);

そしてそれはあなたがあなたのクラスのオブジェクトを作るときとあなたがそれを解釈することができるのでそれが良い20を返すでしょうそしてそれはメソッドへの参照を渡しそしてそれは参照値を更新します。

しかし、私の質問は、なぜそれがオブジェクト型では起こらないのかということです。言い換えれば、私がオブジェクトを作成し、それに値を割り当てるときに、以下のようになります。

 object myObject = new object();
 string sometext  = "Some object value";
 myObject = sometext;
 ChangeValue(myObject)

メソッドの実行後に値が変更されることはありません

public void ChangeValue(object objectValue)
{
    objectValue = null;
}

メソッドのパラメーターが値型であることは知っていますが、2つの参照型で動作が異なることを理解できません。

4

3 に答える 3

2

ここでは実際に2つの異なることを行っています。Objectそして、あなたMyClassは確かに両方の参照型です。つまり、実際のオブジェクトへの参照をChangeValueメソッドに渡します。ただし、メソッド内に表示される参照は、呼び出し元が保持している参照のコピーです。それらは同じオブジェクトを指しているため、メソッドでオブジェクトを操作すると、メソッドの呼び出し元は変更を確認できますが、メソッド内の実際の参照への変更は、メソッド自体にのみ影響します。

要約すると、オブジェクトは参照によって渡されますが、それらの参照はによって渡されます。

あなたの方法で

public void ChangeValue(object objectValue)
{
    objectValue = null;
}

実際に行っているのは参照の再割り当てであり、その参照は呼び出し元が持っているobjectValueと呼ばれる参照のコピーです。myObjectメソッドにはコピーしかないため、呼び出し元の参照にはまったく影響しません。

これを機能させる方法があります。参照によって参照を渡す必要があります。それはいつも私に頭痛の種を与えます、しかしそれはrefキーワードが何のためであるかです。

public void ChangeValue(ref object objectValue)
{
    objectValue = null; // this is the SAME reference as the caller has, so the caller will see this change
}

ただし、そのように呼び出す必要もあります。

ChangeValue(ref myObject);

コールサイトで、別のオブジェクトを指して戻ってくる可能性があることが明らかになるようにします。参照が予期せずに別のオブジェクトを指している場合、古い値に依存するものがまだあり、ひどい混乱した混乱に終わる可能性があることを知っておくことが重要です。

于 2013-02-22T11:41:18.540 に答える
1

objectValueby値にを渡すChangeValue(object objectValue)と、この値は参照になります。次に、この値を変更しますが、の値は変更しませんmyObject

ChangeValue(ref object objectValue)参照によって参照の値を実際に渡すように、それを渡す必要があります。

于 2013-02-22T11:38:48.403 に答える
0

それは別の行動ではありません、あなたは別のことをしています

これはあなたのobject例とまったく同じように機能します:

    public void ChangeValue(MyClass classobj)
    {
        classobj = null;
    }

そして、これは最初の例として機能します(MyClassインスタンスを渡すと仮定します):

   public void ChangeValue(object objectValue)
    {
        ((MyClass)objectValue).Number *= 2;
    }

ここで実際に発生するのは、パラメーター(パラメーターのプロパティまたはフィールドではない)を割り当てる場合、そのパラメーターの値のみを変更することです。呼び出しコードの元の値と変数はそのまま残ります。

ここでも同じことが起こります。

MyClass a = new MyClass();
MyClass b = a;
a = null;
// b still contains the value created in the first line

簡単に言えば、参照変数は実際の値のポインタ(メモリアドレス)を保持します。変数の値を変更することで、別のオブジェクトまたはnullを指すようになります。ただし、a.field=2これを行う場合は、オブジェクトがそのメンバー値aを参照して変更していることを意味します。field

于 2013-02-22T11:38:24.963 に答える