Code inspection: Type check and casts can be merged
The type-testing is operator in its classical form (Expression is Type
) returns true
only when the runtime type of Expression
is compatible with Type
and the result of Expression
is not null
.
When we use is
to check the compatibility before casting, like in the below example, we have at least two problems:
We make the type check twice for no reason, which can affect performance if we do it inside a loop.
The fact that the program execution will not get into the
if
statement ifobj
isnull
is not immediately clear for those who read this code.
ReSharper suggests fixing this code in two different ways.
Use a pattern matching variable
Starting with C# 7.0, we can use the is
operator much more elegantly to combine type testing with initialization of a variable: Expression is Type variable
. Applying this to our example, we'll get the following:
Separate type testing and checking for null
We can also rewrite our code using a safe cast with the as operator and then a null check. This way we'll have one cast instead of two as well as a better separation of concerns: