有没有办法缩短这条线?
bool pass = d != null && d["k"] != null && (bool)d["k"];
注意:“k”实际上是“更长的id”;我替换它以使其在这篇文章中更具可读性。您的许多建议都不会检查d是否为空。
答案 0 :(得分:32)
它已经几乎无法读取,为什么要缩短它?
答案 1 :(得分:13)
试试这个:
bool pass = d != null && (bool)(d["k"] ?? false);
答案 2 :(得分:8)
我会质疑你为什么要缩短它。
较短的代码对任何人都没有好处。这使得其他人更难阅读它。
就个人而言,我会问“如何让这段代码更容易阅读”,答案就是把它分成多行,每行只做一件事。
C#中唯一可用的“空速记”是null-coalescing运算符,它允许您为空对象定义默认值。但是对于你的代码,我建议你的目标是可读性,而不是行大小。
答案 3 :(得分:5)
是的,从中提取一个函数并将其称为doTheValuesInTheFooBarDictionaryPassTheRebarTest
。
这更容易阅读。当然,该方法仍将包含您的上述行,但代码的读者(从此处开始直到时间结束)在浏览代码时将获得更愉快的体验。
通过缩短代码,您希望实现什么目标?更快阅读? (大脑需要更长的时间来解析它!)。输入更快? (你输入一次这个东西,然后一次又一次地修改或读取它(再次!))。通常,更长,更具描述性的变量更好,如果您可以将它们包装在封装方法中,那么也可以这样做。
答案 4 :(得分:4)
您可以通过在构造函数中初始化d来删除第一个表达式。我建议你使用通用字典,即
Dictionary<string,bool> d = new Dictionary<string,bool>();
这样你就不必抛出价值了。并使用ContainsKey方法而不是直接访问该值。所以你最后的表达
bool pass = d.ContainsKey("k") && d["k"];
答案 5 :(得分:3)
我不会试图进一步缩短它,我会试着给它一个好名字。编写扩展方法或修改类(如果您有权访问代码)对我来说听起来不错。
// Better use a longer and more descriptive name here.
public static Boolean Pass(this Foo foo, String bar)
{
return
(foo != null)
&& (bar != null) // Maybe this test, too?
&& (foo[bar] is Boolean)
&& (foo[bar] as Boolean);
}
并使用它。
Boolean pass = d.Pass("k");
答案 6 :(得分:3)
null-conditional和null-coalescing运算符的组合应该在这里工作:
bool pass = (bool) (d?["k"] ?? false);
澄清:
d
为空,d?["k"]
为空d?["k"]
为空,则d?["k"] ?? false
为false
(标记为object
)另一种方法是在 null-coalescing运算符之前强制转换,但要转换为可空类型:
bool pass = ((bool?) d?["k"]) ?? false;
请注意,在C#6中引入了空条件运算符。
答案 7 :(得分:2)
我会问你为什么要把d [“k”]投给一个布尔。要么它已经是一个bool,要么它应该被比作什么才能得到一个bool。这会让事情变得更清楚。
无论如何,我认为这可行:
bool pass = (d != null) && d["k"] ?? false
答案 8 :(得分:2)
是。使d强列表(例如使用Dictionary&lt;&gt;而不是Hashtable)
bool pass = d != null && d["k"];
如果我们知道d的类型会有所帮助。
答案 9 :(得分:1)
这不短,但更可靠(也许更高效):
bool pass = false;
if (d != null)
{
object value;
if (d.TryGetValue("k", out value))
{
pass = value is bool && (bool)value;
}
}
我建议将其移动到一个函数中。
答案 10 :(得分:1)
您可以将其替换为带有字典和键的函数调用...
答案 11 :(得分:1)
我更愿意看到这样的事情:
bool pass = false;
if(d != null && d["k"] != null)
pass = (bool)d["k"];
或者如果想为System.Object
编写一个方便的扩展方法,它会使它看起来像这样:
bool pass = false;
if(!d.IsNull && !d["k"].IsNull)
pass = (bool)d["k"]
我发现这比原始版本更容易理解。
答案 12 :(得分:0)
在c#6及以上版本中,您可以使用
bool pass = (bool)(d?["k"] ?? false);
如果d [“k”]的编译时间类型是bool?你可以省略演员
bool pass = d?["k"] ?? false;