在方法中更改 class 属性 值

Change class property value in method

我有以下代码

public class Myclass
{
    public int someProp{ get; set; };
}
public class Program
{
    public static void Main(string[] args)
    {
        Myclass m = new Myclass();
        Console.WriteLine(m.someProp);
        ChangeValue(m);
        Console.WriteLine(m.someProp);
        SetToNull(m);
        Console.WriteLine(m.someProp);
        Console.ReadKey();
    }
    static void ChangeValue(Myclass m)
    {
        m.someProp = 10;
    }
    static void SetToNull(Myclass m)
    {
        m = null;
    }
}

结果是0 10 10
我想知道为什么在我将 class 设置为 null 后它显示 10.
传递给方法的 m 是对象的副本还是只是引用。

传递的m只是一个参考。

当您设置对象的 属性 时,您正在更改引用对象的 属性。

当您将 m 本身设置为 null 时,您正在更改 m 引用,这就是为什么您在 Main 中的原始引用仍然指向原始对象.

首先我要注意你问的是字段而不是属性, 属性是这样配置的:

public class Myclass
{
    public int someProp{ get; set; }
}

关于您的问题 你是对的,当你将一个实例传递给方法时,你正在将一个 "pointer" 传递给这个实例,你不能用这种方式替换实例本身,你可以只改变它 properties/fields。 为了 replace/change 实例本身,您需要使用 ref 关键字传递引用。

固定代码为:

public class Myclass
{
    public int someProp;
}
public class Program
{
    public static void Main(string[] args)
    {
        Myclass m = new Myclass();
        Console.WriteLine(m.someProp);
        ChangeValue(m);
        Console.WriteLine(m.someProp);
        SetToNull(ref m);
        Console.WriteLine(m.someProp);
        Console.ReadKey();
    }
    static void ChangeValue(Myclass m)
    {
        m.someProp = 10;
    }
    static void SetToNull(ref Myclass m)
    {
        m = null;
    }
}

一些地方可以阅读更多信息:

以你的SetToNull函数为例,可以重写如下。因此,您可以看到您没有在主函数中更改 m 的值,而是更改 _m 的值。 _m也是一个引用,是对m的复制。

static void SetToNull(Myclass _m)
{
    _m = null;
}

Is the m which is pass to the method is a copy of the object or it's just reference.

您正在将 "m" 引用 的副本传递给方法。如果你想传递对内存中 MyClass 对象的实际引用,你可以使用 ref 关键字:

public class Program
{
    public static void Main(string[] args)
    {
        Myclass m = new Myclass();
        SetToNull(ref m);
        if(m == null)
            Console.WriteLine("NULL!");
        Console.ReadKey();
    }

    static void SetToNull(ref Myclass m)
    {
        m = null;
    }
}

然后 SetToNull 方法会将实际的 "m" 引用设置为空引用。