2012-03-01 94 views
3

我有一个类为什么类成员变量的值改变了?

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

然后我写的

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

当我执行此我发现output.so我的问题5个主要的是,为什么= 5?为什么它不2,11或15?

+3

这是一个奇怪的问题,是这个家庭作业? – 2012-03-01 16:34:11

+0

什么我不明白的是为什么你正在创建中值a方法将未使用的ABC对象开始。 – jzworkman 2012-03-01 16:37:50

+0

为什么倒票? – 2012-03-01 16:40:08

回答

5

您对对象objabc调用valueA方法。在方法的thisa设置为5的成员,您可以看到代码等同于:

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

所以要设置在其上调用该方法,以5这个对象是对象的成员objabc from 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)。

+0

thnx tudor ....你的第二个例子帮助我找出第一个和第二个one..thnx之间的区别.. – Usman 2012-03-01 16:49:58

0

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

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 
} 
0

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

但它没有多大意义,传递类对象同一类。

祝你好运!

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

相关问题