Tuesday, 20 September 2016

c# - Direct casting vs 'as' operator?



Consider the following code:



void Handler(object o, EventArgs e)
{
// I swear o is a string
string s = (string)o; // 1

//-OR-
string s = o as string; // 2
// -OR-
string s = o.ToString(); // 3
}


What is the difference between the three types of casting (okay, the 3rd one is not a casting, but you get the intent). Which one should be preferred?


Answer



string s = (string)o; // 1



Throws InvalidCastException if o is not a string. Otherwise, assigns o to s, even if o is null.



string s = o as string; // 2


Assigns null to s if o is not a string or if o is null. For this reason, you cannot use it with value types (the operator could never return null in that case). Otherwise, assigns o to s.



string s = o.ToString(); // 3



Causes a NullReferenceException if o is null. Assigns whatever o.ToString() returns to s, no matter what type o is.






Use 1 for most conversions - it's simple and straightforward. I tend to almost never use 2 since if something is not the right type, I usually expect an exception to occur. I have only seen a need for this return-null type of functionality with badly designed libraries which use error codes (e.g. return null = error, instead of using exceptions).



3 is not a cast and is just a method invocation. Use it for when you need the string representation of a non-string object.


No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...