상세 컨텐츠

본문 제목

[C#] 구조체, 기본변수형등등 에 null (Nullable<T> 타입) 사용하기 관련

본문

반응형

 

 

 

=================================

=================================

=================================

 

 

 

 

 

 

 

 

public const int SZ_THeadPkt = 4;

    [Serializable]

    [StructLayout(LayoutKind.Sequential)]

    public class THeadPkt

    {

        [MarshalAs(UnmanagedType.U2, SizeConst = 2)]

        public ushort PktKind;

        [MarshalAs(UnmanagedType.U2, SizeConst = 2)]

        public ushort PktSize;

 

        public THeadPkt(ushort p1, ushort p2)

        {

            PktKind = p1;

            PktSize = p2;

        }

 

        public int Size()

        {

            return Marshal.SizeOf(typeof(THeadPkt));

        }

    }

 

 

이런 식으로 된경우....


THeadPkt? headPk = null;

 

이런식으로 null을 넣을수 있다.

 

 

=================================

=================================

=================================

 

 

 

출처: http://www.csharpstudy.com/csharp/CSharp-nullable.aspx

 

 

C#에서 정수, 부동자릿수, 구조체 등의 Value Type은 NULL을 가질 수 없다. 예를 들어, 정수 int i 가 있을 때 변수 i에는 null을 할당할 수 없으며, 따라서 변수 i는 어떤 값이 할당되지 않은 상태 (missing value)를 가질 수 없다.
만약 정수형 변수 i에 값이 설정되지 않은 상태를 할당하려면, 개발자는 2가지 방법을 사용할 수 있을 것이다. 즉, (1)프로그램에서 사용될 것 같지 않은 특정 값을 추정하여 할당하던지 (예를 들어, int i = int.MaxValue;) (2) 아니면 또 하나의 변수를 두어 변수 i가 missing임을 나타내게 할 수 있다 (예를 들어, bool iHasValue = false;). 이 두번째 방식이 Nullable의 기본 아이디어이다.

C# 에서는 Value Type에도 null을 할당할 수 있는 Nullable 타입을 지원한다. Nullable 타입은 Value 값을 갖고 있으면서 NULL 상태를 체크할 수 있는 기능(HasValue)을 함께 가지고 있는 struct 이다. 따라서 Nullable 타입은 struct(구조체)이므로 Value Type이다.

C#에서 int? 와 같이 해당 Value Type 뒤에 물음표를 붙이면, 해당 정수형 타입이 Nullable 정수형 타입임을 의미한다. 즉, 이 변수에는 NULL을 할당할 수 있다. C#의 이러한 특별한 문법은 .NET의 Nullable<T> 구조체로 컴파일시 변환된다. 즉, int?는 Nullable<int>와 동일하다. 


int? i = null;
bool? b = null;
int?[] a = new int?[100];

Nullable<T> 타입 

C#에서 int?, bool?, DateTime? 와 같은 T? 의 표현은 .NET의 Nullable<T>와 같은 표현이며, Nullable<T> 구조체는 값을 가지고 있는지를 체크하는 (즉, missing value가 아닌지를 체크하는) HasValue 속성과 실제 값을 나타내는 Value 속성을 가지고 있다. Nullable 구조체는 타입 캐스팅을 통한 변환이나 암묵적 변환을 통해 (Non-nullable) Value 타입으로 변환된다. 당연한 얘기지만, Value 타입이 아닌 레퍼런스 타입은 Nullable을 쓸 필요가 없는데, 그것은 모든 레퍼런스 타입은 이미 NULL을 허용하기 때문이다.
Nullable 타입이 실무에서 흔히 사용되는 케이스는 DB와 연동되는 Data Layer 클래스들을 들 수 있는데, 예를 들어 SQL 서버 테이블에서 NULL을 허용하는 숫자, 날짜, bool등의 컬럼이 있다면, 이 컬럼 타입은 Nullable 타입으로 변환되어 테이블의 NULL 속성을 표현하게 된다. 아래 예제는 다양한 종류의 Nullable 파라미터를 받아들여 HasValue로 NULL 값을 미리 체크한 후, .Value 속성을 써서 해당 타입의 실제 값을 사용하고 있다.

Nullable 타입과 연관되어 자주 사용되는 C#의 ?? 연산자는 ?? 앞의 파라미터가 NULL인 경우 연산자 뒤의 값을 할당할 때 사용한다. 


예제

double _Sum = 0; DateTime _Time; bool? _Selected;  public void CheckInput(int? i, double? d, DateTime? time, bool? selected) {     if (i.HasValue && d.HasValue)         this._Sum = (double)i.Value + (double)d.Value;      // time값이 있는 체크.     if (!time.HasValue)         throw new ArgumentException();     else         this._Time = time.Value;      // 만약 selected가 NULL이면 false를 할당     this._Selected = selected ?? false; } 

 

 

Nullable 정적 클래스 

.NET Framework에 있는 정적(static) 클래스 System.Nullable 은 두개의 Nullable 객체를 비교하거나 (Compare(), Equals() 메서드), 특정 Nullable 타입이 어떤 Value 타입에 기반을 두고 있는지 알아내는 (GetUnderlyingType() 메서드) 기능을 제공하고 있다. 이 정적 클래스는 Nullable<T> 타입을 위한 몇 가지 편리한 정적 메서드들을 제공한다. 

예제

void NullableTest() {     int? a = null;     int? b = 0;                 int result = Nullable.Compare<int>(a, b);     Console.WriteLine(result); //결과 -1      double? c = 0.01;     double? d = 0.0100;     bool result2 = Nullable.Equals<double>(c, d);     Console.WriteLine(result2); //결과 true } 
 

 

 

 

반응형

 

728x90

 

 

 

=================================

=================================

=================================

 

 

 

출처: https://docs.microsoft.com/ko-kr/dotnet/api/system.nullable-1?view=netframework-4.7.2

 

Nullable<T> Struct

정의

null에 할당할 수 있는 값 형식을 나타냅니다.

C#
[System.Serializable] public struct Nullable<T> where T : struct

형식 매개 변수

T

Nullable<T> 제네릭 형식의 내부 값 형식입니다.

상속
Nullable<T>
특성

예제

다음 코드 예제에서는 Microsoft Pubs 예제 데이터베이스에서 테이블의 3 개의 행을 정의합니다. Null을 허용 하지 않은 두 개의 열과 두 개의 열이 null을 허용 하는 테이블에 포함 되어 있습니다.

C#
using System;  class Sample  {     // Define the "titleAuthor" table of the Microsoft "pubs" database.      public struct titleAuthor      {       // Author ID; format ###-##-####       public string au_id;       // Title ID; format AA####       public string title_id;       // Author ORD is nullable.       public short? au_ord;       // Royalty Percent is nullable.       public int? royaltyper;     }      public static void Main()      {       // Declare and initialize the titleAuthor array.       titleAuthor[] ta = new titleAuthor[3];       ta[0].au_id = "712-32-1176";       ta[0].title_id = "PS3333";       ta[0].au_ord = 1;       ta[0].royaltyper = 100;            ta[1].au_id = "213-46-8915";       ta[1].title_id = "BU1032";       ta[1].au_ord = null;       ta[1].royaltyper = null;          ta[2].au_id = "672-71-3249";       ta[2].title_id = "TC7777";       ta[2].au_ord = null;       ta[2].royaltyper = 40;          // Display the values of the titleAuthor array elements, and        // display a legend.       Display("Title Authors Table", ta);       Console.WriteLine("Legend:");       Console.WriteLine("An Author ORD of -1 means no value is defined.");       Console.WriteLine("A Royalty % of 0 means no value is defined.");     }      // Display the values of the titleAuthor array elements.     public static void Display(string dspTitle,                                 titleAuthor[] dspAllTitleAuthors)     {       Console.WriteLine("*** {0} ***", dspTitle);       foreach (titleAuthor dspTA in dspAllTitleAuthors) {          Console.WriteLine("Author ID ... {0}", dspTA.au_id);          Console.WriteLine("Title ID .... {0}", dspTA.title_id);          Console.WriteLine("Author ORD .. {0}", dspTA.au_ord ?? -1);          Console.WriteLine("Royalty % ... {0}", dspTA.royaltyper ?? 0);          Console.WriteLine();              }     } } // The example displays the following output: //     *** Title Authors Table *** //     Author ID ... 712-32-1176 //     Title ID .... PS3333 //     Author ORD .. 1 //     Royalty % ... 100 //      //     Author ID ... 213-46-8915 //     Title ID .... BU1032 //     Author ORD .. -1 //     Royalty % ... 0 //      //     Author ID ... 672-71-3249 //     Title ID .... TC7777 //     Author ORD .. -1 //     Royalty % ... 40 //      //     Legend: //     An Author ORD of -1 means no value is defined. //     A Royalty % of 0 means no value is defined. 

설명

형식 값을 할당할 수 있습니다 하거나 지정할 수 있는 경우 null을 허용 하도록 이라고 null, 즉, 형식 값이 없음을 합니다. 기본적으로 모든 참조 형식의 경우와 같은 String는 null을 허용 하지만 모든 값 형식의 경우와 같은 Int32, 되지 않습니다.

C# 및 Visual Basic을 사용 하 여 null 허용으로 값 형식 표시는 ? 표기법 값 형식입니다. 예를 들어 int? C# 또는 Integer? Visual Basic에서 할당할 수 있는 정수 값 형식 선언 null합니다.

Nullable<T> 구조체 참조 형식은 디자인에서 null을 허용 하기 때문에 값 형식만 nullable 형식으로 사용할 수 있도록 지원 합니다.

합니다 Nullable 클래스에 대 한 보조 지원을 제공 합니다 Nullable<T> 구조입니다. Nullable 클래스는 nullable 형식의 내부 형식 가져오기 지원 하며 같음 및 비교 작업 쌍 내부 값 형식이 nullable 형식에 제네릭 같음 및 비교 작업을 지원 하지 않습니다.

기본 속성

두 기본 멤버를 Nullable<T> 구조는 합니다 HasValue 및 Value 속성입니다. 경우는 HasValue 에 대 한 속성을Nullable<T> 개체가 true, 개체의 값을 사용 하 여 액세스할 수 있습니다는 Value 속성. 경우는 HasValue 속성은 false, 개체의 값이 정의 되지 않습니다 및 액세스 하려고 합니다 Value 속성은 InvalidOperationException.

 

=================================

=================================

=================================

 

 

반응형


관련글 더보기

댓글 영역