1

次の動作のC#言語仕様とは何ですか。属性の値は保持されますが、新しいインスタンス(nullまたは新しいオブジェクト)は実際のパラメーターに更新されません。それが指すオブジェクトを変更することを除いて、基本的にはrefとして機能します。

main関数のオブジェクトはそのまま(nullではない)のままですが、文字列属性は「HelloWorld」に変更されています

class Program
{
    class MyClass
    {
        public string str;
    }

    static void MyMethod(MyClass obj)
    {
        obj.str = "Hello World";
        obj = null;
    }

    static void Main(string[] args)
    {
        MyClass o = new MyClass();
        o.str = "Hello";
        Console.WriteLine(o.str);
        MyMethod(o);

        Console.WriteLine(o.str); // prints "Hello World"
    }
}
4

2 に答える 2

4

.NET 言語では、オブジェクト参照は値によって渡されます。

では、これはどういう意味ですか?概念的には、コードはこれと同じですが、ポインターが明示的にされています。

static void MyMethod(MyClass *obj)
{
    obj->str = "Hello World";
    obj = NULL;
}

static void Main(string[] args)
{
    MyClass *o = new MyClass();
    o->str = "Hello";
    Console.WriteLine(o->str);
    MyMethod(o);

    Console.WriteLine(o->str); // prints "Hello World"
}

に渡されるパラメーターは、インスタンスを指すMyMethodポインターの値です。ポインターを逆参照して の値を設定できますが、実際のポインター値を null に設定しても、呼び出し元のメソッドの変数には影響しません。oMyClassstr

これを行うことで、参照ごとに参照を渡すことができます。

次の動作の C# 言語仕様は何ですか。属性の値は保持されますが、新しいインスタンス (null または新しいオブジェクト) は実際のパラメーターに更新されません。それが指しているオブジェクトを変更することを除いて、それは基本的に ref として機能します。

class Program
{
    class MyClass
    {
        public string str;
    }

    static void MyMethod(ref MyClass obj)
    {
        obj.str = "Hello World";
        obj = null;
    }

    static void Main(string[] args)
    {
        MyClass o = new MyClass();
        o.str = "Hello";
        Console.WriteLine(o.str);
        MyMethod(ref o);

        Console.WriteLine(o.str); // throws NullReferenceException, o is now null
    }
}
于 2012-04-06T10:54:51.500 に答える
2

参照によってオブジェクト値を渡しています。これにより、オブジェクトの属性の値を変更することができ、変更は呼び出し元のメソッドで確認できます。ただし、変数がobj参照するものへの変更は、呼び出し元のメソッドには表示されません。

変数参照を全体で変更したい場合は、参照ごとに参照を渡す必要があります。これを行うには、メソッド宣言を次のように変更する必要があります。

static void MyMethod(ref MyClass obj){...}

ref のドキュメントはここにあります

于 2012-04-06T10:54:02.103 に答える