【问题标题】:C# syntax understanding Oracle Connection ProjectC#语法理解 Oracle Connection Project
【发布时间】:2012-12-07 12:59:08
【问题描述】:

我必须修改一个适用于 Oracle 的 Visual Studio 2010 C# 项目,查看一些代码我发现了一个函数,该函数返回一个 List<>,其值从数据库存储过程(光标)加载

while (myIDataReader.Read())
{
    // OK
    myTable.myStringField = myIDataReader["TableStringField"].ToString();
    // ¿?
    myTable.myIntField =
    Convert.ToInt32((myIDataReader["TableIntField"] == DBNull.Value) ? null : myIDataReader["myTableField"]);
}

一切正常,只是想知道,分配myTable.myIntField时给出的条件是什么,我知道这个列可以为空,但是我不明白语法,如果有人能解释一下,我将不胜感激

【问题讨论】:

    标签: c# ternary-operator


    【解决方案1】:

    你说的是这条线?

    myTable.myIntField =
    Convert.ToInt32((myIDataReader["TableIntField"] == DBNull.Value) ? null : myIDataReader["myTableField"]);
    

    如果你把这个语句拆开,你就会得到一种条件,通常称为三元运算符explained here

    conditional ? if_true_do_this : if_false_do_this
    

    这实际上只是一种不同的语法:

    if(conditional) {
        if_true_do_this;
    } else {
        if_false_do_this
    }
    

    之后,它只是将结果传递给Convert.ToInt32(),以将其从string 转换为int

    所以这行代码只是一个更简洁的版本:

    if(myIDataReader["TableIntField"] == DBNull.Value)
    {
        myTable.myIntField = Convert.ToInt32(null);
    }
    else
    {
        myTable.myIntField = Convert.ToInt32(myIDataReader["myTableField"]);
    }
    

    【讨论】:

      【解决方案2】:

      上面的语法可以正常工作,意思是:

      TableIntField 可能包含数据库空值。
      这在 NET 中通过 DBNull 对象及其值字段表示。

      代码通过 C# ternary operator 检查TableIntField 是否包含DBNull.Value
      如果检查结果为真,则将 null 用作 Convert.ToInt32 的参数,根据MSDN documentation,这会导致分配给 myTable.myIntField 的值为零。

      【讨论】:

        猜你喜欢
        • 2020-12-11
        • 1970-01-01
        • 1970-01-01
        • 2020-11-11
        • 1970-01-01
        • 2011-02-15
        • 2010-10-31
        • 2013-11-11
        • 1970-01-01
        相关资源
        最近更新 更多