2014-12-13 4 views
0

내 dataadapter를 사용하여 null 인 경우 commandbuilder를 만드는 데 사용하려는 OleDbCommand 변수가 있습니다. 변수가 널이 아닌 경우,이 변수에 명령 빌더가 이미 작성되었습니다. 변수를 로컬로 만들고 null을 테스트하면 "할당되지 않은 로컬 변수 사용 ..."변수가 public/global로 설정되면 모든 것이 작동합니다. 관련 코드는 다음과 같습니다null에 대한 oledbcommandbuilder 변수 테스트

//Created locally in a button procedure: 
OleDbCommandBuilder cBuilder; 

if (cBuilder == null) 
{ 
    cBuilder = new OleDbCommandBuilder(dAdapter); 
} 

내가 로컬 선언을 주석 및 다른 공공 변수까지 공개로 정의한다면, 그것은 어떤 흥미를 끄는없이 잘 작동합니다. 내가하는 일에 비해 지역이나 공공의 범위가 다른 이유는 무엇입니까? 필자는 commandbuilder가 이미 만들어 졌는지 확인하기 위해 테스트를 수행하여 여러 명령을 반복해서 만들지 않습니다. 내 dataadapter 변수를 사용하여 동일한 작업을 수행하고 있지만이 경우 어쨌든 공용이어야합니다. 그래서 뭔가를 만들려고 시도하기 전에 이미 만들어 졌는지 확인하기 위해 일반적으로 이것을 공격하는 더 좋은 방법이 있습니까?

답변

1

내가하는 일에 상대적인 이유는 지역 또는 공개로 인해 어떤 차이가 있습니까?

차이는 그것들이 포함 된 방법의 시작 값 없다 로컬 변수. 메소드가 실행 된 횟수는 중요하지 않으며, 변수는 실행될 때마다 값없이 시작됩니다. 당신의 예에서

:

OleDbCommandBuilder cBuilder; 

if (cBuilder == null) 
{ 
    cBuilder = new OleDbCommandBuilder(dAdapter); 
} 

cBuilder이 시점에서 값이없는 그것은 null 여부를 확인 할 이유 따라서이 없기 때문에이 널 (null) 검사가 무의미하다.

C# 컴파일러는 값이 할당되기 전에 로컬 변수에 액세스하지 못하게합니다. 이것은 버그를 제거하는 데 도움이되는 보호 장치입니다.

많은 분기가있는 비교적 복잡한 방법으로 작업하는 경우 변수가 모든 단계에서 값을 갖게하기에는 너무 복잡해지면, 사용자가 코드를 편집 할 때 null (또는 다른 값)으로 초기화 할 수 있습니다. 그것을 선언하십시오 :

OleDbCommandBuilder cBuilder = null; 

이렇게해야하는 이유가있는 경우를 제외하고는이 작업을하지 않는 것이 좋습니다. 초기화되지 않은 변수에 액세스하는 것에 대한 컴파일러의 제한은 이유가 있기 때문에 가능하며 위의 코드는 일반적으로이를 막는 게으름입니다.

+0

어떤 것도 곤란한 JL .... 나는 처분의 개념에 얽매여 있고이 코드가 호출 될 때마다 중복 객체 (이 경우에는 OleDbCommandBuilder)를 작성하게 될까봐 두려웠다. 그래서 지역 변수가 매번 값이없는 것으로 시작한다면, 나는 그들이 표현한 객체가 자동적으로 처리된다고 가정하여 수정해야만합니까 ??? 그렇다면 사물을 단순화하는 것처럼 이것이 좋다. – valhalla

+0

반드시 자동 처리되지는 않습니다. [사용] (http://msdn.microsoft.com/en-us/library/yh598w02.aspx) 블록을 사용하여 사용이 끝날 때마다 처리되도록해야합니다. – JLRishe

관련 문제