如何在有机会抛出异常之前将null值转换为string.empty?

时间:2012-09-27 18:49:17

标签: c# winforms datagridview nullreferenceexception datagridviewtextboxcell

我有以下代码将以前的值输入DataGridView单元格。如果在第0行和第2列或更大,则为左边的val,否则直接在上面的值:

private void dataGridViewPlatypi_CellEnter(object sender, DataGridViewCellEventArgs args)
{
    // TODO: Fails if it sees nothing in the previous cell
    string prevVal = string.Empty;
    if (args.RowIndex > 0)
    {
        prevVal = dataGridViewPlatypi.Rows[args.RowIndex - 1].Cells[args.ColumnIndex].Value.ToString();
    } else if (args.ColumnIndex > 1)
    {
        prevVal = dataGridViewPlatypi.Rows[args.RowIndex].Cells[args.ColumnIndex-1].Value.ToString();
    }
    dataGridViewPlatypi.Rows[args.RowIndex].Cells[args.ColumnIndex].Value = prevVal;
}

只要有值要查看和复制,这就很有效。但是如果单元格是空白的,我会得到:

  

System.NullReferenceException未被用户代码
处理   Message =对象引用未设置为对象的实例。

我猜这是使用null coalesce运算符的机会,但是(假设我的猜测很好),我该如何实现呢?

3 个答案:

答案 0 :(得分:5)

尝试这样的事情:

string s = SomeStringExpressionWhichMightBeNull() ?? "" ;

容易!

答案 1 :(得分:3)

假设 Value 是null(你的帖子中不完全清楚)你可以做

object cellValue = 
    dataGridViewPlatypi.Rows[args.RowIndex - 1].Cells[args.ColumnIndex].Value;
prevValue = cellValue == null ? string.Empty : cellValue.ToString()

答案 2 :(得分:3)

使用如下方法:

public static class MyExtensions
{
    public static string SafeToString(this object obj)
    {
        return (obj ?? "").ToString();
    }
}

然后你就可以使用它:

object obj = null;

string str = obj.SafeToString();

或作为代码中的示例:

prevVal = dataGridViewPlatypi.Rows[args.RowIndex - 1].Cells[args.ColumnIndex].Value.SafeToString();

这会创建一个扩展方法,因此如果为扩展类所在的名称空间添加using,则所有对象中的SafeToString方法在intellisense中都会显示null方法。该方法实际上不是一个实例方法,它只显示为一个,因此如果对象为null,它不会生成空引用异常,而只是将{{1}}传递给方法,该方法将所有空值视为空字符串。