C#中的null简写?

时间:2009-07-06 13:23:21

标签: c# null

有没有办法缩短这条线?

bool pass = d != null && d["k"] != null && (bool)d["k"];

注意:“k”实际上是“更长的id”;我替换它以使其在这篇文章中更具可读性。您的许多建议都不会检查d是否为空。

13 个答案:

答案 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"] ?? falsefalse(标记为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;