C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
Info: On success, the newly-typed variable is available. In the program, variable3 is now a string.
And: We can use it just like any other string, like the original variable1. There is no difference.
Null: When you try an incompatible cast, such as with the StringBuilder type, the result of the casting expression is null.
NullC# program that uses as-casts
using System;
using System.Text;
class Program
{
static void Main()
{
// Create a string variable and cast it to an object.
string variable1 = "carrot";
object variable2 = variable1;
// Try to cast it to a string.
string variable3 = variable2 as string;
if (variable3 != null)
{
Console.WriteLine("have string variable");
}
// Try to cast it to a StringBuilder.
StringBuilder variable4 = variable2 as StringBuilder;
if (variable4 != null)
{
Console.WriteLine("have StringBuilder variable");
}
}
}
Output
have string variable
Note: We try to use the null List, which causes an exception. A method cannot be called on a null instance.
Null ListNullReferenceExceptionC# program that causes NullReferenceException
using System.Collections.Generic;
class Program
{
static void Main()
{
string value = "cat";
object temp = value;
List<string> list = temp as List<string>;
list.Add("dog");
}
}
Output
Unhandled Exception: System.NullReferenceException:
Object reference not set to an instance of an object.
Version 1: In this version of the code, we test an explicit reference type cast. We cast to the StringBuilder type from an object.
Version 2: Here we use the as-cast. We convert the object reference to a StringBuilder.
Result: In 2020, both casts perform about the same. So we can use whichever is clearest, or use the one with the best error handling.
C# program that times casting expressions
using System;
using System.Diagnostics;
using System.Text;
class Program
{
const int _max = 1000000000;
static void Main()
{
StringBuilder builder = new StringBuilder();
object item = (object)builder;
// Version 1: use cast.
var s1 = Stopwatch.StartNew();
for (int i = 0; i < _max; i++)
{
StringBuilder build = (StringBuilder)item;
if (build == null)
{
throw new Exception();
}
}
s1.Stop();
// Version 2: use as-cast.
var s2 = Stopwatch.StartNew();
for (int i = 0; i < _max; i++)
{
StringBuilder build = item as StringBuilder;
if (build == null)
{
throw new Exception();
}
}
s2.Stop();
Console.WriteLine(((double)(s1.Elapsed.TotalMilliseconds * 1000000) /
_max).ToString("0.00 ns"));
Console.WriteLine(((double)(s2.Elapsed.TotalMilliseconds * 1000000) /
_max).ToString("0.00 ns"));
}
}
Output
0.81 ns Cast
0.81 ns As-cast
However: The isinst instruction is followed by further instructions. These store the local variable that was received by the ininst code.
And: By storing the local variable, the as-cast results in the overall reduction of cast instructions.
IL