声明类null和实例化类之间有什么区别?

时间:2016-07-11 05:54:23

标签: c# dictionary null instantiation

我不确定我的问题是否有意义。但我只是想知道这两行代码之间是否存在差异:

Dictionary<int, List<string>> myDictionary = new Dictionary<int, List<string>>();

VS

Dictionary<int, List<string>> myDictionary = null;

我知道第一行是实例化一个新的字典对象,但由于我没有在字典中添加任何内容,所以它只是一个空对象。第二行只是一个空字典对象。有区别吗?

6 个答案:

答案 0 :(得分:3)

在第一种情况下:

     Dictionary<int, List<string>> myDictionary = new Dictionary<int, List<string>>();
     myDictionary.Add(key,value); // NOT throw null reference exception.

在第二种情况下:

     Dictionary<int, List<string>> myDictionary = null;
     myDictionary.Add(key,value); // will throw null reference exception.

要使用任何集合对象,您需要先创建占位符。

答案 1 :(得分:2)

将其视为以下内容:

变量是空纸。您可能可能不会在其上写一个地址,将您带到某个位置。

第一行在纸上写入对象的地址(在new关键字之后创建)。

在第二行,您只需要一张空文件(由编译器)在某个时刻保存字典参考,但目前它只是一张空纸。因此,如果您尝试使用它来转到字典地址,则不能(也就是 NullReferenceException )。没有关于对象位置的信息(实际上没有地址)。

在代码中:

Dictionary<int, List<string>> myDictionary = new Dictionary<int, List<string>>();
myDictionary.Add(1, "1"); // OK, myDictionary points to an address of
                         // Dictionary object and I can access it.

虽然:

Dictionary<int, List<string>> myDictionary = null;
myDictionary.Add(1, "1");  // Fails at run-time, I have no address for a Dictionary object 
                           // here AKA : NullReferenceException

你说错误的陈述:

如你所说,你没有声明一个null ,你正在创建一个指向null的变量。

如你所说,第二行不是空字典对象。它是Dictionary类型的变量,指向 NULL 。内存中没有空字典对象。

答案 2 :(得分:1)

简单回答,第一种情况你可以使用它,第二种情况会在你继续进行时给你NullReferenceException,因为null意味着不存在所以在实例化之前你无法访问它。

第二个声明没有错误,但是如果你想使用这个意味着你需要实例化它们(在使用之前),否则它会抛出NullReferenceException。让PopulateDictonary()成为返回Dictionary对象的方法然后您可以使用此方法实例化myDictionary

那是:

Dictionary<int, List<string>> myDictionary;
// Some code here, Not using myDictionary
myDictionary = PopulateDictonary();

注意: - 如果你使用conditionaly,你应该在使用myDictionary之前检查Null实例化对象以避免异常。

答案 3 :(得分:1)

第一行实际上创建了一个对象(分配了内存);这意味着你有一些东西可以引用并采取行动(例如,myDictionary.Count()将返回0)。代码if (null == myDictionary)将评估为false

第二行没有对象;你没有引用(在这种情况下,调用myDictionary.Count()将导致抛出NullReferenceException)。代码if (null == myDictionary)将评估为true

答案 4 :(得分:1)

第二行不是空字典对象。尝试将内容添加到第二个字典对象中以查找自己。通常,当您希望稍后在程序中将对象分配给该引用时,将引用指向null。

答案 5 :(得分:1)

这两个语句之间存在许多差异,最基本的一个:第一个是初始化,而后者只是一个声明。请考虑以下代码:

Base b = null;

走向

Derived

在第一个语句中,您创建 b的新实例,分配给Add。通常你需要一个类的实例来调用它的成员(为了简单起见,我们在这里省略了静态成员),例如Dictionary - 在Dictionary<int, List<string>>中定义的方法。通过声明,您只需定义您可以在类的实例上调用的成员,但是没有任何关于您调用这些成员的实例的说法。所以基本上你需要两个信息:代码契约由你使用的接口(而不是OOP意义)定义 - 在你的情况下,这只是null。现在你知道你可以用这个类的实例做什么了。但是,只要您使用Base - assignement,就不会拥有类的实例。这是第二个信息 - 实际的实例。

要继续我之前的示例,编译器应该如何知道您实际使用哪个类 - DerivedBase。这不会影响你可以对实例做什么(由Derived中的定义给出),而且如何你做{{ 1}}可能有自己的逻辑来处理Base中定义的事情。