2009-12-27 31 views
7

Tôi mới đến lập trình và gặp vấn đề với đoạn mã sau:C# switch vấn đề

private string alphaCoords(Int32 x) 
    { 
     char alphaChar; 

     switch (x) 
     { 
      case 0: alphaChar = 'A'; break; 
      case 1: alphaChar = 'B'; break; 
      case 2: alphaChar = 'C'; break; 
      case 3: alphaChar = 'D'; break; 
      case 4: alphaChar = 'E'; break; 
      case 5: alphaChar = 'F'; break; 
      case 6: alphaChar = 'G'; break; 
      case 7: alphaChar = 'H'; break; 
      case 8: alphaChar = 'I'; break; 
      case 9: alphaChar = 'J'; break; 
     } 

     return alphaChar.ToString(); 
    } 

Trình biên dịch nói: Sử dụng biến cục bộ unassigned 'alphaChar'

Nhưng tôi gán cho nó trong khối chuyển đổi của tôi.

Tôi chắc chắn đây là lỗi của tôi vì tôi không biết đủ về lập trình.

Vui lòng thông báo.

Cảm ơn.

+0

Ngoài ra, đây là thông báo: Bạn chỉ có thể nhập 'int' thay vì' Int32' nếu bạn muốn. Chúng là các từ đồng nghĩa –

Trả lời

34

Bạn đang chỉ định số nếu x là 0-9. Bạn mong đợi điều gì sẽ xảy ra nếu x là 123? Trong khi bạn có thể biết rằng chỉ có giá trị từ 0 đến 9 sẽ được chuyển vào, trình biên dịch không - vì vậy cần phải xem xét điều gì sẽ xảy ra nếu không.

Một cách để tránh điều này là phải có một trường hợp default trong câu lệnh switch của bạn, mà bạn có thể sử dụng để ném một ngoại lệ nếu giá trị không nằm trong phạm vi dự kiến:

switch (x) 
{ 
    case 0: alphaChar = 'A'; break; 
    case 1: alphaChar = 'B'; break; 
    case 2: alphaChar = 'C'; break; 
    case 3: alphaChar = 'D'; break; 
    case 4: alphaChar = 'E'; break; 
    case 5: alphaChar = 'F'; break; 
    case 6: alphaChar = 'G'; break; 
    case 7: alphaChar = 'H'; break; 
    case 8: alphaChar = 'I'; break; 
    case 9: alphaChar = 'J'; break; 
    default: throw new ArgumentOutOfRangeException(); 
} 

Dưới đây là một chút đơn giản hơn thay thế mặc dù, mà loại bỏ lệnh switch của bạn hoàn toàn:

if (x < 0 || x > 9) 
{ 
    throw new ArgumentOutOfRangeException(); 
} 
char alphaChar = (char)('A' + x); 

Lưu ý rằng bạn làm cần phải thận trọng khi sử dụng số học như thế này. Trong Java và C#, biểu diễn bên dưới được bảo đảm là Unicode, điều này làm cho cuộc sống trở nên dễ dàng hơn nhiều. Tôi tin rằng nó là tốt cho những thứ như thế này (và phân tích cú pháp hex/định dạng), nhưng khi bạn mạo hiểm vào các kịch bản kỳ lạ hơn nó sẽ thất bại. Sau đó, một lần nữa, đó là sự thật cho rất nhiều kỹ thuật đơn giản hóa mã ... nếu chúng được áp dụng một cách không thích hợp, bạn kết thúc với một mớ hỗn độn.

+0

tôi chỉ muốn xử lý các giá trị từ 0 đến 9. không có giá trị nào khác ngoài những giá trị này sẽ được thông qua. – iTEgg

+0

@ikurtz: Sau đó ném một ngoại lệ nếu có * là * một giá trị khác 0 đến 9 là điều đúng đắn cần làm. –

+1

Nhưng trình biên dịch không biết điều đó và nó không thể xác minh hoặc đảm bảo điều đó. –

2

Bạn cần thêm mặc định vào báo cáo chuyển đổi của mình.

Trình biên dịch cho biết rằng có một số trường hợp sẽ không gán giá trị cho biến đó. Vì vậy, thêm

default: 
    alphaChar = 'x' 
break; 

sẽ cho trình biên dịch "như vậy trong trường hợp tôi bỏ lỡ một số kịch bản, làm cho giá trị này"

hoặc trong trường hợp không muốn gán một mặc định:

default: throw new Exception(); 

Điều này không nhất thiết phải tốt hơn nhưng cách khác để làm điều đó:

private string alphaCoords(Int32 x) 
    { 
     if(x >= 0 && x =< 9) 
      return ((char)(x + 65)).ToString(); 
     else 
     throw new ArgumentException(); 
    } 
+0

tôi không muốn thêm mặc định vì các giá trị chỉ có thể từ 0 đến 9. – iTEgg

0

Trình biên dịch không có cách nào để biết thứ tại biến số x chỉ có thể chứa số lên đến 9 (là số bạn kiểm tra trong số switch). Vì trường hợp default bị thiếu trong chuyển đổi của bạn, có thể xảy ra rằng alphaChar vẫn chưa được chỉ định. Bạn có thể thêm một trường hợp default hoặc gán biến một giá trị trước số switch.

0

Thêm giá trị mặc định cho nút chuyển của bạn, bởi vì nếu x là 10, alphaChar sẽ không bao giờ được chỉ định.

2

Trình biên dịch được phàn nàn vì alphaChar là thể không xác định - nếu nó không phải là một trong những giá trị trong bạn switch sau đó nó sẽ không được xác định. Bạn có thể thực hiện một trong những điều sau:

  • Đặt giá trị ban đầu của char sẽ được thực hiện nếu không có điều kiện chuyển nào là đúng.
  • Thêm mệnh đề "mặc định" vào câu lệnh chuyển đổi của bạn.
0

Sau khi bạn khai báo biến char alphaChar, bạn nên "gán" một giá trị cho nó (đặt nó bằng một cái gì đó), mặc dù bạn mong đợi nó nhận được một giá trị trong câu lệnh switch.

Bạn có thể gán nó 'A' hoặc '0' hoặc khá nhiều thứ.

Bạn có thể làm điều đó trong tờ khai như thế này

char alphaChar = 'A'; 

Hoặc bạn có thể làm điều đó một cách riêng biệt

char alphaChar;  
alphaChar = 'A'; 
2

Trước khi sử dụng đầu tiên của nó biến địa phương phải được chắc chắn giao (theo C quy tắC# đặc điểm kỹ thuật) . Trong trường hợp chuyển đổi trường hợp cụ thể này không đảm bảo rằng alphaChar chắc chắn sẽ được gán do đó lỗi trình biên dịch. Bạn có thể cung cấp giá trị ban đầu cho alphaChar và do đó nó chắc chắn sẽ được gán.

1

Bạn đang chỉ định giá trị cho biến số alphaChar dựa trên một số điều kiện. Hãy tưởng tượng một kịch bản mà biến số x chứa giá trị khác 0 đến 9. Giả sử nó chứa 10. Sau đó, không có điều kiện nào được thỏa mãn bởi x, vì vậy alphaChar sẽ không được gán bất kỳ giá trị nào, kết quả là nó sẽ không được khởi tạo hoàn toàn. Vì vậy, khi bạn đang chuyển đổi alphaChar thành chuỗi, nó sẽ chuyển đổi một số giá trị rác thành chuỗi và trả lại cho phương thức gọi. Đây là lý do tại sao bạn nhận được tin nhắn đó.

Nếu bạn muốn để có được một giải pháp đơn giản, sau đó thêm đoạn mã sau dưới

case 9: alphaChar = 'J'; 
     break; 

-

default: return null; 

và kiểm tra trong các phương pháp gọi dù alphaCoords hàm này trả về null hay không, giống như này -

if(alphaCooord(10) == null) 
{ 
    // x contains value other than 0 to 9 
} 
else 
{ 
    // x contains value between 0 to 9, so the returned value will be the string 
    // representation of the corresponding character 
} 

Bằng cách này, mã của bạn sẽ không quá phức tạp hoặc bạn on't cần phải ném hoặc xử lý bất kỳ trường hợp ngoại lệ hoặc một cái gì đó như thế.

Hy vọng điều đó sẽ giúp :).