2010-10-20 116 views
2

我正在使用一些运行SQL查询作为参考的旧代码。c#Object obj的值是{}。什么是 ”{}”?

在某些时候,它得到的东西,如:

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投射解决了这个问题。

然后当int类型为没有条目为obj[fieldName]时出现另一个问题。当我通过调试器时,惊奇地发现obj不是null。在VS中,鼠标悬停显示它的值为{}

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

(在旧的代码,它出现在这种情况下返回.ToString()""按预期方式工作。)

回答

5

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

如果您将鼠标悬停在obj[fieldName]之上,并且没有fieldName的条目,调试器将不会在意这一点,它将显示值obj。您将不得不使用立即窗口或手表/ quickwatch。调试器只会看到你悬停在obj上,并假定你指的是数组本身,而不是指定索引处数组的内容。

+0

而且'obj == Object.Empty'测试没有'Object.Empty'吗?或者我可以创建一个'Object comparableEmpty = new Object()'? – Kache 2010-10-20 22:00:28

+0

不,因为'Object'是一个引用类型,这意味着如果它存在,比较Object.Empty到你自己的对象将永远是错误的。您可以使用'myObj.GetType().GetProperties()。Count == 0'或其一些变体,尽管开销可能不值得。 – 2010-10-20 22:03:22

+0

感觉有点愚蠢如何没有一个优雅的解决方案。如果它是一个引用类型,引用应该只是'null',就像一个很好的引用。 – Kache 2010-10-20 22:06:38

相关问题