C# 是否总是需要预先删除变量?

C# 是否总是需要预先删除变量?,c#,dictionary,scope,C#,Dictionary,Scope,也许这是一个很愚蠢的问题,但是在c语言中,什么是语法明智的方法呢? 如果我从字典中检索值,但我不确定它们是否存在,我是否需要预先声明这些值,以便在以后使用m 示例(稍后我需要在代码中使用“stringbla”: 我确实需要检查字典中的很多条目,还有一些更复杂的类型,所以这将是一个相当大的预声明 但我认为在这种情况下,问问题就是回答问题。。。 干杯 对于这样的东西,我喜欢使用扩展方法: public static class DictionaryExtensions { public st

也许这是一个很愚蠢的问题,但是在c语言中,什么是语法明智的方法呢? 如果我从字典中检索值,但我不确定它们是否存在,我是否需要预先声明这些值,以便在以后使用m

示例(稍后我需要在代码中使用“stringbla”:

我确实需要检查字典中的很多条目,还有一些更复杂的类型,所以这将是一个相当大的预声明

但我认为在这种情况下,问问题就是回答问题。。。
干杯

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

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);
    }
}
我更喜欢这个

    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);
EDIT一般来说,检查
bla==null
myDictionary.ContainsKey
不同,因为即使键存在,值也可以是
null
。为了获得更好的性能,您应该始终像这样使用
.TryGetValue

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

Console.WriteLine(bla);

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

是的,预先删除变量总是必要的。您可以选择的是变量的范围,而不是其他

例如,这将是一个备选方案:

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#要求在使用所有变量之前声明并初始化它们。有时初始化是自动为您完成的(实例字段),但没有办法避免必须声明它们。

需要声明变量才能使用它们。声明需要在仍然适用于用法的范围级别上进行。因此,在您的情况下,您不能在if中声明字符串
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);

对于您的特定问题,从字典中检索值(如果存在),您可以使用。此方法允许您检查键,同时检索值。因此,您只有一个字典查找。它使用一个
out
参数来检索值,因此您可以这样做:

var bla = myDictionary.ValueOrDefault("unknownKey");
    string bla;
    if (myDictionary.TryGetValue("unknownKey", out bla))
    {
        //the key exists
    }
    else
    {
        //the key doesn't exist
    }
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
}

您可以创建
Dictionary defaultDictionary=newdictionary{{{“unknownKey”,“unknownValue”},…}
和一个助手方法
string GetValue(string key){if(myDictionary.Contains(key)){return myDictionary[key];}return defaultDictionary[key];}
始终需要声明变量。如果变量无法初始化(例如,如果您的情况中的条件不正确),则还需要初始化变量。编译器会要求您这样做,并在您忘记它时告诉您。所以答案是:当编译器需要它时,它是必需的。要添加到pokes答案:您确实要初始化它。带有空值。这是完全正确的。在即将到来的C#7.0中,对这种情况的语法进行了改进。请注意,这可能是一种很好的检索值的方法,但它根本无法回答问题(关于是否需要或何时需要)。在我看来,允许字典为null是一个错误。通常,对null引用调用方法会引发异常,但此扩展方法功能确实可以(某种程度上)忽略此问题,“但无论如何,这似乎是错误的。”我解释了罗纳德的目标,即能够访问字典,而不必首先检查字典中是否有钥匙。一种方法是将值设置为某个默认值。我建议不要这样做,而是使用这样一种扩展方法,它隐藏代码以检查现有密钥,并使代码更具可读性。当然,您也可以将自己的默认值添加到扩展方法中。@Silvermind我不确定在这种情况下什么是最好的方法。我想这要看情况了