2010-08-17 40 views
37

Tôi đang xem một đồng nghiệp # mã c hôm nay và thấy như sau:Câu lệnh C# có thể được viết mà không có dấu ngoặc nhọn không?

using (MemoryStream data1 = new MemoryStream()) 
    using (MemoryStream data2 = new MemoryStream()) 
    { 
     // Lots of code.......... 
    } 

Tôi đã luôn luôn nhìn thấy báo cáo kết quả using theo sau là một cặp dấu ngoặc nhọn mà xác định phạm vi của cuộc sống đối tượng. Đồng nghiệp của tôi đã viết mã cho biết rằng các dấu ngoặc nhọn cho câu hỏi data1using là không cần thiết và mã đã thực hiện tương tự như khi chúng hiện diện và lồng nhau câu lệnh data2using. Vì vậy, những gì sẽ xảy ra khi niềng răng xoăn được ommitted?

+1

Chỉ cần 2 xu của tôi - Trong khi bạn "có thể" làm điều này, như được minh họa bằng câu trả lời, tôi cho rằng bạn không nên làm điều đó vì mục đích dễ đọc. Đối với tôi, nó giống như gói if/else/while/lock/etc. khối trong niềng răng - ngay cả khi chúng không cần thiết, nó dễ đọc hơn nhiều. –

+9

Theo ý kiến ​​của tôi, các câu lệnh 'using' được xếp chồng lên nhau, như trên, có thể đọc được ** nhiều hơn so với các câu lệnh' using' lồng nhau. Đặc biệt trong trường hợp bạn đang kết hợp với nhau 3-4 Streams/StreamReaders để thực hiện một bộ hoạt động đơn lẻ. –

+2

@ Jelel: Có thể giống như bất cứ điều gì khác, tình hình cụ thể nên được xem xét.Nếu đó chỉ là hai, ý kiến ​​của tôi là hoàn toàn làm tổ họ bằng niềng răng. Nếu chúng ta đang nói 4 như bạn nói, có thể xếp chồng lên nhau là cách tiếp cận tốt hơn. Nhưng lần đầu tiên bạn cần truy cập dữ liệu1 trước khi tạo dữ liệu2, điều đó có nghĩa là thay đổi khả năng đọc của mã thay vì chỉ thêm một dòng mã. –

Trả lời

95

Vâng, bạn cũng có thể đặt chúng trong một sử dụng tuyên bố:

using (MemoryStream data1 = new MemoryStream(), 
        data2 = new MemoryStream()) 
{ 
    // do stuff 
} 
+27

+1. Tôi không biết bạn có thể làm điều này – fletcher

+0

+1 Đẹp, tôi đã nhìn thấy điều này trước khi ... nhưng quên nó đi. –

+0

Tôi khá chắc chắn rằng hành vi của cấu trúc này là khác nhau trong một số trường hợp nhất định. Tôi không nhớ chính xác tại sao ngay bây giờ, nhưng tôi tin rằng tôi đã đọc nó trong một cuốn sách của Bill Wagners. – fearofawhackplanet

18

Các quy tắc tương tự áp dụng khi bạn bỏ qua các dấu ngoặc nhọn trong câu hỏi for hoặc if.

Ngẫu nhiên nếu bạn phản ánh vào mã được biên dịch, trình biên dịch biên dịch sẽ thêm dấu ngoặc ôm.

+2

Một khác biệt là, khi lồng ghép các câu lệnh 'for', chúng ta sẽ thụt lề bên trong, nhưng các câu lệnh' using' lồng nhau thường được căn trái. Đây là một vấn đề của quy ước chung, không phải cú pháp ngôn ngữ, tất nhiên. –

+7

+1, điểm nitpick: Trình biên dịch không thực sự thêm niềng răng, bộ giải mã sẽ đặt chúng vào. – JaredPar

+0

@JaredPar Cảm ơn bạn đã làm rõ. Tôi không biết điều đó. –

3

Chính xác những gì đồng nghiệp của bạn đã nói, điều đó tương đương với việc lồng các câu lệnh. Việc xử lý cho data2 sẽ được gọi ngay lập tức trước chức năng xử lý cho data1.

1

Nếu chỉ có một chỉ lệnh tuân theo tuyên bố, thì không cần sử dụng bracets. Nó giống như với tuyên bố if.

if(true) 
{ 
    Console.Writeline("hello") 
} 

nghĩa giống nhau mà

if(true) 
    Console.Writeline("hello") 
15

Chính xác những gì ông nói. Đoạn mã trên là chính xác giống như viết:

using (MemoryStream data1 = new MemoryStream()) 
{ 
    using (MemoryStream data2 = new MemoryStream()) 
    { 
     // Lots of code 
    } 
} 

Bạn có thể bỏ qua các dấu ngoặc nhọn sau if/else/cho/trong/sử dụng/etc tuyên bố chừng nào chỉ có một lệnh trong báo cáo kết quả. Ví dụ:

// Equivalent! 
if (x==6) 
    str = "x is 6"; 

if(x == 6) { 
    str = "x is 6"; 
} 

// Equivalent! 
for (int x = 0; x < 10; ++x) z.doStuff(); 

for (int x = 0; x < 10; ++x) { 
    z.doStuff(); 
} 

// NOT Equivalent! (The first one ONLY wraps the p = "bob";!) 
if (x == 5) 
p = "bob"; 
z.doStuff(); 

if (x == 5) { 
    p = "bob"; 
    z.doStuff(); 
} 
+1

Ý tưởng hay là đăng các ví dụ như thế này @Stephen! – Cyberherbalist

3

này là khả thi nhưng nguy hiểm, vì nếu ai đó sau quyết định họ muốn làm cái gì đó để data1 trước khi các công cụ khác xảy ra với nó, họ có thể đặt nó ngay sau khi data1 đang sử dụng, nó sẽ đưa nó ra khỏi toàn bộ phạm vi sử dụng của data2. Điều này có thể sẽ phá vỡ trình biên dịch nhưng vẫn là lối tắt cú pháp vô nghĩa và nguy hiểm ..

+8

Người đó có lẽ nên xem xét một dòng công việc khác. – spoulson

+1

@ spoulson: đúng của rất nhiều người không làm, nhưng vẫn là công việc của chúng tôi để giữ mã như những người khác có thể duy trì được càng tốt, vì sợ rằng những người khác đã đặt lỗi trong mã của chúng tôi .. –

0

Như mọi người đã nói: chỉ có một dòng sau một tuyên bố nó sẽ hoạt động mà không có dấu ngoặc ôm. Tuy nhiên, mọi người đang bỏ bê thể hiện trong ví dụ của họ rằng một dòng có thể là một/nếu sử dụng/cho với niềng răng cong của riêng nó. Dưới đây là ví dụ:

if(foo) 
    if(bar) 
    { 
    doStuff(); 
    } 
Các vấn đề liên quan