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

C# 为什么类成员变量的值会发生变化?,c#,class,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(stri

我有一节课

    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?

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

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

class ABC
{
      public int a = 2;
      public void valueA(ABC objabc)
      {
           this.a = 5;
           objabc = new ABC();
           objabc.a = 11;
       }
}
因此,您正在将调用该方法的对象的成员设置为5。该对象是来自
main
objabc
,因此最终值为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
)。

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

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

祝你好运


这是一个奇怪的问题,这是家庭作业吗?我不明白的是,为什么您要在valueA方法中创建一个未使用的ABC对象。Thnx tudor…您的第二个示例帮助我找出第一个和第二个的区别..Thnx。。
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
 }