我正在学习C#内存管理,对我来说很奇怪
我为Student对象动态分配内存并在方法中更改它 - 它正在被更改
我为int对象动态分配内存并在方法中更改它 - 它没有被更改。
为什么?
class Student
{
public int id;
public string name;
}
class Program
{
static void Main(string[] args)
{
Student s1 = new Student();
s1.id = 5;
s1.name = "myname";
ChangeStud(s1);
Console.WriteLine(s1.id);
Console.WriteLine(s1.name);
int x = new int();
x = 2;
ChangeInt(x);
Console.WriteLine(x);
}
static void ChangeStud(Student s)
{
s.id = 500;
s.name = "changedname";
}
static void ChangeInt(int x)
{
x = 500;
}
}
输出结果为:
500
changedname
2
答案 0 :(得分:2)
问题是您正在更改ChangeInt方法中的int但是未引用复制的参数您可以使用ref关键字或返回方法的值:
static void ChangeInt(ref int x)
{
x = 500;
}
或
static int ChangeInt(int x)
{
return 500;
}
如果使用后面的方法,请记住捕获值
答案 1 :(得分:2)
按值传递类对象类似于将指针传递给非面向对象语言的数据结构,因为实际传递的是对象的内存位置。由于给出了该地址,因此可以修改地址所引用的存储器。
传递标量变量值(如整数)只是传递一个值。被调用的方法不接收int的内存位置,只是值的副本。任何更改都不会修改原始内存位置中的值。