我在类中定义了以下方法:
public bool LogOff(string sessionId)
{
int res;
// Some non related code here..
if (res == 1)
{
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
对我来说很奇怪的是,我在IF子句中获得了"在访问Visual Studio之前可能没有初始化本地变量"错误(我安装了ReSharper).当"res"是一个值类型时,为什么会这样,因此默认为0?我应该指出,如果我专门将res的值设置为0,那么一切都OK.
我在这里错过了什么?我认为这些是编程的基础,但显然我不熟悉基础知识......
Rya*_*n M 10
"为什么C#以这种方式工作"的答案总是"因为这就是规范中的内容".C#语言规范的第5.3.2节列出了最初未分配的变量:
- 最初未分配的struct变量的实例变量.
- 输出参数,包括struct实例构造函数的this变量.
- 局部变量,但在catch子句或foreach语句中声明的变量除外.
至于为什么这是一个错误,第5.3节说明
必须在获得其值的每个位置明确赋值变量.
如果将值初始化为int res = new int();,则将获得默认值零.在其他答案中提到了更常见的方法,即明确地将其设置为零.依赖于默认值只会使代码不易读取而没有真正的优势.
当"res"是一个值类型时,为什么会这样,因此默认为0?
即使成员字段中的值默认为0,本地也需要显式设置值.编译器会在没有初始化的情况下警告您正在使用它,因为这可能是一个错误.
虽然从技术角度来看这种"技术上"可能没什么问题,但从现实世界的角度来看,在初始化默认值为零的情况下,你在检查之前没有设置值的事实要么是1)无用(if永远不会是真的) )或2)一个错误(你想设置值,但改变了一些东西).
在任何一种情况下,都会有一个警告来帮助您防止意外发生任何一种情况.
我应该指出,如果我专门将res的值设置为0,那么一切都OK.
执行此操作时,您将专门提供一个值,因此编译器不再警告您.
| 归档时间: |
|
| 查看次数: |
8606 次 |
| 最近记录: |