2009-04-05 5 views
0

[*]를 알고있는 한 C#은 일반적인 데이터 형식 (int, float, bool 등)을 적절한 값으로 기본값으로 설정합니다. 각각 0, 0.0ffalse의 값을 취합니다.C#에서 POD 초기화 - 모범 사례

내가 명시 적으로 0의 내 변수를 명확성을 위해 0.0ffalse을 값을 줄 경우, 또는 나는 (틀림없이), 따라서 내가 작성하는 코드의 양을 줄일 암시 값을 떠나야한다 :

가정이 너무입니다 내가 프로그램에 소개 할 수있는 오류의 수를 줄이십시오?

[*] 10 분의 인터넷 검색 결과가 확인되면 관련 문서를 찾는데 어려움을 겪고 있습니다. 누군가가 나에게 그것을 지적한다면 나는 그 질문을 수정할 것이다!

답변

4

C# 은 기본값을 로컬 개의 변수에 할당합니다. 이러한 기본값은 (반원) 필드에만 적용됩니다. :)

아래

static void Test() { 
    int x; 
    Console.WriteLine(x); // compile time error. 
} 
+0

* C# *는 로컬을 초기화하지 않지만 검증 가능한 방법은 CLI가 수행합니다. C# 컴파일러가 그 사실을 알지는 못합니다. :) –

0

주관적 응답 내가 같은 느낌 : 처음 사용하기 전에 해당 지역의 변수에 값을 할당하지 않으면

, 당신은 컴파일 타임 오류를 얻을 수 있습니다 구성원을 기본값으로 초기화하면 안됩니다. 그것은 중복 코드에 많은/어떤 가치도 추가하지 않습니다.

나는 이것을하는 사람들은 C++에 강한 배경을 가지고 있으며, 결과적으로 올바른 코드를 작성하기 위해 멤버 변수를 초기화해야한다는 것을 마음에 깊이 새기고있다. (나는 유죄이다.) 이 연습은 C#으로 번역되었으므로 실제로는 필요하지 않습니다.

그러나 나는 많은 수면을 잃지 않습니다. 사람들이 기본 변수를 초기화하면 코드 검토에 질식어 주석을 추가 할 수 있지만 실제로 그 코드에 대한 입장을 취하지는 않습니다.

2

정적/인스턴스 변수와 배열 요소의 경우 기본값이 적절합니다. 변수의


다음 범주가 자동으로 기본값으로 초기화됩니다 :

  • 정적 변수 섹션 C# 3.0 사양의 5.2을 참조하십시오.
  • 클래스 인스턴스의 인스턴스 변수.
  • 배열 요소.

변수의 초기 값은 변수의 종류에 따라 다음과 같이 결정된다 : 값 형태의 변수

  • , 디폴트 값은 계산 된 값과 동일한 값 유형의 기본 생성자 (4.1.2).
  • 참조 유형의 변수의 경우 기본값은 null입니다.

일반적으로 기본값으로 초기화하는 것은 메모리 관리자 나 가비지 수집기를 사용하기 전에 메모리를 모든 비트 0으로 초기화하도록함으로써 수행됩니다. 이러한 이유 때문에 널 참조를 나타 내기 위해 모든 비트 0을 사용하는 것이 편리합니다.


로컬 변수는 아무튼 정확하게 할당되기 전에 사용할 수 없으므로 중요하지 않습니다.

명시 적으로 초기화해야하는지 아닌지는 대부분 개인적인 취향입니다. 예를 들어, 생성자에서 다시 할당 할 경우 일반적으로 선언에 값을 할당하지 않습니다.

정말 솔직히 말해서 내가 읽을 수있는 부분에서 흥분할만한 주제는 아닙니다.

+0

실제로 검증 가능한 일리노이는 메소드가 자체 설명하는 일종의 'initlocals' 플래그를 지정해야합니다. 한정 할당은 컴파일러 트릭입니다. –

+0

C#은 IL에 컴파일 할 필요가 없습니다. 요점은 컴파일러 트릭으로 인해 로컬 변수에서 읽을 수 없으므로 중요하지 않아야한다는 것입니다. –

0

CLR이 기본 형식을 초기화 할 때 해당 형식의 모든 비트를 제로로 만들면 기본 형식이 초기화됩니다. 그래서 멀리 CLR 다음에 관한 한 :

int i; 
bool b; 

이와 동일합니다 :

int i = 0; 
bool b = false; 

C# 컴파일러는 그러나 표현식에서 사용하기 전에 변수를 초기화하는 것을 reuires. 나는 이걸 좀 이상하게 보았지만 그것들은 규칙이다.

+0

CLR이 어쨌든 그렇게 할 수는 있지만 CLI 사양이 보증하는지 확실하지 않습니다. 그것이 이유 일 수 있습니다. –

4

나는 그들을 (필드) 초기화하지 말 것입니다. 그것들 없이는 무엇이 일어나고 있는지 분명히 밝혀 줄 것입니다.

지역 변수를 초기화 할 때까지는 의미있는 값을 가질 때까지는 초기화하지 말아야합니다. 나는 종종 다음 예제와 유사한 코드를 참조하십시오

private void SomeMethod() 
{ 
    SomeObject myObj = null; 

    if (SomeCondition) 
    { 
     myObj = someValue; 
    } 
    else if (SomeOtherCondition) 
    { 
     myObj = someValue; 
    } 
    else 
    { 
     myObj = someOtherValue; 
    } 
} 

널 할당은 중복이지만, 사실 우리는 코드 경로 중 하나에 myObj로 할당하는 것을 잊었다 것처럼이 예를 들어, 손상이라고 생각 else에서 myObj 대신 myObj를 할당하면 myObj가 null로 설정되어 결국 런타임 중에 null 참조 예외로 명시됩니다. inital null assignment가 없다면 이것은 컴파일 에러가 될 것이다.

+0

+1 방어 프로그래밍 –

1

구성원 변수는 기본값 (예 : 0 또는 null)으로 초기화됩니다.

멤버 변수에 기본값을 할당하고 코드 분석을 수행하면이 값이 catch되어 DoNotInitializeUnnecessarily 경고가 표시됩니다.

0

많은 프로그래밍 언어에 지속적으로 노출되어 있으므로 필자는 컴파일러/해석기가 나를 위해 변수에 기본값을 할당하는 것을 신뢰하지 않을 것입니다.자신이 사소한이며, 변수가 초기화되지 않도록하는 것이 이렇게 : random data

  • 메모리에 주위에 매달려와 상호 작용할 때 해당 데이터를 사용하는 특히, 잠재적 인 보안 위험이 있습니다 user input fields하여
  • , 데이터베이스 또는 더 나쁜 경우 운영 체제