2014-11-07 18 views
23

Tôi chỉ đang cố gắng tìm ra lý do kỹ thuật tại sao dưới đây một số dòng không kết thúc bằng dấu chấm phẩy nhưng các dòng khác làm - nó là gì về dấu chấm phẩy mà C# mong đợi ở một số dòng rồi ...tại sao một số dòng không có dấu chấm phẩy trong C#?

Trong thực tế, trong khi viết này tôi nhận thấy rằng các báo cáo phải có dấu ngoặc nhọn {} không cần dấu chấm phẩy nhưng các dòng được trên riêng của mình "Console.WriteLine" cần nó.

Thật cố gắng tìm ra lý do kỹ thuật cho điều này ...

ví dụ:

namespace checkPackage  **//no semicolon** 
{ 
    class Program  **//no semicolon** 
    { 
     static void Main(string[] args)  **//no semicolon** 
     { 
      listFilesInDirectory(@"C:\Temp\"); **//NEEDS a semicolon** 
     } 

     static void listFilesInDirectory(string workingDirectory) **//no semicolon** 
     { 
      string[] filePaths = Directory.GetFiles(workingDirectory); **//NEEDS a semicolon** 

      foreach (string filePath in filePaths) **//no semicolon** 
      { 
       Console.WriteLine(filePath); **//NEEDS a semicolon** 
      } 

     } 
    } 
} 
+0

Đối với 1 nơi bạn đặt phần cuối dòng là tùy ý. Ngoài ra các khối mã {code here} không cần dấu chấm phẩy. – kenny

+2

Không có vấn đề gì với việc đặt câu hỏi về hiện trạng. Câu trả lời là hiển nhiên, người sáng tạo ngôn ngữ đã thực hiện điều này 'the-way-to-go-forward' với các phát biểu. –

+2

Vì thuật ngữ 'dòng' gần như chắc chắn không xuất hiện ở bất kỳ đâu trong đặc tả ngôn ngữ C# chính thức. Chỉ có ngôn ngữ đồ chơi mới có dòng. – EJP

Trả lời

55

Các dấu chấm phẩy không phải là một dòng terminator ... đó là một tuyên bố terminator . Có một dấu chấm phẩy ở cuối mỗi câu lệnh biểu thức và câu lệnh khai báo.

(if, for vv báo cáo không phải là biểu hiện hoặc khai báo cáo.)

Vì vậy, ví dụ:

public class Foo // Part of a class declaration 
{ 
    int x = 0; // Declaration statement 

    public void Bar() // Part of a method declaration 
    { 
     Console.WriteLine(x); // Expression statement (using an invocation expression) 
    } // End of the method declaration, but not a declaration statement 

} // End of class declaration, but not a declaration statement 

Mục đích của yêu cầu họ là để trình biên dịch có thể biết khi nào bạn muốn kết thúc tuyên bố thay vì tiếp tục trên dòng tiếp theo:

int x = 5; 
int y = x // This isn't the end of the statement! 
     + 5; // This is... 

Một thay thế (được sử dụng bởi VB, ví dụ) là t o có một dòng tiếp tục, nơi bạn muốn tiếp tục một cách rõ ràng vào dòng tiếp theo ngay cả khi dòng hiện tại sẽ là một tuyên bố hợp lệ.

Như đã lưu ý trong nhận xét, câu lệnh do là sự bất thường ở đây. Tôi không thấy lý do rõ ràng lý do tại sao điều này không hợp lệ:

do { } while (false) 

... nhưng không phải vậy. Nó có thể có liên quan đến thực tế là tuyên bố đồng bằng while cần một phần tử tuyên bố, ví dụ: while (true); (tuyên bố trống) hoặc while (true) {} (tuyên bố khối). Gần nhất tôi có thể đến là "bởi vì đặc điểm kỹ thuật C# cho biết câu lệnh do cần dấu chấm phẩy ở cuối ..."

+0

Còn vòng lặp 'do {}' thì sao? – Neolisk

+0

@Neolisk: Đã đến lúc đó ... –

+0

Vậy, vòng lặp 'do {}' là gì? Tôi vẫn tò mò. :) – Neolisk

12

Lý do? Bởi vì the spec nói như vậy:

Một tuyên bố có thể bao gồm một dòng mã kết thúc bằng một dấu chấm phẩy , hoặc một loạt các báo cáo đơn dòng trong một khối. Một khối tuyên bố được đặt trong {} dấu ngoặc và có thể chứa các khối lồng nhau .

Định nghĩa foreach được theo sau bởi một tuyên bố, phải được đặt trong {} hoặc kết thúc bằng dấu chấm phẩy. Câu lệnh này sau đó được gọi là thân vòng lặp.

Đây có thể không phải là câu trả lời đầy đủ cho câu hỏi "tại sao". Để đi sâu hơn vào điều này, bạn thực sự cần phải hỏi các nhà thiết kế. Tôi cho rằng, họ muốn làm cho nó gần với C-Cú pháp, trái ngược với các ngôn ngữ khác, nơi dòng-break phục vụ một mục đích tương tự.(Python iirc)

Nếu bạn muốn định nghĩa chính thức hơn, download the C# Language Specification và đọc mục 1.2 đến 1.5.

6

Có hai loại báo cáo đơn giản, đơn giảnhợp chất. Các khai báo vòng lặp và phương thức là các câu lệnh ghép. Mỗi câu lệnh đơn giản kết thúc bằng dấu chấm phẩy nhưng các câu lệnh ghép không kết thúc bằng dấu chấm phẩy. Từ msdn

Một câu lệnh ghép gồm không hoặc nhiều câu trong ngoặc nhọn ({}). Một tuyên bố hợp chất có thể được sử dụng bất cứ nơi nào một tuyên bố dự kiến. Các câu lệnh hợp chất thường được gọi là "các khối".

Dấu ngoặc nhọn chỉ định bắt đầu và kết thúc của một câu lệnh ghép. Trình biên dịch tìm kiếm các dấu ngoặc thay vì dấu chấm phẩy để xác định phần đầu và cuối của câu lệnh.

+0

Xin lỗi, buổi sáng ở đây, tôi đã xóa nhận xét của mình. – Neolisk

+0

Bạn có thể giải thích tại sao một vòng lặp 'do {}' cần một dấu chấm phẩy? Tôi không thấy nó khác với 'if' thực sự ... – Neolisk

+0

@Neolisk Tôi nghĩ lý do là phân biệt vòng lặp do-while từ một vòng lặp thông thường. –

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