Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以下两者之间有什么区别_C#_.net - Fatal编程技术网

C# 以下两者之间有什么区别

C# 以下两者之间有什么区别,c#,.net,C#,.net,1 A; 2 A=零 有什么区别吗?对于局部变量,绝对是这样的-第一个变量没有明确赋值,第二个变量是。例如: void DoesntCompile() { A a; string x = a.ToString(); // Can't use a - it's not definitely assigned } void CompilesButGoesBang() { A a = null; string x = a.ToString(); // Throws a

1 A; 2 A=零


有什么区别吗?

对于局部变量,绝对是这样的-第一个变量没有明确赋值,第二个变量是。例如:

void DoesntCompile()
{
    A a;
    string x = a.ToString(); // Can't use a - it's not definitely assigned
}

void CompilesButGoesBang()
{
    A a = null;
    string x = a.ToString(); // Throws a NullReferenceException
}
对于静态字段或实例,如果是引用类型,则可能没有任何区别。我可以编写一个程序来演示在静态变量的情况下的差异,但它将依赖于使用反射执行静态类型初始值设定项两次。。。讨厌


如果你能提供更多关于你为什么要问的上下文,那将非常有帮助。

在C中,变量是根据列出的规则默认的


这两者之间的主要区别在于,对于情况2,可以认为变量是明确指定的。根据变量的使用方式,在编译器允许某些操作之前,可能需要对其进行明确的赋值。请看明确的任务

我只是想理解为什么在声明引用类型时C没有默认的null。我认为如果声明一个值类型,它应该有默认值,对吗?@user496949:No,不适用于局部变量。对于可变结构,您可以做一些奇怪的事情,首先将字段分配给空变量,但是如果您只使用int之类的东西,您将看到局部变量与字符串局部变量的行为完全相同。@user496949作为变量,否:即使是值类型也没有初始值,尽管有一种边case方法可以指定未赋值结构的所有字段,但这很混乱,并且需要可变性。简单的答案是变量没有初始值;字段获取类型的默认值,但默认为null。但它会告诉您使用默认值可能是错误的,从而为您提供了更多的保护。@Euphoric:如果不执行奇怪的反射fu,您就无法知道局部变量的默认值是多少。它可能是某种位模式,这意味着它既不是null也不是有效引用。C本身并不保证。现在,MicrosoftC编译器for.NET确实生成了基本上将其设置为null的代码,但这是一个实现细节。从语言的角度来看,认为它没有值更符合逻辑。我只想了解以下内容,因为每种类型都有默认值,为什么编译器阻止您使用未分配的局部变量。引用是正确的,但是现在可能是时候离开VS2003文档了…@user496949两个答案都已经告诉你了;明确赋值-这是规范中变量的要求。