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

C# 声明类null和实例化类之间有什么区别?,c#,dictionary,null,instantiation,C#,Dictionary,Null,Instantiation,我不确定我的问题是否有意义。但我只是想知道这两行代码之间是否有区别: Dictionary<int, List<string>> myDictionary = new Dictionary<int, List<string>>(); Dictionary myDictionary=newdictionary(); vs Dictionary myDictionary=null; 我知道第一行会建立一个新的dictionary对象,但因为我没有

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

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

Dictionary myDictionary=null;

我知道第一行会建立一个新的dictionary对象,但因为我没有在dictionary中添加任何内容,所以它只是一个空对象。第二行只是一个空的dictionary对象。有区别吗?

简单的回答,第一种情况下你可以使用它,第二种情况下你可以继续使用它,因为null表示不存在,所以你不能访问它,直到它被实例化

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

即:

Dictionary<int, List<string>> myDictionary;
// Some code here, Not using myDictionary
myDictionary = PopulateDictonary();
Dictionary-myDictionary;
//这里有些代码,不使用myDictionary
myDictionary=populateDictionary();

注意:-如果使用有条件地实例化对象以避免异常,则在使用
myDictionary
之前应检查Null

可以这样想:

变量是一张空纸。您可以不可以在上面写一个地址,将您带到某个位置

第一行在纸上写下对象的地址(在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 myDictionary=newdictionary();
myDictionary.Add(1,“1”);//好的,myDictionary指向
//Dictionary对象,我可以访问它。
而:

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
Dictionary myDictionary=null;
myDictionary.Add(1,“1”);//运行时失败,我没有Dictionary对象的地址
//这里又称为:NullReferenceException
你说的错误陈述: 您并没有像前面所说的那样声明类null,而是创建了一个指向null的变量


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

在第一种情况下:

     Dictionary<int, List<string>> myDictionary = new Dictionary<int, List<string>>();
     myDictionary.Add(key,value); // NOT throw null reference exception.
Dictionary myDictionary=newdictionary();
myDictionary.Add(键、值);//不引发空引用异常。
在第二种情况下:

     Dictionary<int, List<string>> myDictionary = null;
     myDictionary.Add(key,value); // will throw null reference exception.
Dictionary myDictionary=null;
myDictionary.Add(键、值);//将引发空引用异常。

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

第一行实际创建了一个对象(内存已分配);这意味着您要引用某些内容并对其执行操作(例如,
myDictionary.Count()
将返回0)。代码
if(null==myDictionary)
将计算为
false


第二行不创建对象;您没有任何引用(在本例中,调用
myDictionary.Count()
将导致引发NullReferenceException)。代码
if(null==myDictionary)
将计算为
true

第二行不是空的dictionary对象。尝试向第二个dictionary对象添加内容以了解您自己。通常,当您实际希望在程序中稍后将一个对象分配给该引用时,您会将引用指向null。

这两个语句之间有许多区别,最基本的区别是:第一个是初始化,而后一个只是声明。考虑下面的代码:

Base b = new Derived();
朝向

Base b = null;
在第一条语句中,您创建一个新的
Derived
实例,并将其分配给
b
。通常,您需要一个类的实例来调用其成员(为了简单起见,我们在这里省略了静态成员),例如在
字典中定义的
Add
-方法。通过一个声明,您只需定义您可以调用类实例的成员,但是对于您调用这些成员的实例没有任何说明。因此,基本上您需要两个信息:由您使用的接口(而不是OOP含义)定义的代码契约-在您的例子中,这只是
字典
。现在您知道了如何处理这个类的实例。但是,只要使用
null
-assignment,就没有类的实例。这是第二个信息-实际实例


在我前面的示例中,编译器应该如何实际知道您实际使用的是哪个类-
Base
派生的
。这不一定会影响您可以对实例执行的操作(由
Base
中的定义给出),但是,您作为
派生的
执行的方式可能有自己的逻辑,用于执行
Base
中定义的操作

你可以用你的调试器自己找出答案?!?Null不指向任何对象。这里我们看到了一些关于空文本(“null”)的信息和事实。Null由值0表示,但不能在程序中使用0代替Null。Null会导致大量异常。请尝试调用这两个函数的
.Count
,您很快就会看到差异!可能重复或感谢您的所有回复。向下投票者,获取一个lyfe pl0x。它被称为
NullReferenceException
。我正准备写同样的东西。我
Base b = null;