繁体   English   中英

C#中的null简写?

[英]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"] ?? falsefalse (盒装为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM