2017-01-02 138 views
0

我有下面的代码更改类属性值

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
我不知道为什么在我设置类为null它显示10
是在m这是通该方法是该对象的副本或它只是参考。

+0

除了[贾斯汀的回答](http:// stackoverflow。com/a/41430259/5528593),如果您为_variables_和_parameters_使用_different_名称,则您的错误应该变得更加明显。 –

回答

1

是被传递给该方法是对象的副本,或它只是引用的米。

您正在将副本的“m”参考传递给方法。如果您想对实际参考传递给MyClass的对象在内存中您可以使用裁判关键字:

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”参考一空引用。

1

传递的m只是一个参考。

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

当你自己设定mnull,你改变什么m引用这就是为什么在Main原来的基准仍然指向原来的对象。

1

首先我要注意到你是问有关领域,而不是一个属性, 属性配置是这样的:

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

你的问题 你是对的,当你通过一个实例来你传递一个“指针”给这个实例的方法,你不能用这种方式替换实例本身,你可以改变它的属性/域。 为了替换/更改实例本身,您需要使用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; 
    } 
} 

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

+0

你是对的领域我改变了代码 –

1

以你的SetToNull函数为例,它可以被重写为如下。因此,您可以看到您的主功能中没有更改m的值,而是改为_m_m也是参考文献,它是m的副本。

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