【问题标题】:C# ? operator syntaxC# ?运算符语法
【发布时间】:2012-12-04 09:03:17
【问题描述】:

一个简单的问题:

在C#中有这种操作的语法吗:

  • 如果条件,返回对象本身:默认值

就像下面的例子一样,但我不想对 myObject 进行两次评估(这可能是一些更复杂的事情,比如数据库查询):

int myVar = (myObject == DBNull.Value ? 0 : (int)myObject);

我知道在检查 null 时有这样的语法(如下例所示),但是在这种情况下是否可以检查任何不同的值,例如 DBNull.Value?

int myVar = Convert.ToInt32(myObject ?? 0);

【问题讨论】:

    标签: c# operators


    【解决方案1】:

    没有:

    int myVar = myObject == DBNull.Value ? 0 : (int)myObject;
    

    是你能做到的最好的。它不会因为对象被提及两次而对它进行两次评估。

    当然还是把它包装在一个函数中:

    int myVar = DBObjectToInt(myObject);
    
    public static int DBObjectToInt(object dbObj)
    {
      return dbObj == DBNull.Value ? 0 : (int)dbObj;
    }
    

    另一种选择是在您的 SQL 中使用 Coalesce,这样一开始您甚至不会得到 DBNull。

    【讨论】:

    • 所以你说这不会是 db-query 的两倍: int i =(dt.Compute("MAX( Column )", string.Empty) == DBNull.Value ? 0 : dt.Compute("MAX( Column )", string.Empty));
    • 我知道我可以将它存储在一个临时变量中,但我希望我可以在一行代码中完成所有这些:)
    • 是的,但我认为myObject 是变量的名称。所以你已经完成了var myObject = dt.Compute("MAX( Column )", string.Empty);
    • 可以使用int myVar = DBObjectToInt(dt.Compute("MAX( Column )", string.Empty));函数
    • 另一种选择是在你的 SQL 中使用Coalesce,所以你甚至不会得到DBNull
    【解决方案2】:

    您不必对对象进行两次评估。评估对象,将其存储在变量中,然后检查结果变量。

    您的问题的答案是否定的,您不能随心所欲地用 C# 创建自己的迷你语言。最常见的操作有快捷方式,但自定义的三元一元运算符不是。

    【讨论】:

    • 我知道我可以将它存储在一个临时变量中,但我希望我可以在一行代码中完成所有这些:)
    猜你喜欢
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2017-08-04
    • 2013-05-19
    • 2012-02-28
    相关资源
    最近更新 更多