I\'d like to have an integer variable which can be set to null and don\'t want to have to use the int? myVariable
syntax. I tried using int
and
Yes, it's the only way, as Int32/Int16/int is a primitive type (regardless of boxing/unboxing of these).
The <var>?
syntax makes it nullable. If you dig a bit deeper, you'll see it's just a generic object that gets used.
If you want to do it like C++ you must use unsafe operations. Then, pointers like in C are available, but your code doesn't conform to CLR...
For using pure .NET without pointers, the ?
is the way to go.
Nullable types are instances of the System.Nullable(T) struct.
Therefore int, int?, Nullable<int> are all value types, not reference types
You could use System.Nullable<int>
if you hate ?
so much.
You will have to use a nullable type, i.e:
Nullable<int> or int?
The purpose of nullable type is, to enable you to assign null to a value type.
From MSDN:
Nullable types address the scenario where you want to be able to have a primitive type with a null (or unknown) value. This is common in database scenarios, but is also useful in other situations.
In the past, there were several ways of doing this:
- A boxed value type. This is not strongly-typed at compile-time, and involves doing a heap allocation for every type.
- A class wrapper for the value type. This is strongly-typed, but still involves a heap allocation, and the you have to write the wrapper.
- A struct wrapper that supports the concept of nullability. This is a good solution, but you have to write it yourself.
For info, int?
/ Nullable<T>
is not a reference-type; it is simply a "nullable type", meaning: a struct (essentially and int
and a bool
flag) with special compiler rules (re null checks, operators, etc) and CLI rules (for boxing/unboxing). There is no "integer reference-type" in .NET, unless you count boxing:
int i = 123;
object o = i; // box
but this creates an unnecessary object and has lots of associated other issues.
For what you want, int?
should be ideal. You could use the long-hand syntax (Nullable<int>
) but IMO this is unnecessarily verbose, and I've seen it confuse people.