为什么类成员变量的值会发生变化?

时间:2012-03-01 16:31:47

标签: c# class

我有一个班级

    class ABC
    {
          public int a = 2;
          public void valueA(ABC objabc)
          {
               a = 5;
               objabc = new ABC();
               objabc.a = 11;
           }
    }

然后我写main作为

    static void Main(string[] args)
    {
        ABC objabc = new ABC();
        objabc.a = 15;
        objabc.valueA(objabc);
        Console.WriteLine(objabc.a);
     }

当我执行此操作时,我在输出中找到了5个。所以我的问题是为什么a = 5 ??为什么它不是2,11或15 ??

4 个答案:

答案 0 :(得分:5)

您正在对象valueA上调用objabc方法。在方法内部,a的成员this设置为5.您可以看到代码等同于:

class ABC
{
      public int a = 2;
      public void valueA(ABC objabc)
      {
           this.a = 5;
           objabc = new ABC();
           objabc.a = 11;
       }
}

因此,您要将调用该方法的对象的成员设置为5.此对象为objabc main,因此最终值为5. 事实上您为它分配一个新的对象引用之后没有区别,因为你没有通过引用传递它,所以在外面看不到变化。

如果您的代码是这样的话,结果会有所不同(即11):

class ABC
{
      public int a = 2;
      public void valueA(ref ABC objabc)
      {
           a = 5;
           objabc = new ABC();
           objabc.a = 11;
       }
}

在这种情况下,参数将通过引用传递,因此分配objabc = new ABC();对于调用代码是可见的(即在Main中)。

答案 1 :(得分:0)

首先,您创建一个ABC的实例。这会将a的值设置为2.然后直接使用字段将a的值设置为15。然后调用一个方法,将同一个字段设置为5,然后创建另一个实例,在其中将a版本的值设置为11.另一个实例不影响第一个实例。

答案 2 :(得分:0)

static void Main(string[] args)
{
    ABC objabc = new ABC(); // Value of a is 2
    objabc.a = 15; // Set it to 15
    objabc.valueA(objabc); // This resets it to 5, then creates a new object and sets it to 11
    Console.WriteLine(objabc.a); // You're still calling a on the old object, not the new one
 }

答案 3 :(得分:0)

类是引用类型。 当您作为参数“ABC objabc”传递时,您的方法会创建一个新的objabc。退出方法时它会消失,因为您没有返回任何内容。 所以你可以: - 返回您的对象,然后打印此对象,由您的方法返回或; 公共ABC值A(ABC objabc); - 在你的objabc之前传递关键字“ref”,以保持之前创建的类的引用(IE:public void valueA(ref ABC objabc)。

但是没有多大意义,将类对象传递给同一个类。

祝你好运!

http://msdn.microsoft.com/en-us/library/ms173109.aspx