2010-06-22 27 views
5
using (Font font3 = new Font("Arial", 10.0f), 
      font4 = new Font("Arial", 10.0f)) 
{ 
    // Use font3 and font4. 
} 

Tôi biết rằng nhiều đối tượng cùng loại có thể được sử dụng bên trong một mệnh đề sử dụng mệnh đề.Tôi có thể có các loại đối tượng khác nhau trong một khối C * bằng cách sử dụng * không?

Tôi có thể sử dụng các loại đối tượng khác nhau trong số sử dụng mệnh đề không?

Vâng tôi đã cố gắng nhưng mặc dù họ là tên gọi khác nhau và các đối tượng khác nhau, họ đã hành động như vậy = có cùng một tập hợp các phương pháp

Có cách nào khác để sử dụng lớp sử dụng với các loại khác nhau?

Nếu không, cách thích hợp nhất để sử dụng nó là gì?

Trả lời

28
using(Font f1 = new Font("Arial",10.0f)) 
using (Font f2 = new Font("Arial", 10.0f)) 
using (Stream s = new MemoryStream()) 
{ 

} 

Như vậy?

10

Không, bạn không thể thực hiện theo cách này, nhưng bạn có thể nest các khối using.

using (Font font3 = new Font("Arial", 10.0f)) 
{ 
    using (Font font4 = new Font("Arial", 10.0f)) 
    { 
     // Use font3 and font4. 
    } 
} 

hoặc như những người khác đã nói, nhưng tôi không khuyến nghị như vậy vì dễ đọc.

using(Font font3 = new Font("Arial", 10.0f)) 
using(Font font4 = new Font("Arial", 10.0f)) 
{ 
    // use font3 and font4 
} 
+10

phải trung thực - tôi thấy điều sau có thể đọc được nhiều hơn. Nếu bạn đang khởi tạo ba hoặc bốn mục (chẳng hạn như stream, streamreader, stream, streamwriter), việc lồng có thể hoàn toàn mất kiểm soát! Tôi đoán nó có lẽ là những gì bạn đang sử dụng để. –

+1

Điều này hoàn toàn phụ thuộc vào một cá nhân. Bạn sử dụng nó theo cách bạn thích hoặc thích. –

+0

Mặc dù nó không cần phải nói, nhất quán là điều quan trọng nhất ở đây. – etc

3

Bạn chỉ có thể có một loại đối tượng được khởi tạo trong mỗi khối using. Bạn có thể làm tổ những người như nhiều như bạn muốn, tuy nhiên:

using (Font font3 = new Font("Arial", 10.0f)) 
{ 
    using (Brush b4 = new Brush()) 
    { 

    } 
} 
+0

Thực ra, bạn có thể có nhiều đối tượng cùng loại, như câu hỏi hiển thị. – Codesleuth

2

Bạn có thể làm tổ họ:

using (Font font3 = new Font("Arial", 10.0f)) 
using (font4 = new Font("Arial", 10.0f)) 
{ 
    // Use font3 and font4. 
} 

Họ nên vứt bỏ theo thứ tự ngược (font4 đầu tiên).

EDIT:

Đây là giống hệt nhau như:

using (Font font3 = new Font("Arial", 10.0f)) 
{ 
    using (font4 = new Font("Arial", 10.0f)) 
    { 
     // Use font3 and font4. 
    } 
} 
+0

Bạn có liên kết đến tài liệu cho biết họ xử lý theo thứ tự ngược lại không? – Dolphin

+0

Tôi nghĩ rằng tôi đã nghe nó trên một khóa học, tuy nhiên, xếp chồng chúng cũng giống như lồng ghép chúng. Xem văn bản sửa đổi. –

+1

Nó dễ dàng nhận thấy từ ngữ pháp của các ngôn ngữ giống như C. Cú pháp của * using-statement * là: using (* initial initialization *) * statement * Lưu ý rằng cả việc xếp chồng và dấu ngoặc đều không rõ ràng là một phần của cú pháp. Chúng được ngụ ý bởi ngữ pháp đệ quy. Khi * statement * là một câu lệnh sử dụng, bạn sẽ bị xếp chồng. Khi * tuyên bố * là một * khối-tuyên bố *, bạn có niềng răng. –

6

Bạn có thể stack sử dụng câu lệnh để thực hiện điều này:

using(Font font3 = new Font("Arial", 10.0f)) 
using(Font font4 = new Font("Arial", 10.0f)) 
{ 
    // use font3 and font4 
} 
3

Bạn có thể bằng dấu phẩy phân định mục cùng loại - Vâng, tất cả những gì tôi biết là trình biên dịch không phàn nàn. Bạn cũng có thể ngăn xếp bằng cách sử dụng các câu lệnh() (sử dụng một tập hợp các dấu ngoặc {}) của các kiểu khác nhau.

http://adamhouldsworth.blogspot.com/2010/02/things-you-dont-know.html

+0

Tôi đã thực hiện một bình luận trên blog của bạn về ví dụ foreach theo liên kết của bạn. –

+0

Tại chỗ tốt, tôi đã thay đổi nó - nó trông giống như nó đã xảy ra, nhưng tất cả những gì đã xảy ra là trình biên dịch cho phép bạn bỏ qua các dấu ngoặc {}, nó chỉ là một forested lồng nhau. –

5

Mục đích sử dụng tuyên bố là để đảm bảo rằng các nguồn lực mua được xử lý một cách rõ ràng bằng một cuộc gọi đến Dispose phương pháp được cung cấp bởi các giao diện IDisposable. Đặc tả này không cho phép bạn có được các tài nguyên của các kiểu khác nhau bên trong một câu lệnh sử dụng duy nhất nhưng có câu đầu tiên trong đầu bạn có thể viết mã hoàn toàn hợp lệ này về trình biên dịch.

using (IDisposable d1 = new Font("Arial", 10.0f), 
    d2 = new Font("Arial", 10.0f), 
    d3 = new MemoryStream()) 
{ 
    var stream1 = (MemoryStream)d3; 
    stream1.WriteByte(0x30); 
} 

Tuy nhiên, Tôi không giới thiệu này và tôi coi đó là lạm dụng, vì vậy câu trả lời này chỉ là để nói rằng bạn có thể hack xung quanh nó nhưng có lẽ bạn không nên.

+0

Bình chọn để cho chúng tôi biết * không * làm gì. –

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