简体   繁体   中英

Checking for null before ToString()

Here's the scenario...

if (entry.Properties["something"].Value != null)
  attribs.something = entry.Properties["something"].Value.ToString();

While effective and working correctly, this looks ugly to me. If I don't check for a null before performing the ToString() then it throws an exception if the property was null. Is there a better way to handle this scenario?

Much appreciated!

Update 8 years later (wow!) to cover c# 6's null-conditional operator :

var value = maybeNull?.ToString() ?? ""

Other approaches:

object defaultValue = "default";
attribs.something = (entry.Properties["something"].Value ?? defaultValue).ToString()

I've also used this, which isn't terribly clever but convenient:

public static string ToSafeString(this object obj)
{
    return (obj ?? string.Empty).ToString();
}

If you are targeting the .NET Framework 3.5, the most elegant solution would be an extension method in my opinion.

public static class ObjectExtensions
{
    public static string NullSafeToString(this object obj)
    {
        return obj != null ? obj.ToString() : String.Empty;
    }
}

Then to use:

attribs.something = entry.Properties["something"].Value.NullSafeToString();
Convert.ToString(entry.Properties["something"].Value);

Adding an empty string to an object is a common idiom that lets you do null-safe ToString conversion, like this:

attribs.something = ""+entry.Properties["something"].Value;

When entry.Properties["something"].Value is null , this quietly returns an empty string .

Edit: Starting with C# 6 you can use ?. operator to avoid null checking in an even simpler way:

attribs.something = entry.Properties["something"].Value?.ToString();
//                                                     ^^
attribs.something = String.Format("{0}", entry.Properties["something"].Value);

虽然不确定性能......

你不能这样做:

attribs.something = entry.Properties["something"].Value as string;

In C# 6.0 you can do it in a very elegant way:

attribs.something = entry.Properties["something"].Value?.ToString();

And here is an article about new null-conditional operator .

attribs.something  = string.Format("{0}",entry.Properties["something"].Value)

Is it somehow possible to do something like Dale Ragan's answer above , but overriding ToString() instead of creating a new NullSafeToString() method? I'd like this (or returning "null") to be the default behaviour. The compiler (Visual C# 2010 Express) doesn't complain when I add the following method to public static class ObjectExtensions, but the method doesn't get called...

public static String ToString(this Object obj)
{
    if (obj == null)
    {
        return "null";
    }
    else
    {
        return obj.GetType().Name;
    }
}

As a variation to RexM's answer:

attribs.something = (entry.Properties["something"].Value ?? attribs.something).ToString()

The only downside would be that the attribs.something would be assigned a value (itself, in this example) even if entry.Properties["something"].Value was null - which could be expensive if the .something property did some other processing and/or this line executes a lot (like in a loop).

To do precisely what you're trying to do a helper method can always be used:

CopyIfNotNull(entry.Properties["something"].Value, out attribs.something);

void CopyIfNotNull(string src, out string dest)
{
  if(src != null)
    dest = src;
}

How about using an auxiliary method like this:

attribs.something = getString(
    entry.Properties["something"].Value, 
    attribs.something);

static String getString(
    Object obj,
    String defaultString)
{
    if (obj == null) return defaultString;
    return obj.ToString();
}

Alternatively, you could use the ?? operator:

attribs.something = 
    (entry.Properties["something"].Value ?? attribs.something).ToString();

(note the redundant ToString() call when the value is null )

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM