【问题标题】:c# Object obj's value is {}. What is "{}"?c# Object obj 的值为 {}。什么是 ”{}”?
【发布时间】:2010-10-20 21:54:29
【问题描述】:

我正在使用一些运行 sql 查询的旧代码作为参考。

在某些时候,它会变成这样:

sqlDataAdapter.Fill(dataSet);
DataRow dataRow = dataSet.Tables[0].Rows[0];
Object obj = dataRow[fieldName];

旧代码是这样的:

string output;
if (!string.IsNullOrEmpty(obj.ToString())) { output = obj.ToString(); }
else { output = "Not Available"; }

我把它们改成:

output = obj as string ?? "Not Available"

但有时,它会坏掉。正如我所怀疑的,当条目是int 时,它正在发生中断。在这些情况下转换为 int 解决了这个问题。

obj[fieldName] int 类型的no 条目出现时,又出现了另一个问题。当我单步调试调试器时,我惊讶地发现obj 不是null。在 VS 中,鼠标悬停显示它有一个值 {}

{} 到底是什么?如何对其进行布尔测试?

(在旧代码中,在这种情况下,.ToString() 返回"" 并按预期工作。)

【问题讨论】:

    标签: c# sql object null


    【解决方案1】:

    {} 是打开和关闭大括号,象征着对象的开始和结束。因此,一个没有特殊属性的空对象被简写为{}。调试器使用此表示法帮助您直观地区分空对象、空字符串和 null。

    如果您将鼠标悬停在obj[fieldName] 上并且没有fieldName 的条目,则调试器不会关心它,它会显示obj 的值。您必须使用 immediate 窗口或手表/快速手表。调试器只会看到您将鼠标悬停在 obj 上,并假定您指的是数组本身,而不是指定索引处的数组内容。

    【讨论】:

    • 没有Object.Empty 用于obj == Object.Empty 测试?或者我可以创建一个Object comparableEmpty = new Object()吗?
    • 不,因为Object 是一个引用类型,这意味着如果它存在,将 Object.Empty 与您自己的对象进行比较总是错误的。您可以使用myObj.GetType().GetProperties().Count == 0 或其一些变体,尽管开销可能不值得。
    • 感觉有点愚蠢,没有一个优雅的解决方案。如果它是引用类型,则引用应该只是 null 就像一个很好的小引用。
    • 任何空数组都不为空。我认为你对一些基本的事情有根本的误解。我会尝试用更多信息更新我的答案。
    • 我已经弄清楚我需要做什么。 obj.getType().Equals(System.DBNull.Value)。在我的问题中,我说当条目为空时,我需要一个布尔值来处理控制流。
    【解决方案2】:

    万一有人再次遇到这个问题。

    如果在调试模式下显示 val 对象的解决方案{}

    // Check if its not null or empty
    if (!IsNullOrEmpty(val.ToString().ToArray()))
    {
        // Do something with val
        dt.Rows.Add(val);
    }
    
    public static bool IsNullOrEmpty<T>(T[] array)
    {
        return array == null || array.Length == 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-19
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 2012-04-27
      • 1970-01-01
      • 2016-09-15
      相关资源
      最近更新 更多