预先变量变量总是必要的吗?

时间:2016-08-23 07:04:27

标签: c# dictionary scope

也许有点愚蠢的问题,但是c#的语法方式是什么? 如果我从字典中检索值并且我不确定它们是否存在,我是否需要预先声明这些值,所以如果它们存在我以后可以使用m?

示例(我需要在代码中稍后使用' string bla')

string bla = null;
if (myDictionary.ContainsKey("unknownKey"))
{
    bla = myDictionary["unknownKey"];
}

if (bla != null) {  etc etc etc }

我必须检查字典中的很多项目,还有一些更复杂的类型,因此这将是一个相当大的预先声明...

但我认为在这种情况下,问问题是回答它...... Cheerz!

4 个答案:

答案 0 :(得分:5)

对于类似的东西,我喜欢使用扩展方法:

public static class DictionaryExtensions
{
    public static T1 ValueOrDefault<T, T1>(this IDictionary<T, T1> dictionary, T key)
    {
        if (key == null || dictionary == null)
            return default(T1);

        T1 value;
        return dictionary.TryGetValue(key, out value) ? value : default(T1);
    }
}

然后你可以像这样使用它:

var bla = myDictionary.ValueOrDefault("unknownKey");

答案 1 :(得分:3)

我更喜欢这个

    if (myDictionary.ContainsKey("unknownKey"))
    {
        var bla = myDictionary["unknownKey"];
        //etc etc etc
    }
    else
    {
        //your code when the key doesn't exist
        //sometimes this else is useless
    }

请注意,词典(K,V)可以包含空值!想象一下

myDictionary.Add("unknownKey", null);

编辑一般来说,检查bla == nullmyDictionary.ContainsKey不同,因为即使密钥存在,该值仍然可以是null。为了获得更好的性能,您应该始终使用.TryGetValue,如下所示:

    string bla;
    if (myDictionary.TryGetValue("unknownKey", out bla))
    {
        //the key exists
    }
    else
    {
        //the key doesn't exist
    }

答案 2 :(得分:1)

似乎没有人真正回答过你的问题。

是的,始终需要预先声明变量。您可以选择的是变量的范围,但很少。

例如,这将是另一种选择:

if (myDictionary.ContainsKey("unknownKey"))
{
    var bla = myDictionary["unknownKey"];

    if (bla != null) {  etc etc etc }
}

var bla = "someother string"; //valid because previous bla declaration is out of scope.

C#要求在使用之前声明所有变量。有时初始化是为你自动完成的(实例字段),但没有必要声明它们。

答案 3 :(得分:1)

需要声明变量才能使用它们。声明需要在仍适用于使用的范围级别进行。因此,在您的情况下,您无法在bla内声明字符串if,因为在它之外,它将无法访问,因此您之后无法使用bla

除了声明之外,C#编译器还要求您初始化变量,然后才能访问它们。这是一种安全措施,可确保变量实际上具有一些有意义的值。初始化可以是任何有效的赋值,包括正确的值,虚拟值或类型的默认值。

对于参考类型,例如字符串,后来被替换的常见初始化值为null。所以你所做的事情已经非常普遍了。

因此,在您的情况下,由于您仅在if内为变量赋值,但之后使用它,因此您需要先使用某个值初始化变量。否则,请考虑以下事项:

string bla; // not initialized

if (someCondition)
{
    bla = "some value";
}

Console.WriteLine(bla);

如果someCondition为真,那么一切都很好。 bla具有实际值,因此可以打印。但是,如果条件不为真,则永远不会为bla分配任何值 - 它不会被初始化。编译器将检测变量永远不会被初始化的可能性并告诉您修复它。所以上面的代码是不允许的。您需要首先初始化bla字符串,例如和null一样。

通常,只要编译器告诉您,就需要初始化变量。如果没有可能的路径,变量不会被初始化,那么您不需要显式初始化它。例如,如果您在上面的代码中添加了一个else大小写,其中变量被分配了一些值,那么一切都会没问题:

string bla; // not initialized

if (someCondition)
{
    bla = "some value";
}
else
{
    bla = "some other value";
}

Console.WriteLine(bla);

对于您的特定问题,从字典中检索值,您可以使用Dictionary.TryGetValue。此方法允许您检查密钥并同时检索值。所以你只有一个字典查找。它使用out参数来检索值,因此您可以这样做:

string bla;
dictionary.TryGetValue("unknownKey", out bla);

Console.WriteLine(bla);

请注意,由于bla作为out参数传递,因此您无需初始化它。这是因为使用out参数的方法已经必需来初始化它。因此,即使字典中不存在密钥,bla也具有初始化值。在TryGetValue的情况下,它将接收类型的默认值(对于字符串,这是null)。

当然,更常见的用法是使用TryGetValue的返回值来获取一些关于在从字典中检索密钥时是否存在密钥的反馈:

string bla;
if (dictionary.TryGetValue("unknownKey", out bla))
{
    // key existed
    // do something with bla
}