简体   繁体   中英

What is the correct way to check for "possibly null" references?

I have this bit of relevant code:

if (boardMap[i,j] != null) {
    Console.Write(boardMap[i,j].color.ToString() + " " + boardMap[i,j].type.ToString());    
}
else {
    Console.Write("X");
}

boardMap contains potentially null values, which is why I implemented the if statement checking if the boardMap[i,j] item is null. However, I get a warning in line 2 telling me that boardMap[i,j] is possibly null.
How do I fix this -> What is the correct way to do null checks like this?

(Please note, I am very much a beginner with dotnet and C#)

You can use pattern matching with empty property pattern :

if (boardMap[i,j] is {} map) 
{
    Console.Write(map.color.ToString() + " " + map.type.ToString());    
}
else
{
    Console.Write("X");
}

or introduce a variable:

var map = boardMap[i,j];
if (map != null) 
{
   ...
}

As of C# 8.0 and later, you can use the null-forgiving operator . Just append. after whatever might be null. It basically tells the compiler that it should turn off possibly null warnings for this occurrence.

if (boardMap[i,j] != null) {
    Console.Write(boardMap[i,j]!.color.ToString() + " " + boardMap[i,j]!.type.ToString());    
}
else {
    Console.Write("X");
}

Despite your if , the compiler is not able to infer that boardMap[i,j] won't be null, so it issues this warning.

You can deal generally with this kind of issues in different ways, depending on the version of C# you are using, and your personal preferences:

In a multithreaded app boardMap[i,j] could potentially be set to null 10 nanoseconds after you've checked it not to be null. That's (probably) why the compiler now complains. Of course it depends on your code. If you're sure that array is only handled by one thread, your null check is safe as is and you can just ignore the warning here.

An easy way to protect you code in a multithreaded scenario (without locking) is to assign the array value to a local variable. And do the null check and the Console.Write on that variable. Then the null check is safe. See post by @GuruStron

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