2008-11-01 5 views
28

왜이 오류가 발생하는지 잘 모르겠지만 이미 큐가 초기화되었는지 확인하기 때문에이 코드를 컴파일하면 안됩니까?C# 오류 : 할당되지 않은 로컬 변수 사용

public static void Main(String[] args) 
{ 
    Byte maxSize; 
    Queue queue; 

    if(args.Length != 0) 
    { 
     if(Byte.TryParse(args[0], out maxSize)) 
      queue = new Queue(){MaxSize = maxSize}; 
     else 
      Environment.Exit(0); 
    } 
    else 
    { 
     Environment.Exit(0); 
    } 

    for(Byte j = 0; j < queue.MaxSize; j++) 
     queue.Insert(j); 
    for(Byte j = 0; j < queue.MaxSize; j++) 
     Console.WriteLine(queue.Remove()); 
} 

대기열이 초기화되지 않은 경우 for 루프가 올바르게 도달 할 수 없습니까? 프로그램이 이미 Environment.Exit (0)으로 종료되었으므로?

는 가주 좀 포인터 :

감사를 줄 수 있기를 바랍니다.

+6

나는 어떤 포인터도 줄 수는 없지만,이 포인터를 사용할 수 있기를 바랍니다. – wprl

답변

73

컴파일러는 Environment.Exit()이 프로그램을 종료한다는 것을 알지 못합니다. 클래스에서 정적 메서드를 실행하는 것으로 나타납니다. 선언 할 때 queue을 null로 초기화하십시오.

Queue queue = null; 
9

컴파일러는 Environment.Exit()이 반환되지 않는다는 것을 모릅니다. Main()에서 "return"하지 않는 이유는 무엇입니까?

+0

스크립트에서 프로그램을 호출 할 경우 환경 변수를 0이 아닌 오류 상태로 사용하는 것을 선호합니다.그런 식으로 스크립트는 종료 상태를 확인하여 프로그램의 성공 여부를 알 수 있습니다. – tvanfosson

+4

main의 리턴 유형을 int로 변경하고 상태를 리턴하십시오. –

0

컴파일러는 "return"을 사용하면 코드에 도달하거나 도달 할 수 없다는 것을 알고 있습니다. Environment.Exit()을 호출하는 함수로 생각하면 컴파일러는 응용 프로그램을 닫을 지 모릅니다.

+0

연결할 수없는 코드의 다른 두 가지 소스를 생각해 볼 수 있습니다. 루프에서 끊거나 계속해서 throw : –

+0

사실입니다. 나는이 특정 질문을 언급하고 있었지만, 설명을 해준 덕분에 오해를 불러 일으킬 수있었습니다. –

8

문제를 해결하기 위해 여러 가지 방법의 몇 :

그냥 수익률 Environment.Exit을 대체합니다. 컴파일러는 return이 메서드를 종료하지만 Environment.Exit이 수행하는지 알지 못합니다.

static void Main(string[] args) { 
    if(args.Length != 0) { 
     if(Byte.TryParse(args[0], out maxSize)) 
     queue = new Queue(){MaxSize = maxSize}; 
     else 
     return; 
    } else { 
     return; 
} 

물론 모든 경우에서 종료 코드로 0을 사용하고 있기 때문에 실제로는 그만 벗어날 수 있습니다. 실제로, Environment.Exit 대신 int를 리턴해야합니다. 특히이 경우,이 나의 선호하는 방법 정말 "나는 대단히 감사합니다, 내 자신의 초기화되지 않은 변수를 알아낼 것이다"라고 단지 컴파일러 트릭 null로

static int Main(string[] args) { 
    if(args.Length != 0) { 
     if(Byte.TryParse(args[0], out maxSize)) 
     queue = new Queue(){MaxSize = maxSize}; 
     else 
     return 1; 
    } else { 
     return 2; 
    } 
} 

초기화 큐가 될 것입니다. 유용한 트릭이지만,이 경우에는 마음에 들지 않습니다. 분기가 너무 많아서 제대로 수행하고 있는지 쉽게 확인할 수 없습니다. 당신이 정말로이이 방법으로 꼭하고 싶었다 경우이 같은 명확 것 :

static void Main(string[] args) { 
    Byte maxSize; 
    Queue queue = null; 

    if(args.Length == 0 || !Byte.TryParse(args[0], out maxSize)) { 
    Environment.Exit(0); 
    } 
    queue = new Queue(){MaxSize = maxSize}; 

    for(Byte j = 0; j < queue.MaxSize; j++) 
    queue.Insert(j); 
    for(Byte j = 0; j < queue.MaxSize; j++) 
    Console.WriteLine(queue.Remove()); 
} 

가 Environment.Exit 후 return 문을 추가합니다. 다시, 이것은 컴파일러 트릭의 더 -하지만 인간에 대한 의미를 추가하기 때문에

static void Main(String[] args) { 
    if(args.Length != 0) { 
    if(Byte.TryParse(args[0], out maxSize)) { 
     queue = new Queue(){MaxSize = maxSize}; 
    } else { 
     Environment.Exit(0); 
     return; 
    } 
    } else { 
    Environment.Exit(0); 
    return; 
    } 

    for(Byte j = 0; j < queue.MaxSize; j++) 
    queue.Insert(j); 
    for(Byte j = 0; j < queue.MaxSize; j++) 
    Console.WriteLine(queue.Remove()); 
} 
+0

매우 유익한 게시물 주셔서 감사합니다. – jkidv

-4

도록 SqlConnection 사기꾼 (가 그 자랑 100 %의 코드 커버리지에서 당신을하겠습니다하지만)뿐만 아니라 IMO 약간 더 합법적입니다; SqlCommand com; con = 새 SqlConnection ("데이터 원본 =. \ SQLEXPRESS; AttachDbFilename ="+ Server.MapPath ("~ \ App_Data \ Database.mdf") + "통합 보안 = True, 사용자 인스턴스 = True"); con.Open();

com = new SqlCommand("insert into blog values(@b)", con); 
    //com.Parameters.AddWithValue("@a", TextBox1.Text); 
    com.Parameters.AddWithValue("@b",TextBox2.Text); 
    com.ExecuteNonQuery(); 
    con.Close(); 
    TextBox1.Visible = true; 
    SqlDataReader DR1; 

    while (DR1.Read()) 
    { 
     TextBox1.Text = DR1[1].ToString(); 
    } 

할당되지 않은 로컬 변수를 사용하는 중 오류가 발생했습니다.

관련 문제