参考和值类型c#

时间:2015-06-29 17:23:43

标签: c# memory-management


我正在学习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

2 个答案:

答案 0 :(得分:2)

问题是您正在更改ChangeInt方法中的int但是未引用复制的参数您可以使用ref关键字或返回方法的值:

static void ChangeInt(ref int x)
{
    x = 500;
}

static int ChangeInt(int x)
{
    return 500;
}

如果使用后面的方法,请记住捕获值

答案 1 :(得分:2)

按值传递类对象类似于将指针传递给非面向对象语言的数据结构,因为实际传递的是对象的内存位置。由于给出了该地址,因此可以修改地址所引用的存储器。

传递标量变量值(如整数)只是传递一个值。被调用的方法不接收int的内存位置,只是值的副本。任何更改都不会修改原始内存位置中的值。