2010-01-28 4 views
12

null로 설정할 수 있고 int? myVariable 구문을 사용하지 않으려는 정수 변수를 갖고 싶습니다. intInt16을 사용하지 않으려 고 시도했습니다. int? myVariable을 사용해야합니까?C#에서 정수 참조 유형이란 무엇입니까?

자바에서는 'int'유형 (프리미티브)과 'Integer'(참조 유형)가 모두 있기 때문에이를 언급했습니다. 내가 사용할 수있는 내장 정수 참조 유형이 없는지 확인하고 싶었다. 나는 'int'를 사용할 것이다. 내가하는 일 때문에.

+5

... 왜 구문을 사용하지 않으시겠습니까? – womp

+3

@ 존, 그건 마치 컴파일러가 나에게 말하지 않고 그것을 알기를 원한다. – Dykam

답변

26

정보를 위해, int?/Nullable<T>이 아니고 참조 유형입니다. 특수 컴파일러 규칙 (re null 검사, 연산자 등) 및 CLI 규칙 (boxing/unboxing)이있는 struct (본질적으로는 intbool 플래그)를 의미하는 "nullable type"입니다. 이 당신이 권투 계산하지 않는는 .NET에는 "정수 참조 형은"없다 :

int i = 123; 
object o = i; // box 

을하지만이 불필요한 객체를 생성하고 관련된 다른 문제를 많이 가지고있다.

원하는 경우 int?이 이상적이어야합니다. 은 장황한 구문 (Nullable<int>)을 사용할 수 있지만 IMO는 불필요하게 자세한 정보이며 사람을 혼동시키는 것을 보았습니다.

+4

IMHO _? _ 혼란은 배경에 달려 있습니다 - 루비 사람들을 혼동시킵니다. 우리는 nullable을 사용하고 있습니다 googlable 및 msdnable : 초보자 용 –

+0

IDictionary 가있는 시나리오를 어떻게 다룰 것인가? 다양한 개체의 수로 사용한다고 가정 해 봅시다. 인덱서 호출 ("[..]")에서 반환 된 값은 사전의 KeyValuePair 인스턴스에 저장된 동일한 값에 대한 객체 참조가 아니므로 "theDictionary [someObject] = newValue"코드가 작동하지 않습니다. 카운터를 증가 시키려면 KVP를 제거하고 KVP에 새로운 값을 쓰려면 다시 추가해야합니까? 아니면 다른 방법이 있습니까? – Marchy

+1

@Marchy theDictionary [someObject] = newValue'는 정상적으로 작동합니다. 그것은 잘 정의되고 완벽하게 지원되는 인덱서에 대한 할당입니다. –

2

그렇습니다. Int32/Int16/int는 기본 유형이므로 (boxing/unboxing과 상관없이) 유일한 방법입니다.

8

예를 참조 nullable 형식

를 사용해야합니다 Nullable

Nullable<int> Nullable<float> 

하거나

int? float? 

PS :

당신이 를 사용하지 않을 경우

? 표기법 또는 Nullable은 전혀 사용하지 않습니다. 예를 DataTable를 들어 :

var table = new DataTable(); 
table.Columns.Add('intCol',typeof(int)); 
var row = table.NewRow(); 
row['intCol'] = null; // 
+0

링크에 따라 참조 유형이 아닙니다 ("null에 할당 할 수있는 값 유형을 나타냄"). 그러나 OP의 기본 문제에 대한 답변은 제목에 포함 된 질문이 아니라면 그렇습니다. – Kat

0

<var>? 구문은 Null을 허용합니다. 좀 더 깊게 파고 들면, 사용되는 일반적인 객체라는 것을 알 수 있습니다.

C++처럼하고 싶다면 안전하지 않은 작업을 사용해야합니다. 그런 다음 C와 같은 포인터를 사용할 수 있지만 코드가 CLR을 따르지 않습니다.

포인터없이 순수 .NET을 사용하는 경우 ?을 사용하는 것이 좋습니다.

+5

그것은 개체가 아닙니다. Nullable은 구조체입니다. –

0

예. 이것이 바로 Microsoft가 추가 한 이유입니다. 사람들은 자신의 Nullable 클래스를 만들어서 .NET에이 패턴을 포함 시켰습니다.

0

?을 너무 많이 싫어하면 System.Nullable<int>을 사용할 수 있습니다.

0

당신은 nullable 형식을 사용해야합니다
, 모든 종류 값 유형에 널 (null)을 지정합니다. MSDN에서

:

nullable 형식 주소는 널 (또는 알 수 없음) 값을 기본 유형을 가질 수 있도록하려는 시나리오. 이는 데이터베이스 시나리오에서 일반적이지만 다른 상황에서도 유용합니다.

  1. 박스형 값 유형 : 과거

    ,이 일을 여러 가지 방법이 있었다. 이것은 컴파일 타임에 강력하게 형식화되지 않으며 모든 유형에 대해 힙 할당을 수행해야합니다.
  2. 값 유형에 대한 클래스 래퍼. 이 형식은 강력하게 형식화되어 있지만 여전히 힙 할당이 포함되어 있으므로 래퍼를 작성해야합니다.
  3. null 허용 여부를 지원하는 구조체 래퍼입니다. 이것은 좋은 해결책이지만 직접 작성해야합니다.
관련 문제