C#: 未赋值的本地变量的使用,在foreach和if语句中

5
我有以下代码: 我得到了错误提示,"使用未分配的本地变量" 我确定这很简单,但我很困惑...
    public string return_Result(String[,] RssData, int marketId)
    {
        string result;
        foreach (var item in RssData)
        {
            if (item.ToString() == marketId.ToString())
            {
                result = item.ToString();
            }
            else
            {
                result = "";
            }

        }
        return result;
    }

问题不在于foreach循环,而是你还有一个单独的问题存在... - BoltClock
6个回答

17

在声明result变量时就进行初始化。如果集合为空,if语句的两个分支都不会被执行,result在返回前不会被赋值。

public string return_Result(String[,] RssData, int marketId)
{
    string result = "";
    foreach (var item in RssData)
    {
        if (item.ToString() == marketId.ToString())
        {
            result = item.ToString();
        }
    }
    return result;
}

result不仅仅是一个字符串时,这可能会变得混乱。例如,在我的情况下,result = timeline.CreateTrack("newTrack")(一些Unity3d对象实例化),然后我必须在foreach循环内部再次销毁它,然后将result分配给新的东西(从而创建第二个实例)。 - A__

2
如果RssData中没有任何项目,则result将永远未被设置,因此无效。
要么初始化result(例如:string result = null;),要么在设计时考虑检查是否为空,并在这种情况下设置或返回失败状态。

2
那是因为编译器无法知道RssData中是否总是有任何项。如果它为空,循环中的代码将永远不会被执行,变量也永远不会被赋值。
只需在创建变量时将其设置为null,以便始终具有值:
string result = null;

+1:这总是与@eric lippert有关 :) @Guffa:一个疑问。哪个赋值更好,String.Empty还是null - naveen
@naveen:这取决于如果“RssData”实际上是空的,你想要什么。除此之外,我更喜欢使用“null”,因为它只是一个字面上的零值,而“String.Empty”是一个必须从某个地方复制的引用。 - Guffa

1

将你的代码行改为

string result;

string result = string.Empty; // or null depending on what you wish to return (read further)

编译器只是在说“嘿,你正在使用result,但它还没有被分配!”。即使你第一次赋值,如果你不是在初始实例化中这样做,它也会发生。
此外,您还需要考虑如何处理代码,如果您返回一个空字符串,由于您的数组参数是空的。您可以选择返回一个空字符串或null值。这只是一个行为决策。

1
如果 RssData 没有任何项,循环将不会运行,导致 result 未定义。你需要初始化它为某个值(例如 string result = "";)以避免出现这个错误。

0

这种情况对于所有变量类型都可能发生。

对于集合和对象,请使用 new 进行初始化。

例如:List<string> result = new List<string>();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接