2012-09-25 74 views
-3

我只是好奇,这是如何工作: 在我的课Form1.cs中我已声明的对象静态:C#对象仍然存在删除其引用后

public static Class1 class1; 

这是Class 1的构造的样子:

public Class1() 
{ 
    Form1.class1 = null; 
} 

我希望得到一个空引用异常的MS VS 2010

class1 = new Class1(); 
class1.showMSG(); 

卜t代替它只是执行showMSG()(showMSG不是静态的),就像我从未将对class1的引用设置为null。 对此有何想法?

+0

您分配一个值调用showMSG ... –

+0

你将永远不会从该得到一个空引用EXCP之前CLASS1。因为您在使用新关键字时正在创建对象。这是基本的基础。 – pordi

+0

相反,如果你想产生一个空引用异常,那么你可能想尝试使用没有新关键字的类。 – pordi

回答

1

1类的构造函数设置

Form1.class1 = null; 

但是,当你执行

class1 = new Class1(); 

分配给class1(这是同class1)发生的构造函数执行后。所以Form1.class1现在有一个值。

+1

@OP您需要将'class1 = new Class1();'看作几个不同的操作,而不是一个原子操作。首先使用'new Class1()'创建'Class1'的新实例,然后运行该对象的构造函数(将'class1'设置为'null'),然后将该新创建的对象分配给'class1'。一旦你像这样分解它,很明显为什么arx的答案是正确的。 – Servy

+0

@Servy,但一旦class1有一个值,是不是仍然只是* null *? – Thousand

+1

@JaneDoe不,它不是null,它是新创建的'Class1'对象,它是从'new Class1()'返回的' – Servy

4

那么,根据所提供的代码,你在这里实际上初始化了它class1 = new Class1();

你首先将它设置为null

Form1.class1 = null; 

class1 = new Class1(); //INIT THE SAME (ACCORDING TO THE NAME) OBJECT 
    class1.showMSG();  //CALL A METHOD ON IT. 

编辑

根据编辑问题:

public Class1() 
{ 
    Form1.class1 = null; 
} 

因为你仍然一个constructor,在退出它实际上对象将构造并分配给您之前分配null相同的对象不复位任何东西。

+0

不正确。 'class1'在**'class1 = new Class1();之前设置为null **''设置'class1'为新创建的实例。 – Servy

+0

@Servy:和?这个新实例让我们来OP实际调用一个实例方法。 – Tigran

+0

@Servy:好的,更正INSTANCE - > OBJECT。 – Tigran

1

也许这是最简单的,如果你打破了你的最后两行解释,成:

var tmp = new Class1(); // makes class1 null 
class1.showMSG();  // would raise exception, remove this line to proceed 
class1 = tmp;   // class1 is no longer null 
class1.showMSG();  // no exception, instance exists to call method on 
相关问题