在方法中更改 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" 引用设置为空引用。
我有以下代码
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" 引用设置为空引用。