我一直想知道为什么在下面的例子中可以不初始化实例字段(依赖它将具有其默认值)并访问它,而局部变量显然必须初始化,即使我将其初始化为默认值无论如何它会得到......
public class TestClass
{
private bool a;
public void Do()
{
bool b; // That would solve the problem: = false;
Console.WriteLine(a);
Console.WriteLine(b); //Use of unassigned local variable 'b'
}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 29
对于局部变量,编译器对流程有一个很好的了解 - 它可以看到变量的"读取"和变量的"写入",并证明(在大多数情况下)第一次写入将在第一次读取之前发生.
实例变量不是这种情况.考虑一个简单的属性 - 你怎么知道有人会在它得到它之前设置它?这使得强制执行合理规则基本上是不可行的 - 因此要么必须确保在构造函数中设置所有字段,要么允许它们具有默认值.C#团队选择了后一种策略.
它由C#中的Definite Assignment规则控制.必须在访问变量之前明确赋值.
5.3明确的任务
在函数成员的可执行代码中的给定位置,如果编译器可以通过特定的静态流分析(第5.3.3节)证明变量已被自动初始化或已被证实,则称该变量是明确赋值的.至少一项任务的目标.
5.3.1最初分配的变量
以下类别的变量分类为最初分配的:
静态变量.
类实例的实例变量.
最初分配的结构变量的实例变量.
数组元素.
值参数.
参考参数.
在catch子句或foreach语句中声明的变量.
5.3.2最初未分配的变量
以下类别的变量被归类为最初未分配的变量:
最初未分配的struct变量的实例变量.
输出参数,包括struct实例构造函数的this变量.
局部变量,但在catch子句或foreach语句中声明的变量除外.
归档时间: |
|
查看次数: |
8949 次 |
最近记录: |