我有一个班级
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 ??
答案 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)。
但是没有多大意义,将类对象传递给同一个类。
祝你好运!