2008-11-01 59 views
28

Tôi không chắc tại sao tôi nhận được lỗi này, nhưng không nên biên dịch mã này, vì tôi đã kiểm tra xem hàng đợi có được khởi tạo không?Lỗi C#: Sử dụng biến cục bộ chưa được gán

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()); 
} 

Vì vậy, nếu hàng đợi không được khởi chạy thì vòng lặp không thể truy cập được? Vì chương trình đã kết thúc với Environment.Exit (0)?

Hy vọng bạn có thể cho tôi một số gợi ý :)

Cảm ơn.

+6

Tôi không thể cung cấp cho bạn bất kỳ gợi ý nào, nhưng tôi hy vọng bạn có thể xử lý vấn đề này. – wprl

Trả lời

73

Trình biên dịch không biết rằng Environment.Exit() sẽ chấm dứt chương trình; nó chỉ thấy bạn thực hiện một phương thức tĩnh trên một lớp. Chỉ cần khởi tạo queue để vô hiệu khi bạn khai báo nó.

Queue queue = null; 
9

Trình biên dịch không biết rằng Environment.Exit() không trả lại. Tại sao không chỉ "trở về" từ Main()?

+0

Tôi thích sử dụng Environment.Exit với trạng thái lỗi khác 0 trong trường hợp chương trình được gọi từ tập lệnh.Bằng cách đó, kịch bản có thể biết liệu chương trình có thành công hay không bằng cách kiểm tra trạng thái thoát. – tvanfosson

+4

Thay đổi kiểu trả về của chính thành int và trả về trạng thái. –

0

Trình biên dịch chỉ biết rằng mã hoặc không thể truy cập được nếu bạn sử dụng "return". Hãy suy nghĩ về Environment.Exit() như một hàm mà bạn gọi, và trình biên dịch không biết rằng nó sẽ đóng ứng dụng.

+0

Tôi có thể nghĩ đến hai nguồn không thể truy cập khác: Phá vỡ hoặc tiếp tục lặp lại và ném :) –

+0

Đúng vậy. Tôi đã đề cập đến câu hỏi cụ thể này, nhưng cảm ơn vì đã làm rõ, nó có thể dẫn đến một số giải thích sai. –

8

Một vài cách khác nhau để giải quyết sự cố:

Chỉ cần thay thế Environment.Exit bằng trả lại. Trình biên dịch biết rằng trả về kết thúc phương thức, nhưng không biết rằng Environment.Exit thực hiện.

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; 
} 

Tất nhiên, bạn thực sự có thể tránh được điều đó vì bạn đang sử dụng 0 làm mã thoát trong mọi trường hợp. Thực sự, bạn nên trả về một int thay vì sử dụng Environment.Exit. Đối với trường hợp cụ thể này, đây sẽ là phương pháp ưa thích của tôi

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; 
    } 
} 

Initialize hàng đợi để null, mà thực sự chỉ là một thủ thuật biên dịch nói rằng "Tôi sẽ tìm ra các biến chưa được khởi tạo của riêng tôi, cảm ơn bạn rất nhiều". Đó là một thủ thuật hữu ích, nhưng tôi không thích nó trong trường hợp này - bạn có quá nhiều nếu các chi nhánh dễ dàng kiểm tra xem bạn có đang thực hiện đúng không. Nếu bạn thực sự muốn làm theo cách này, một cái gì đó như thế này sẽ được rõ ràng hơn:

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()); 
} 

Thêm một tuyên bố trở lại sau Environment.Exit. Một lần nữa, đây là chi tiết của một thủ thuật biên dịch - nhưng là hơi legit hơn IMO vì nó bổ sung thêm ngữ nghĩa đối với con người cũng như (mặc dù nó sẽ giữ cho bạn từ 100% bảo hiểm mã vaunted)

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

Cảm ơn bạn đã đăng bài rất nhiều thông tin. – jkidv

-4

SqlConnection con; SqlCommand com; con = new SqlConnection ("Nguồn dữ liệu =. \ SQLEXPRESS; AttachDbFilename =" + Server.MapPath ("~ \ App_Data \ Database.mdf") + "; Tích hợp bảo mật = True; Trường hợp người dùng = 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(); 
    } 

lỗi xảy ra khi sử dụng biến cục bộ chưa được chỉ định.

Các vấn đề liên quan