C# Language
Null 가능 유형
수색…
통사론
-
Nullable<int> i = 10;
- int? j = 11;
- int? k = null;
- 날짜 시간? DateOfBirth = DateTime.Now;
- 소수? 양 = 1.0m;
- 부울? IsAvailable = true;
- 숯? 편지 = 'a';
- (유형)? variableName
비고
Nullable 유형은 null
뿐만 아니라 기본 유형의 모든 값을 나타낼 수 있습니다.
구문 T?
Nullable<T>
줄임말입니다.
Nullable 값은 실제로 System.ValueType
객체이므로 boxed 및 unbox 될 수 있습니다. 또한, null
null 인 객체의 값은 동일하지 않다 null
단지 플래그있어, 기준 물체의 값.
Nullable 개체 boxing 때 null 값은 null
참조로 변환되고 null
아닌 값은 Nullable 기본 형식으로 변환됩니다.
DateTime? dt = null;
var o = (object)dt;
var result = (o == null); // is true
DateTime? dt = new DateTime(2015, 12, 11);
var o = (object)dt;
var dt2 = (DateTime)dt; // correct cause o contains DateTime value
두 번째 규칙은 올바르지 만 역설적 인 코드로 연결됩니다.
DateTime? dt = new DateTime(2015, 12, 11);
var o = (object)dt;
var type = o.GetType(); // is DateTime, not Nullable<DateTime>
짧은 형태로 :
DateTime? dt = new DateTime(2015, 12, 11);
var type = dt.GetType(); // is DateTime, not Nullable<DateTime>
nullable 초기화하기
null
값 :
Nullable<int> i = null;
또는:
int? i = null;
또는:
var i = (int?)null;
null이 아닌 값의 경우 :
Nullable<int> i = 0;
또는:
int? i = 0;
Nullable에 값이 있는지 확인하십시오.
int? i = null;
if (i != null)
{
Console.WriteLine("i is not null");
}
else
{
Console.WriteLine("i is null");
}
다음과 같은 :
if (i.HasValue)
{
Console.WriteLine("i is not null");
}
else
{
Console.WriteLine("i is null");
}
nullable 형식의 값 가져 오기
다음과 같이 nullable int
감안할 때
int? i = 10;
기본값이 필요하면 할당 이전에 널 통합 연산자 , GetValueOrDefault
메소드 또는 nullable int HasValue
를 검사하여 하나를 지정할 수 있습니다.
int j = i ?? 0;
int j = i.GetValueOrDefault(0);
int j = i.HasValue ? i.Value : 0;
다음 용도는 항상 안전하지 않습니다 . 경우 i
런타임에 널하는 System.InvalidOperationException
발생합니다. 디자인 타임에 값을 설정하지 않으면 Use of unassigned local variable 'i'
오류가 발생합니다.
int j = i.Value;
nullable에서 기본값 가져 오기
.GetValueOrDefault()
메서드는 .HasValue
속성이 false 인 경우에도 값을 반환합니다 (예외를 throw하는 Value 속성과 달리).
class Program
{
static void Main()
{
int? nullableExample = null;
int result = nullableExample.GetValueOrDefault();
Console.WriteLine(result); // will output the default value for int - 0
int secondResult = nullableExample.GetValueOrDefault(1);
Console.WriteLine(secondResult) // will output our specified default - 1
int thirdResult = nullableExample ?? 1;
Console.WriteLine(secondResult) // same as the GetValueOrDefault but a bit shorter
}
}
산출:
0
1
제네릭 형식 매개 변수가 nullable 형식인지 확인하십시오.
public bool IsTypeNullable<T>()
{
return Nullable.GetUnderlyingType( typeof(T) )!=null;
}
nullable 유형의 기본값은 null입니다.
public class NullableTypesExample
{
static int? _testValue;
public static void Main()
{
if(_testValue == null)
Console.WriteLine("null");
else
Console.WriteLine(_testValue.ToString());
}
}
산출:
없는
기본 Nullable의 효과적인 사용 논의
nullable 유형은 제네릭 유형입니다. nullable 유형은 값 유형입니다.
리플렉션 / 코드 생성과 관련된 코드를 만들 때 Nullable.GetUnderlyingType 메서드의 결과를 효과적으로 사용할 수있는 몇 가지 트릭이 있습니다.
public static class TypesHelper {
public static bool IsNullable(this Type type) {
Type underlyingType;
return IsNullable(type, out underlyingType);
}
public static bool IsNullable(this Type type, out Type underlyingType) {
underlyingType = Nullable.GetUnderlyingType(type);
return underlyingType != null;
}
public static Type GetNullable(Type type) {
Type underlyingType;
return IsNullable(type, out underlyingType) ? type : NullableTypesCache.Get(type);
}
public static bool IsExactOrNullable(this Type type, Func<Type, bool> predicate) {
Type underlyingType;
if(IsNullable(type, out underlyingType))
return IsExactOrNullable(underlyingType, predicate);
return predicate(type);
}
public static bool IsExactOrNullable<T>(this Type type)
where T : struct {
return IsExactOrNullable(type, t => Equals(t, typeof(T)));
}
}
사용법 :
Type type = typeof(int).GetNullable();
Console.WriteLine(type.ToString());
if(type.IsNullable())
Console.WriteLine("Type is nullable.");
Type underlyingType;
if(type.IsNullable(out underlyingType))
Console.WriteLine("The underlying type is " + underlyingType.Name + ".");
if(type.IsExactOrNullable<int>())
Console.WriteLine("Type is either exact or nullable Int32.");
if(!type.IsExactOrNullable(t => t.IsEnum))
Console.WriteLine("Type is neither exact nor nullable enum.");
산출:
System.Nullable`1[System.Int32]
Type is nullable.
The underlying type is Int32.
Type is either exact or nullable Int32.
Type is neither exact nor nullable enum.
추신. NullableTypesCache
는 다음과 같이 정의됩니다.
static class NullableTypesCache {
readonly static ConcurrentDictionary<Type, Type> cache = new ConcurrentDictionary<Type, Type>();
static NullableTypesCache() {
cache.TryAdd(typeof(byte), typeof(Nullable<byte>));
cache.TryAdd(typeof(short), typeof(Nullable<short>));
cache.TryAdd(typeof(int), typeof(Nullable<int>));
cache.TryAdd(typeof(long), typeof(Nullable<long>));
cache.TryAdd(typeof(float), typeof(Nullable<float>));
cache.TryAdd(typeof(double), typeof(Nullable<double>));
cache.TryAdd(typeof(decimal), typeof(Nullable<decimal>));
cache.TryAdd(typeof(sbyte), typeof(Nullable<sbyte>));
cache.TryAdd(typeof(ushort), typeof(Nullable<ushort>));
cache.TryAdd(typeof(uint), typeof(Nullable<uint>));
cache.TryAdd(typeof(ulong), typeof(Nullable<ulong>));
//...
}
readonly static Type NullableBase = typeof(Nullable<>);
internal static Type Get(Type type) {
// Try to avoid the expensive MakeGenericType method call
return cache.GetOrAdd(type, t => NullableBase.MakeGenericType(t));
}
}