代码之家  ›  专栏  ›  技术社区  ›  Vijjendra

C#参考类型行为

  •  1
  • Vijjendra  · 技术社区  · 14 年前

    我对引用类型有些混淆,下面是测试示例 请告诉我它将如何工作

    class TestClass
    {
        public int i = 100;
    }
    
    class MyTestClass
    {
        public void Method()
        {
            int i = 200;
            var testClass = new TestClass();
            testClass.i = 300;
            Another(testClass, i);
            Console.WriteLine("Method 1:" + testClass.i);
            Console.WriteLine("Method 2:" + i);
        }
        public void Another(TestClass testClass, int i)
        {
            i = 400;
            testClass.i = 500;
            testClass = new TestClass();
            //If we have set here again testClass.i = 600; what should be out putin this case
            Console.WriteLine("Another 1:" + testClass.i);
            Console.WriteLine("Another 2:" + i);
        }
        public static void Main()
        {
            MyTestClass test = new MyTestClass();
            test.Method();
            Console.ReadLine();
        }
    }
    

    * 编辑 * ** 它的输出应该是什么,以及在执行期间TestClass()的对象将被创建多少次。

    3 回复  |  直到 14 年前
        1
  •  4
  •   Steve Ellinger    14 年前

    在C语言中,任何结构都是值类型,任何类都是引用类型。将值类型作为参数传递给另一个方法时,该方法无法更改原始值(除非使用ref关键字传递值类型)。当您将引用类型作为参数传递给另一个方法时,该方法对对象所做的任何更改都将在从该方法返回时反映在对象中。输出为:

    方法1:500

    另一个方法中的i变量不能更改方法中的变量i的值,因为i是值类型;因此方法(200)中i的值在调用另一个方法时保持不变。

    testClass.i = 500;
    

    更改方法所看到的值,因此方法的输出为1:500。在以下行中分配TestClass的新实例时:

        2
  •  5
  •   Mark Byers    14 年前

    输出应为:

    Another 1:100
    Another 2:400
    Method 1:500
    Method 2:200
    

    C#按值传递,除非 ref 使用关键字。对于值类型,复制值。对于引用类型 已复制。

    i 与…完全无关 testClass.i 是int-a值类型。当你调用这个方法 Another 具有 作为参数,它通过值传递,因此修改 另一个 在里面 Method -一直等于200。

    testClass 也是通过值传递的,但在这种情况下,因为它是引用类型,所以会传递引用的值,因此会传递变量 在里面 另一个 最初引用与中的变量相同的对象 方法 测试类.i 在里面 另一个 它会更改您在中创建的对象 所以它的成员被设置为300。

    然后这一行创建一个新的不相关的对象:

    testClass = new TestClass();
    

    有时更容易看到图表中发生了什么,其中最上面一行显示变量,最下面一行显示它们所引用的对象:

    Before assignment:                      After assignment:
    
    +-------------+    +-------------+      +-------------+    +-------------+
    | Method      |    | Another     |      | Method      |    | Another     |
    | testClass   |    | testClass   |      | testClass   |    | testClass   |
    +-------------+    +-------------+      +-------------+    +-------------+
           |                  |                    |                  |
           |                  |                    |                  |
           v                  |                    v                  v
     +-----------+            |              +-----------+      +-----------+
     | TestClass |<-----------+              | TestClass |      | TestClass |
     | i = 300   |                           | i = 300   |      | i = 100   |
     +-----------+                           +-----------+      +-----------+
    

    打印时 是构造函数中设置的默认值,即100。指定不会修改原始对象。您只是重新分配变量以指向其他对象。

        3
  •  0
  •   Timwi    14 年前

    基本上,

        testClass.i = 500;
    

    更改对象内部的值。您正在传递这个对象,因此所有引用该对象的对象都将看到这个更改。但是

        i = 400;
        testClass = new TestClass();