2010-07-19 27 views
8

tôi thấy một số mã được viết bởi một nhà phát triển trông giống như thế này:Trình diễn lớp đơn giản có bao giờ thất bại trong C# không?

var stringBuilder = new StringBuilder(); 

if(stringBuilder == null) 
{ 
    // Log memory allocation error 
    // ... 
    return; 
} 

(Đó là TẤT CẢ qua địa điểm trong mã)

Câu hỏi 1: có mã lỗi khai thác gỗ thậm chí được gọi ? Nếu không có bộ nhớ, sẽ không phải là System.OutOfMemoryException được ném trên dòng đầu tiên đó?

Câu hỏi 2: Cuộc gọi đến nhà xây dựng có bao giờ trả về không?

+2

Về mặt kỹ thuật nó có thể cho các lớp proxy và nullables, như Marc Gravell đã chỉ ra, nhưng đó là một trường hợp bệnh lý như vậy mà nó không đáng xem xét: http://stackoverflow.com/questions/194484/whats-the- strangest-corner-case-youve-seen-in-c-hoặc-net –

Trả lời

16

Bạn chính xác và mã đó sai. Nó sẽ ném OutOfMemoryException trên một thất bại. Đây là rõ ràng trong the documentation:

"Nếu các nhà điều hành mới thất bại trong việc cấp phát bộ nhớ , nó ném OutOfMemoryException ngoại lệ ."

Các nhà xây dựng không trả lại bất kỳ điều gì, đừng nói một mình. Họ thao tác một đối tượng đã được phân bổ.

2

Giả định của tôi là trình mã hóa được sử dụng để hoạt động trong C++ và không biết cách hoạt động của C#.

+4

Mã này cũng sai đối với C++. C++ 'new' ném' bad_alloc' khi phân bổ không thành công, trừ khi bạn nói rõ ràng là không. –

+0

Đó chính là điều mà một trong những thực tập sinh đã nói ở đây. Bản thân tôi đã không chạm nhiều C++, và không phải trong một thời gian dài. Cảm ơn. –

+0

@Matthew: yes - nếu bạn đang sử dụng Standard C++ (và biết bạn đang làm gì). Tiền chuẩn C++ trả về null, và rõ ràng tác giả không giữ kỹ năng của mình. –

1
  1. No. An OutOfMemoryException sẽ bị ném nếu không có đủ bộ nhớ để phân bổ đối tượng.
  2. Không
2

Bây giờ, mã này là một câu chuyện khác nhau:

StringBuilder stringBuilder = null; 

try { stringBuilder = new StringBuilder(); } catch(Exception) {} 

if(stringBuilder == null) 
{ 
    // Log memory allocation error 
    // ... 
    return; 
} 

Trong trường hợp đó, chuỗi builder thể (hình dung) được null.

+1

Thực ra, StringBuilder sẽ không là 'null', nó sẽ không được khởi tạo. – Toby

+2

Thực ra, nó thậm chí sẽ không biên dịch. Nhưng tôi nghĩ rằng tất cả chúng ta có thể giả định Brian có nghĩa là để viết 'StringBuilder stringBuilder = null;' thay vào đó :) –

+2

Xin lỗi các bạn. Sửa mã trong ví dụ. Ai cần trình biên dịch? Tôi chỉ nên viết một dịch vụ gửi mã của tôi đến SO để được đánh giá :) –

0

Đây là phiên bản tốt hơn của mã. Bạn sẽ có nhiều vấn đề lớn hơn nếu không có đủ bộ nhớ để phân bổ một tham chiếu mặc dù.

StringBuilder stringBuilder = null; 

try { 
    stringBuilder = new StringBuilder(); 
} 
catch(OutOfMemoryException) { 
    // log memory error 
} 
Các vấn đề liên quan