我是否需要初始化变量,即使我知道它将在使用之前被赋值

本文关键字:赋值 我知道 初始化 变量 是否 | 更新日期: 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;

保险一点也无妨。