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
}