변수

2012-02-17 5 views
2

은 try 섹션 내에서 변수를 사용하는 differenc 및 캐치 부분은변수

string curNamespace; 

try 
{ 
    curNamespace = "name"; // Works fine 
} 
catch (Exception e) 
{ 
// Shows use of unassigned local variable 
throw new Exception("Error reading " + curNamespace, e); 

} 

i "가 할당되지 않은 사용을 얻을 뭐죠 변수

+0

** 할당되지 않은 변수의 사용 ** 당신이 선택하면 당신이 무시할 수 경고. 그렇지 않으면 문제가 완전히 분명합니다. ** curNamespace **를 사용하기 전에 값을 지정하지 않으므로 값을 설정하십시오. 사실 null로 설정하는 대신 String.Empty를 제안합니다 ** –

답변

8

컴파일러는 불평한다. 다음 (매우 인위적인) 예제를 생각해 봅시다 :

string curNamespace; 
try { 
    throw new Exception("whoops"); 

    curNamespace = "name"; // never reaches this line 
} 
catch (Exception e) { 
    // now curNamespace hasn't been assigned! 
    throw new Exception("Error reading " + curNamespace, e); 

} 

수정이 try..catch 밖에서 기본값으로 curNamespace를 초기화하는 것입니다. 당신이 그것을 위해 무엇을 사용하려하는지 궁금해해야합니다.

+0

그는 '* 괜찮아요. *'라고 말했기 때문에 여러분이 말하는 컴파일러가 아닙니다. – Diego

+1

@Diego 귀하의 환경에서 사용해보십시오. VS 2010 및 .NET 4에서는 컴파일러가 기본적으로이를 허용하지 않습니다. 나는 그것을 경고로 바꾸는 것이 가능하다고 생각합니다. 아마도 OP가 가지고있을 것입니다. – Yuck

+0

@Yuck -이 대답은 "correct"와 "incorrect"입니다. 컴파일러가 불평하는 이유는 변수가 사용되기 전에 값이 할당되지 않았기 때문입니다. 그러나 제공된 코드를 기반으로 초기화되었습니다 (값이 지정됨). –

3

변수 curNamespacecatch 범위에서 사용하기 전에 초기화되지 않았습니다.

이에 코드를 변경

:

string curNamespace = null; 

그리고 그것을 잘 컴파일됩니다.

C#에서 변수는 사용하기 전에 초기화해야합니다. 따라서 이것이 잘못되었습니다.

string curNamespace; // variable was not initialized 
throw new Exception("Error reading " + curNamespace); // can't use curNamespace because it's not initialized 
+1

사실 파블로가 아닙니다. 'curNamespace'는 try-catch 블록 외부에서 정의되었으므로 try catch 내에서 액세스 할 수 있습니다. – Diego

+1

왜 이것이 다운 voted인지 모릅니다. 컴파일러는 변수가'catch'에서 사용되기 전에 할당되었음을 확실하게 증명할 수 없습니다. –

+1

@Diego, * 정의 *되고 * 명확히 지정 *되는 것은 두 가지입니다. 파블로의 대답은 정의에 대해 아무 것도 말하지 않습니다. –

2

try 블록 외부에 지정해야합니다. 당신이 값이 초기화 전에 예외 가 발생할 수 있기 때문에

 string curNamespace = string.Empty; // or whatever 

     try 
     { 
      curNamespace = "name"; 
     } 
     catch (Exception e) 
     { 
      throw new Exception("Error reading " + curNamespace, e); 
     } 
0

먼저 curNamespace를 초기화해야합니다. 또는 catch 브랜치에서 초기화되지 않을 수 있습니다.

+0

작성자의 예제 코드를 기반으로 초기화 할 수없는 방법은 없다. 사용하기 전에 값을 할당하지 않았습니다. 이것은 경고 일 뿐이며 예제 코드의 경우에는 무시할 수 있습니다. –

+0

@Ramhound, "초기화 됨"을 사용하여 "정의 됨"을 의미하는 것으로 보입니다. 그것은 올바른 사용법이 아닙니다. 초기화는 본 사용법에 관한 한 기본적으로 할당입니다. –

0

변수를 사용할 때 변수가 유지된다는 보장이 없으므로 변수에 할당해야합니다.

당신이 할 수 있습니다 :

문자열 curNamespace = String.Empty로;

0

당신이 curNamespace 당신의 선언을 변경하고 뭔가를 할당하는 경우, 그것은 작동합니다

string curNamespace = null; /* ASSIGN SOMETHING HERE */ 
try 
{ 
    curNamespace = "name"; 
} 
catch (Exception e) 
{ 
throw new Exception("Error reading " + curNamespace, e); 

}