我有一堂课

    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?所以我的问题是为什么a = 5 ??为什么不是2、11或15?

最佳答案

您正在对象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中)。

10-04 14:42