如何在C#.NET 3.5中检查一个对象是否为null或空?

9
如果对象包含null或空,则如何验证或检查条件?
如何bool检查对象obj是否为null或Empty
我有以下代码:
class Program
{
    static void Main(string[] args)
    {
        object obj = null;

        double d = Convert.ToDouble(string.IsNullOrEmpty(obj.ToString()) ? 0.0 : obj);
        Console.WriteLine(d.ToString());
    }
}

使用此代码,我收到了 NullReference Exception 错误,错误信息为 Object reference not set to an instance of an object.

请帮忙。

我不理解这里......

如何验证该对象是否为空 (null) 或空字符串(Empty),而无需将其转换为 .ToString() ?

有没有一种方法可以检查相同的问题?


1
你不能将一个空对象转换为字符串,因此会出现错误。那么仅仅检查 if(obj != null) 有什么问题吗? - rikitikitik
1
为什么你会在一个你知道是null的对象上调用ToString()方法,从而导致NullReferenceException异常? - Andrew Barber
1
没有空对象这种东西(虽然有空字符串这种东西)。 - phoog
@phoog IsNullOrEmpty中的empty指的是一个没有任何字符的字符串。它的长度为0。 - Stefan H
或者,也许更好的问题是:你为什么想检查对象是否为空或为空? - phoog
显示剩余5条评论
7个回答

13
你遇到的问题是你的对象的类型是对象类型。为了使用string.IsNullOrEmpty进行评估,你应该将对象强制转换为(string)类型。
像这样:
```(string)yourObject```
static void Main(string[] args)
{
    object obj = null;

    double d = Convert.ToDouble(string.IsNullOrEmpty((string)obj) ? 0.0 : obj);
    Console.WriteLine(d.ToString());
}

这将有效,因为您没有在(不存在的)对象上明确调用.ToString。


假设obj是通过比简单地将其设置为null更复杂的过程生成的,那么在该过程产生一个不是字符串的真实对象的情况下,强制转换将失败。 - Adam Mihalcin
1
正确,这是假设在这种情况下对象要么为空,要么可以转换为字符串。 - Stefan H
从技术上讲,这假设对象可以转换为字符串,而不仅仅是转换。当 obj 实际上是 int 时,int.ToString() 可以工作,但 (string)int 失败,这对我来说是失败的。太糟糕了;我试图避免额外的 ToString()。 - goodeye

3
您之所以获取到null引用是因为您执行了obj.ToString(),该方法将返回obj的ToString() 方法返回值。问题在于在前一行中,您将obj设置为null,因此会出现“对象引用未...错误”。
若要使您的代码正常工作,您需要进行以下更改:
//This will check if it's a null and then it will return 0.0 otherwise it will return your obj.
double d = Convert.ToDouble(obj ?? 0.0); 

您现有的代码将始终为0.0。

没有空值合并:(??)

double d = Convert.ToDouble(obj ? 0.0 : obj);    

编辑

从评论中了解到,您想知道对象是否为null或空字符串。您可以先将其强制转换为字符串,而不是调用ToString方法,该方法执行完全不同的操作:

string objString = (obj as string);
double d = Convert.ToDouble(string.IsNullOrEmpty(objString) ? "0.0" : objString);      

如何验证对象是否为“null”或“empty”,而不需要转换为“.ToString()”? - venkat
就像你之前所做的那样,但是不要调用ToString方法。 - TBohnen.jnr
@TBohnen.jnr 无法强制转换为字符串;调用 ToString 不是强制转换。 - phoog
如果对象 objempty,那么如何进行验证? - venkat
在我的回答中粗体标出的“EDIT”之后?您想检查空字符串吗? - TBohnen.jnr
显示剩余4条评论

2
class Program
{
    static void Main(string[] args)
    {
        object obj = DBNull.Value;
        if(obj != DBNull.Value) {
            double d = Convert.ToDouble(obj);
            Console.WriteLine(d.ToString());
        }
    }
}

1

看起来你想要做的是这样的:

object obj = null;
double d;

if (!double.TryParse(Convert.ToString(obj), out d))
{
   d = 0.0;
}

但这个问题并没有太多意义。


1

我第一次听说“null-coalescing”运算符,很兴奋想更多地了解这个新的东西。您能否详细介绍一下在哪些情况下可以使用此运算符以及它的重要性和好处,并提供一些简单而好的示例? - venkat
如果对象是“空的”,那么如何进行验证? - venkat

0

以下代码可能是实现它更安全的方式。

if(obj != null && !string.IsNullOrEmpty(obj.ToString()))
{

}

这段代码可以避免对象成为非字符串类型。


.Value属性来自哪里? - Enigmativity
我的错..已经更新了..干杯,伙计! - Praveen Kumar Thalluri
顺便提一下,楼主确实要求“不要转换为.ToString()”。 - Enigmativity

0

你不应该对这段代码出现 NullReferenceException 感到意外。问题出在于

obj.ToString()

如果你写了

object obj = null;
string s = obj.ToString();

你会期望一个 NullReferenceException。由于调用 ToString 发生在调用 string.IsNullOrEmpty 之前,所以在检查 null 或空字符串之前就抛出了异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接