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