引用和值类型 c#
reference and value types c#
我正在学习 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
已更改名称
2
问题是您正在更改 ChangeInt 方法中的 int,但复制的参数未被引用 您可以使用 ref 关键字或 return 方法的值:
static void ChangeInt(ref int x)
{
x = 500;
}
或
static int ChangeInt(int x)
{
return 500;
}
如果用后面的方法记得抓取值
按值传递class对象类似于在非面向对象语言中传递指向数据结构的指针,因为实际传递的是对象的内存位置。由于给出了该地址,因此可以修改该地址所指的内存。
传递标量变量值(例如整数)只是传递一个值。被调用的方法不接收 int 的内存位置,只是值的副本。任何更改都不会修改原始内存位置中的值。
我正在学习 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
已更改名称
2
问题是您正在更改 ChangeInt 方法中的 int,但复制的参数未被引用 您可以使用 ref 关键字或 return 方法的值:
static void ChangeInt(ref int x)
{
x = 500;
}
或
static int ChangeInt(int x)
{
return 500;
}
如果用后面的方法记得抓取值
按值传递class对象类似于在非面向对象语言中传递指向数据结构的指针,因为实际传递的是对象的内存位置。由于给出了该地址,因此可以修改该地址所指的内存。
传递标量变量值(例如整数)只是传递一个值。被调用的方法不接收 int 的内存位置,只是值的副本。任何更改都不会修改原始内存位置中的值。