我是否需要初始化变量,即使我知道它将在使用之前被赋值
本文关键字:赋值 我知道 初始化 变量 是否 | 更新日期: 2023-09-27 18:12:33
. NET MVC应用程序,我有代码,归结为以下内容:
public ActionResult Test() {
string query;
try {
query = GenerateQueryString();
}
catch (Exception ex) {
ModelState.AddModelError("error", ex.Message);
}
... do additional validation ...
if (ModelState.IsValid) {
return RedirectToAction("Success?" + query);
}
return View(); // Show validation messages
}
上面的代码有一个编译错误…query
可能未初始化。
然而,代码中的逻辑将在使用query
之前明确地初始化它。
解决这个问题的最好方法是什么?
c#编译器正在查看您的代码,并看到变量的值在try
块中初始化,然后稍后使用。它可以看到存在一个逻辑执行分支,其中抛出异常,捕获异常,然后使用未初始化的值执行后续代码。
抑制错误的最简单方法是为该字段赋一个默认值。null
就足够了。当您将错误添加到MVC模型状态并在访问query
之前稍后检查该值时,您不应该处于默认值将起作用的情况。
你错了,如果GenerateQueryString抛出异常怎么办?Query的值是什么?
你可能想做一个query = "Error";或者你的抓块里有什么东西。这是因为显然您希望在GenerateQueryString中抛出异常时运行应用程序。
编辑
我建议不要使用默认值预先设置查询。这是因为意思不同。默认值与某个时刻的某个值不同。这样做还可以防止编译器在您创建新代码路径但忘记为query
如果在调用GenerateQueryString
时出现异常,则query
的值将为undefined
试
string query = string.Empty;
对变量进行明确赋值。
或者,如果一个异常应该中止执行,这也可以工作:
string query;
try {
query = GenerateQueryString();
}
catch (Exception ex) {
ModelState.AddModelError("error", ex.Message);
return View();
}
代码没有明确初始化。当GenerateQueryString()方法抛出异常时,不会设置任何值。您应该将String设置为null,并在使用它之前检查是否为null,并且不要在catch块中中断。
仅仅因为你知道它将被初始化(它可能不是在你的代码中),编译器不能知道这一点-这被称为停止问题。
所以编译器错误在谨慎的一边,一些。net做了很多(例如,在switch..的情况下没有掉线)。
这里的问题是局部变量必须在读取之前初始化——默认情况下它们不会初始化,这可以防止程序员经常犯的错误。前段时间,我在寻找这个简单情况的答案:
bool a = true, b;
if (a == true) //here everything is OK, because a is initialized
b = true;
if(b == false) //here you get an error, I thought b == false by default
return;
我在stackoverflow上找到了深刻的解释,为什么它会这样工作(我正在阅读的时候找不到)。但是你可以读一篇有趣的文章。也许它能解释我想说的话:)
简历:
在您的情况下,您需要初始化query
或在catch块中设置变量
只需更改:string query = string.Empty;
中的查询声明。
问题是查询是在try块中初始化的,但查询是在上面的块中声明的。你必须在顶层块初始化它
这可能只是你的GenerateQueryString()
抛出一个异常。就我个人而言,为了安全起见,我更喜欢初始化变量。因此,您可以将query初始化为:
string query = String.Empty;
保险一点也无妨。