[英]null shorthand in C#?
有没有办法缩短这条线?
bool pass = d != null && d["k"] != null && (bool)d["k"];
注意:“k”实际上是“更长的id”; 我替换它以使其在这篇文章中更具可读性。 您的许多建议都不会检查d是否为空。
它已经几乎无法读取,为什么要缩短它?
尝试这个:
bool pass = d != null && (bool)(d["k"] ?? false);
我会问你为什么要缩短它。
较短的代码不会使任何人受益。 它让其他人更难阅读它。
就个人而言,我会问“如何让这段代码更容易阅读”,答案就是把它分成多行,每行只做一件事。
C#中唯一可用的“空缩写”是null-coalescing运算符,它允许您为null对象定义默认值。 但是对于你的代码,我建议你的目标是可读性,而不是行大小。
是的,从中提取一个函数并将其称为doTheValuesInTheFooBarDictionaryPassTheRebarTest
。
这更容易阅读。 当然,该方法仍将包含您的上述行,但代码的读者(从此处直到时间结束)在浏览代码时将获得更愉快的体验。
通过缩短代码,您希望实现什么? 更快阅读? (大脑需要更长的时间来解析它!)。 输入更快? (你输入一次这个东西,然后一次又一次地修改或读取它(再次!))。 通常,更长,更具描述性的变量更好,如果您可以将它们包装在封装方法中,那么也可以这样做。
你可以通过在构造函数中初始化d来摆脱第一个表达式。 我建议你使用通用字典即
Dictionary<string,bool> d = new Dictionary<string,bool>();
这样你就不必抛出价值了。 并使用ContainsKey方法而不是直接访问该值。 所以你最后的表达
bool pass = d.ContainsKey("k") && d["k"];
我不会试图进一步缩短它,我会试着给它一个好名字。 编写扩展方法或修改类(如果您有权访问代码)对我来说听起来不错。
// 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");
null-conditional和null-coalescing运算符的组合应该在这里工作:
bool pass = (bool) (d?["k"] ?? false);
澄清:
d
为null,则d?["k"]
为空 d?["k"]
为空,则d?["k"] ?? false
d?["k"] ?? false
为false
(盒装为object
) 另一种方法是在null-coalescing运算符之前进行转换,但是要转换为可以为null的类型:
bool pass = ((bool?) d?["k"]) ?? false;
请注意,在C#6中引入了空条件运算符。
我会问你为什么要把d [“k”]投给一个布尔。 要么它已经是一个bool,要么它应该被比作什么才能得到一个bool。 这会让事情更加清晰。
无论如何,我想这可行:
bool pass = (d != null) && d["k"] ?? false
是。 使d强类型化(例如使用Dictionary <>而不是Hashtable)
bool pass = d != null && d["k"];
如果我们知道d的类型会有所帮助!
这不短,但更可靠(也许更高效):
bool pass = false;
if (d != null)
{
object value;
if (d.TryGetValue("k", out value))
{
pass = value is bool && (bool)value;
}
}
我建议将它移动到一个函数中。
您可以将其替换为带有字典和键的函数调用...
我更愿意看到这样的事情:
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"]
我发现这比原始版本更容易理解。
在c#6及以上版本中,您可以使用
bool pass = (bool)(d?["k"] ?? false);
如果d [“k”]的编译时间类型是bool? 你可以省略演员
bool pass = d?["k"] ?? false;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.