C#局部变量初始化 - 初学者的问题

Kan*_*ini 5 c# variables initialization

我正在阅读MCTS Self Paced Training Kit(70-536)Edition 2,在第1章我们有以下内容.

如何声明值类型变量要使用类型,必须首先将符号声明为该类型的实例.值类型具有隐式构造函数,因此声明它们会自动实例化类型; 您不必像处理类一样包含New关键字.构造函数为新实例分配一个默认值(通常为null或0),但是您应该始终在声明中显式初始化该变量,如以下代码块所示:

'VB

Dim b As Boolean = False    

// C#  
bool b = false;
Run Code Online (Sandbox Code Playgroud)

但是,当我编译以下控制台应用程序时,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ch1_70_536
{
    class Program
    {
        static void Main(string[] args)
        {
            bool b;
            Console.WriteLine("The value of b is " + b);
            Console.ReadKey();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到编译时错误

"使用未分配的局部变量b"

勘误表中甚至没有提到它.我做错了还是这本书完全错了?

Pie*_*kel 13

必须先分配局部变量才能使用它们.但是,类字段会获得其默认值.

一个例子:

public bool MyMethod()
{
    bool a;

    Console.Write(a); // This is NOT OK.

    bool b = false;

    Console.Write(b); // This is OK.
}

class MyClass
{
    private bool _a;

    public void MyMethod()
    {
        Console.Write(_a); // This is OK.
    }
}
Run Code Online (Sandbox Code Playgroud)


Guf*_*ffa 12

这本书在VB方面基本上是正确的,但在这种情况下它没有提到VB和C#之间的区别.

在VB中,所有局部变量都会自动初始化:

Sub Test()
  Dim x As Integer
  MessageBox.Show(x.ToString()) 'shows "0"
End Sub
Run Code Online (Sandbox Code Playgroud)

虽然在C#中局部变量没有初始化,但编译器不允许你使用它们,直到它们为:

void Test() {
  int x;
  MessageBox.Show(x.ToString()); // gives a compiler error
}
Run Code Online (Sandbox Code Playgroud)

此外,还不清楚本书的引用是否实际上是在讨论局部变量或类成员变量.在VB和C#中创建类实例时,始终会初始化类成员变量.

当它说"值类型具有隐式构造函数"时,这本书是错误的.那明显是错的.值类型初始化为其默认值(如果已初始化),并且在发生这种情况时不会调用构造函数.