引用和值类型 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 的内存位置,只是值的副本。任何更改都不会修改原始内存位置中的值。