C#에서 변수가 초기화되었는지 여부를 알려주는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1195597

  •  19-09-2019
  •  | 
  •  

문제

나는 이것이 멍청한 질문이라는 것을 알고 있으며 전에는 질문을 받았을 것 같아요. 그러나 나는 내 질문에 대한 답을 찾을 수 없습니다.

다음은 내 문제를 간략하게 설명하기 위해 샘플 코드 (물론 컴파일되지 않음)입니다.

class test
{
     int[] val1;
     string val2;

     static bool somefunction(test x, test y)
     {
         dosomestuff()

         test result;

         while(result is nothing)
         {
              if(somecondition){result=new test(something);}
         }
     }
}

내가 가진 문제는 다음 줄에 있습니다.

while(result is nothing)

이것은 VB의 구문입니다. 물론 C# 컴파일러가 수용하는 것은 아닙니다. 누군가 문제를 해결하는 방법을 말해 줄 수 있습니까?

도움이 되었습니까?

해결책

당신이 찾고있는 구문은 다음과 같습니다.

while (result == null)

당신은 또한 설정해야합니다 result = null; 시작합니다

다른 팁

  • tl; dr :

    if (Object.Equals(myVariable, default(MyVariableType)))

    • 바꾸다 myVariable 그리고 MyVariableType.


    다른 솔루션이 있습니다.


if (myVariable == null) ~ 할 것이다 작동하지[1] ~와 함께 유형. 가치 유형은 주로입니다 structS (예 : DateTime), 포함[2] 그만큼 간단한 유형 처럼 int, 그리고 enumerations. 값 유형은 지원하지 않습니다 null 가치 (본질적으로).

이것에 대한 예외와 수정은입니다 무효 유형 : 본질적으로 이러한 추가 null 구조물 유형의 가능한 값에. 그것들은 구조적으로 동일합니다 Maybe<T> 다른 언어에서 알 수 있습니다[3]. 당신은 그것들을 만들어냅니다 ValueType? (예 : int?)는 구문 설탕입니다 Nullable<ValueType>.


또는 Nullable 유형을 사용하는 대신 변수를 유형의 기본값과 비교할 수 있습니다.

if (Object.Equals(myVariable, default(MyVariableType)))

(이것은 참조 유형 (객체) 및 값 유형 모두에서 작동합니다.)
교체해야합니다 MyVariableType 수동으로 - 불행히도 할 수 있습니다 ~ 아니다 하다

if (Object.Equals(myVariable, default(myVariable.GetType())))

왜냐하면 default() 유형 이름 만 직접 접수합니다. (컴파일 타임에 평가한다고 생각합니다.)


스트러크 간단히 말해

간단히 말해서, structs는 컷 다운 클래스입니다. 상속 또는 최종화기를 지원하지 않는 클래스를 상상해보십시오. 컷 다운 버전 인 The Struct가 있다고 상상해보십시오. 스트러크는 클래스와 동일한 방식으로 정의됩니다 ( struct 키워드) 및 방금 설명한 한계와는 별도로, Structs는 필드, 방법, 속성 및 연산자를 포함하여 동일한 부자를 가질 수 있습니다.
인용 : : http://www.albahari.com/valuevsreftypes.aspx ]

수업은 참조 유형: 클래스 변수 (또는 더 구체적으로 메모리 영역)에는 실제 객체 인스턴스 데이터가 저장되는 다른 메모리 영역에 대한 포인터 만 포함됩니다.

가치 유형 변수에는 데이터가 직접 포함됩니다. 이것은 그로 인해 속도 혜택을 얻을 수 있습니다 캐시 로컬 그리고 조회를 저장합니다. 그러나 더 복잡한 구조의 경우 성능에 해로울 수 있습니다.



각주 :

1] 오류가 발생하지 않습니다. myVariable == null 항상 양보 할 것입니다 false, 당신의 myVariable 비와 함께 초기화됩니다.null 기본 값 (0)동등한) 또는 0의 구조 null에스). 이 기본값은 사용할 수 있습니다 default(Type).

2] 기술적으로 간단한 유형 (모두 내장 유형 제외하고 string 그리고 object) ~이다 스트러크. 참고 사항 : 내장 유형은 다음과 같습니다 별명 The Type의 경우 체계 네임 스페이스.

3] 예 : Haskell에서. C#에서 Maybe<T> 내장되지 않았지만 구현할 수 있습니다. 그것은 제공합니다 Nothing 보다 명백한/자기 문서화 버전으로 null 수업과 구조 모두.

4] 아니요 [4]. 아니에요, 당신은 가서 확인할 수 있습니다.

while (result == null)
while (result ==null )

그것이 당신이 의미하는 바인지

당신은 당신이 만족하는 답을 가지고 있지만, 이것 뒤에는 흥미롭거나 도움이 될 수있는 무언가가 있습니다.

C#과 vb.net 사이에는 차이가 있습니다. vb.net에서는 다음을 작성할 수 있습니다.

Dim b as Boolean

그리고 C#에서는 다음을 쓸 수 있습니다.

bool b;

그들은 미묘하게 다릅니다. vb.net에서 b 값 허위가 주어졌습니다 (즉, 이미 초기화되었습니다). C#에서 b 값이 없습니다 (초기화되지 않음). C#은 초기화되지 않은 변수의 값을 검사 할 수 없도록 많은 노력을 기울입니다.

따라서 변수가 초기화되어 있는지 테스트하지 않습니다. vb.net에는 초기화되지 않은 변수와 같은 것은 없습니다. C#에서는이를 비교하기 위해 초기화되지 않은 변수의 값을 얻는 것이 불가능합니다.

변수가 초기화되었는지 여부를 테스트하고 있습니다 null 또는 Nothing.

while(result == null)

C#의 아무것도없는 것은 null입니다.

while (result == null)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top