유형 다음에 물음표의 목적은 무엇입니까 (예 : int? myVariable)?


433

일반적으로 물음표의 주요 용도는 조건부 x ? "yes" : "no"입니다.

그러나 다른 용도로 보았지만 ?예를 들어 연산자 사용에 대한 설명을 찾을 수 없습니다 .

public int? myProperty
{
   get;
   set;
}

답변:


437

해당 값 유형이 널 입력 가능 유형 임을 의미합니다.

널 입력 가능 유형은 System.Nullable 구조체의 인스턴스입니다. 널 입력 가능 유형은 기본 값 유형에 대한 올바른 값 범위와 추가 널 값을 나타낼 수 있습니다. 예를 들어 Nullable<Int32>"Nullable of Int32"로 발음되는 -2147483648에서 2147483647 사이의 값을 지정하거나 null 값을 지정할 수 있습니다. A에 Nullable<bool>true, false 또는 null 값을 할당 할 수 있습니다. 숫자 및 부울 유형에 널을 지정하는 기능은 값이 지정되지 않은 요소가 포함 된 데이터베이스 및 기타 데이터 유형을 처리 할 때 특히 유용합니다. 예를 들어, 데이터베이스의 부울 필드는 true 또는 false 값을 저장하거나 정의되지 않을 수 있습니다.

class NullableExample
{
  static void Main()
  {
      int? num = null;

      // Is the HasValue property true?
      if (num.HasValue)
      {
          System.Console.WriteLine("num = " + num.Value);
      }
      else
      {
          System.Console.WriteLine("num = Null");
      }

      // y is set to zero
      int y = num.GetValueOrDefault();

      // num.Value throws an InvalidOperationException if num.HasValue is false
      try
      {
          y = num.Value;
      }
      catch (System.InvalidOperationException e)
      {
          System.Console.WriteLine(e.Message);
      }
  }
}

3
구조체에 사용됩니다. 실제로 수업에 유용하다고 생각하지 마십시오.
MonsieurDart

8
@MonsieurDart-답변이 "값 유형"이라고 말하는 이유
Sean

3
@AntoineDahan-값 유형은 정의 할 수 없으므로 널 입력 가능 유형이 없습니다. 예를 들어 int유형과 해당 Integer클래스 가있는 Java를 생각하고 있다고 생각합니다 .
Sean

2
nullable 유형에 대한 최신 (2015) 문서는 여기
공룡


118

의 속기입니다 Nullable<int>. Nullable<T>값 유형을로 설정하는 데 사용됩니다 null. 값 유형은 일반적 으로 null 일 수 없습니다 .


3
속기라는 용어를 사용하기위한 하나 더하기, 꽤 똑바로!
Hari

3
두 번째 문장은 저를 혼란스럽게합니다. "할 수 없음"은 무슨 뜻입니까? 컴파일러 수준 또는 응용 프로그램 컨텍스트에서.
problemofficer 2016 년

5
정의당 @problemofficer은 value typesnull 일 수 없습니다. 값을 구체적으로 할당하지 않고 int 또는 bool (값 유형)을 선언하면 여전히 값 (각각 0과 false)을 갖습니다. 그들은 null이 아니다. reference types반면에 object 또는 MyClass와 같은 할당되지 않은 경우 null이됩니다. 값 유형과 참조 유형의 차이점을 읽으십시오.
클라우스 비 스코프 페데르센

설명 감사합니다. 지금은 이해.
problemofficer

62

x ? "yes" : "no"

? if 문장을 선언합니다 . 여기에서 x 는 부울 조건을 나타냅니다. : 앞의 부분 은 then 문장이고 이후 부분은 else 문장입니다.

예를 들어

int?

? nullable 형식을 선언하고 형식이 null 형식 일 수 있음을 의미합니다.


9
'?'사이에 어떤 관계도 보이지 않습니다 널 입력 가능 유형 및 삼항 표현식 선언. 대답을 아래로 투표하십시오.
거스 크로포드

36
Gus의 위 의견에 동의하지 않습니다. 이 질문은 삼항식과 혼동 될 수 있음을 보여줍니다. 이 답변은이 문제를 해결합니다.
Mario Levesque 2016 년

이런 종류의 널 비교를 어디에서 사용 하시겠습니까? 반품 안에는 허용되지 않는 것 같습니다. return value ? value : "isNull";그것이 string valuebool로 변환 할 수 없다는 것을 알려줍니다 .
C4d

나는
FastTrack

이것이 정답입니다. 명확하고 정확하기 때문에. +1
JP Dolocanog

49

널 입력 가능 유형

널 입력 가능 유형은 System.Nullable 구조체의 인스턴스입니다. 널 입력 가능 유형은 기본 값 유형의 정상 값 범위와 추가 널 값을 나타낼 수 있습니다 . 예를 들어, Nullable<Int32>"Nullable of Int32"로 발음 되는 [ ]에 -2147483648에서 2147483647 사이의 값을 지정하거나 널값을 지정할 수 있습니다. [ Nullable<bool>]에 true 또는 false 또는 null 값을 지정할 수 있습니다. 숫자 및 부울 유형에 널을 지정하는 기능은 값이 지정되지 않은 요소를 포함하는 데이터베이스 및 기타 데이터 유형을 처리 할 때 특히 유용합니다. 예를 들어, 데이터베이스의 부울 필드는 true 또는 false 값을 저장하거나 정의되지 않을 수 있습니다.



6

실제 사용법 :

public string someFunctionThatMayBeCalledWithNullAndReturnsString(int? value)
{
  if (value == null)
  {
    return "bad value";
  }

  return someFunctionThatHandlesIntAndReturnsString(value);
}

1
질문이 제기 된 지 5 년이 지난 후에도 OP가 여전히 활성화되어 있지만 답변이 더 이상 관련이 없을 수 있습니다.
딸기

10
나에게 그것은 3 시간 전이었다 :-)
AJBauer

3

위의 답변에 추가하려면 다음 코드 샘플이 있습니다.

struct Test
{
    int something;
}
struct NullableTest
{
    int something;
}
class Example
{
    public void Demo()
    {
        Test t = new Test();
        t = null;

        NullableTest? t2 = new NullableTest();
        t2 = null;
    }
}

컴파일 오류가 발생합니다.

오류 12 널이 아닌 값 유형이므로 널을 '테스트'로 변환 할 수 없습니다.

NullableTest에 대한 컴파일 오류가 없습니다. (t2 선언에서?를 참고하십시오)


2

int?의 줄임말입니다 Nullable<int>. 두 가지 형식은 서로 바꿔 사용할 수 있습니다.

Nullable<T>당신이 값 형식으로 사용할 수있는 운영자입니다 T받아 들일 수 있도록이 null.

당신이 그것을 모르는 경우 : 값 유형 으로 값을 받아 종류 int, bool, char등 ...

그들은 값에 대한 참조를 수락 할 수 없습니다 : 참조 유형null 과 반대로을 할당하면 컴파일 타임 오류가 발생하여 분명히 허용 할 수 있습니다.

왜 필요한가요? 때로는 값 형식 변수가 데이터베이스에서 반환되거나 누락되거나 정의되지 않은 변수와 같이 잘 작동하지 않는 것으로 반환 된 null 참조를받을 수 있기 때문입니다.

이 주제를 잘 다루기 때문에 Microsoft 설명서 를 읽으십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.