shadow 0 C#中的变量初始化

时间:2015-04-21 19:05:01

标签: c# constructor

我最近开始在C ++之后学习C#。在书中我看到了代码

public class Panda
{
    public string name;
    public static int population;
    public Panda(string n)
    {
        name = n;
        population += 1;
    }
}

然后我创建了2个对象

Panda first=new Panda("po");
Panda second = new Panda ("bo");

之后我把people的值放在console = 2中。为什么2?我没有初始化。人口。我只增加它。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:1)

整数不可为空,因此int的默认值为0

所以,宣布

private static int count; 

相当于

private static int count = 0;

答案 1 :(得分:0)

c#(实际上,整个.Net CLR)旨在使纯托管代码中的“未初始化变量”错误变得不可能。字段(静态和实例)由运行时预初始化为其默认值;这就是您的静态population具有初始值0的原因。来自c# Language Specification, 10.4.4 Field initialization

  

字段的初始值(无论是静态字段还是实例字段)是字段类型的默认值(Section 5.2)。在此默认初始化发生之前无法观察字段的值,因此字段永远不会“未初始化”。

另一方面,局部变量最初未初始化。来自Section 5.1.7 Local variables

  

本地变量不会自动初始化,因此没有默认值。出于明确赋值检查的目的,局部变量最初被认为是未分配的。

相反,变量在使用前必须为definitely assigned。来自5.3 Definite assignment

  

在函数成员的可执行代码中的给定位置,如果编译器可以通过静态流分析证明该变量已被自动初始化或至少成为目标,则称该变量是明确赋值的。一项任务。

     

在以下情境中,明确赋值是必需的:

     
      
  • 必须在获取其值的每个位置明确赋值变量。这可确保永远不会发生未定义的值。表达式中变量的出现被认为是获取变量的值,除非   
        
    • 变量是简单赋值的左操作数,
    •   
    • 变量作为输出参数传递,或
    •   
    • 该变量是一个struct-type变量,它作为成员访问的左操作数出现。
    •   
  •   
  • 必须在传递它作为参考参数的每个位置明确赋值变量。这可以确保被调用的函数成员可以考虑最初分配的引用参数。
  •   
  • 必须在函数成员返回的每个位置(通过return语句或通过执行到达函数成员体的末尾)明确赋值函数成员的所有输出参数。这可确保函数成员不会在输出参数中返回未定义的值,从而使编译器能够考虑将变量作为输出参数的函数成员调用,该输出参数等同于对变量的赋值。   必须在该实例构造函数返回的每个位置明确赋值struct-type实例构造函数的this变量。
  •   

如果在编译器证明它已被分配之前尝试使用局部变量的值,则会出现编译器错误Use of unassigned local variable 'name'

顺便说一句,以您的方式递增静态变量并不保证是线程安全的。相反,你应该这样做:

public static volatile int population; // Guarantee all threads see the up-to-date value.

之后

Interlocked.Increment(ref population); // Guarantee incrementing is atomic.