2010-06-18 30 views
21

Tôi đã quá vui mừng khi khởi tạo đối tượng xuất hiện trong C#.C# đối tượng khởi tạo phức tạp. thực hành tốt nhất

MyClass a = new MyClass(); 
a.Field1 = Value1; 
a.Field2 = Value2; 

thể được viết lại ngắn hơn:

MyClass a = new MyClass { Field1 = Value1, Field2 = Value2 } 

đang Object initializer là rõ ràng hơn nhưng khi tính số nào đến chục và một số các giao dịch chuyển nhượng với giá trị nullable thật khó để gỡ lỗi nơi "null tham khảo lỗi "is. Studio hiển thị toàn bộ đối tượng khởi tạo làm điểm lỗi.

Ngày nay tôi sử dụng trình khởi tạo đối tượng để chỉ gán đơn giản cho các thuộc tính không có lỗi.

Làm cách nào để bạn sử dụng trình khởi tạo đối tượng cho phép gán phức tạp hoặc thực tế là sử dụng hàng tá các xác nhận?

Cảm ơn bạn trước!

Trả lời

17

Vâng, thịt bò chính của tôi với bộ khởi tạo đối tượng là chúng yêu cầu loại có thể thay đổi để bắt đầu: nếu có thể, tôi thích sử dụng các loại không thay đổi được. Có nói rằng, khi một đối tượng khởi tạo sẽ hoạt động (ví dụ: đối với điều khiển giao diện người dùng), tôi có xu hướng sử dụng chúng. Tôi có thể nghĩ hai lần nếu giá trị cho các bài tập đặc biệt phức tạp để tính toán - cụ thể, bạn phải có khả năng nhận giá trị trong một biểu thức đơn và điều đó có thể sẽ ít đọc hơn máy tính nó trên một số báo cáo ... nhưng đó là tương đối hiếm trong các tình huống mà điều này là khả thi để bắt đầu.

Tôi không thể nói rằng tôi đã gặp phải bất kỳ sự cố nào với các ngoại lệ trong quá trình gán thuộc tính với bộ khởi tạo đối tượng - nó không phải là thứ mà tôi nghĩ ra. Nếu nó đã làm, tôi có thể cố gắng để viết một bài kiểm tra đơn vị không anyway, lúc đó mã điểm thường trở nên dễ dàng để sửa chữa mà không có trình gỡ lỗi anyway. Rõ ràng là kiểm duyệt luôn luôn là một điều tốt - Tôi không đề nghị lấy điều này đến cực đoan ... nhưng nếu bạn đang thiết lập một chục tài sản, bằng cách sử dụng một khởi tạo đối tượng sẽ không được nhiều như một mối quan tâm với tôi như là một điều gì đó không tốt. có hàng tá thuộc tính để bắt đầu. Có bất kỳ thuộc tính nào trong số này có liên quan? Những người có nên được đóng gói với nhau bằng cách nào đó? (Trong một số trường hợp, phạt - một lần nữa, đặc biệt là với các điều khiển giao diện người dùng - nhưng thường là không.)

+1

Thông thường tôi có mã như vậy khi xử lý các đối tượng kinh doanh. Thuộc tính được điền từ giao diện người dùng hoặc đến từ các bảng khác nhau. –

+0

Tôi có xu hướng không thích khởi tạo đối tượng trong một DAO bởi vì bạn thường nhận được các lĩnh vực từ một người đọc và thường có cái gì đó có thể đi sai. Bạn không nhận được bất kỳ sự an toàn của trình biên dịch nào. Bạn không thể thực sự bảo vệ bản thân bằng một bài kiểm tra đơn vị trong trường hợp này bởi vì nó trở thành một bài kiểm tra tích hợp. Các thực thể trong DB thường có một vài trường liên kết với chúng. Tuy nhiên, nếu các bài tập là tầm thường, tôi sẽ sử dụng một bộ khởi tạo đối tượng. – uriDium

0

Tôi không bao giờ sử dụng nó trong mã đang được phát triển bởi vì khi bạn chỉ ra, khó gỡ lỗi hơn.

Đối với mã được kiểm tra tốt, nó có thể làm cho mã dễ đọc hơn, mặc dù có thể lập luận rằng bạn không nên rối tung với mã được kiểm tra và làm việc tốt để dễ đọc hơn.

Hãy nhớ, đối tượng khởi tạo đối tượng được giới thiệu ngôn ngữ chủ yếu để làm cho cú pháp LINQ hợp pháp. Điều đó không có nghĩa là nó nên được sử dụng rộng rãi hơn. Có nói rằng, nếu bạn đang thiết lập một loạt các thuộc tính trên một số điều khiển, thì việc thụt lề một mình có thể dễ dàng hơn để có cái nhìn tổng quát về nơi mà các điều khiển nhất định được đặt thuộc tính của chúng.

+0

"bạn không nên lộn xộn với mã được thử nghiệm và làm việc tốt chỉ để làm cho nó dễ đọc hơn" - bằng cách sử dụng một bộ khởi tạo đối tượng là một trong những cấu trúc lại an toàn nhất có. Bạn không phải là một fan hâm mộ của refactoring nói chung? –

+0

Có Jon, tôi đồng ý với bạn rất nhiều vào thời điểm đó. Refactor nơi nó có ý nghĩa. Nếu có hiệu suất đạt được được thực hiện và nếu mã có thể được thực hiện an toàn hơn và mạnh mẽ hơn. Chắc chắn, việc thay đổi các loại để được imutable như bạn đã đề cập trong câu trả lời của bạn là một thực hành tốt nhất. Nhưng việc tái cấu trúc lại để sử dụng bộ khởi tạo đối tượng thường không phải là cách sử dụng tốt thời gian của bất kỳ ai. –

+0

Bạn hoàn toàn có thể sử dụng LINQ mà không cần khởi tạo đối tượng (kể cả các loại ẩn danh, vì tôi nghĩ đó là ý của bạn), mặc dù nó sẽ khó đọc hơn nhiều. – ErikHeemskerk

3

Nếu bạn đang gỡ lỗi ứng dụng của mình thì bạn nên trong hầu hết các trường hợp vẫn có thể sử dụng công cụ gỡ lỗi của VS để xác định nhiệm vụ nào đang gây ra tham chiếu null.

Tuy nhiên, nếu bạn chia nhiệm vụ trên nhiều dòng, tôi nghĩ VS sẽ trỏ đến dòng ngay khi một ngoại lệ được ném:

MyClass a = new MyClass { 
        Field1 = Value1, 
        Field2 = Value2 }; 

Lưu ý: Tôi không làm điều này bản thân mình, vì vậy hãy nhẹ nhàng về phong cách đột phá của tôi (có thể).

+1

Không, không :) Studio của tôi làm nổi bật tất cả các dòng khởi tạo đối tượng khi lỗi đến và tôi không biết thuộc tính nào có vấn đề –

+0

Tôi hiểu. Sau đó, tôi đoán cho mục đích gỡ lỗi đó là loại của một gánh nặng, trừ khi bạn muốn di chuột qua mọi biểu thức bạn đang gán cho các trường và xem cái nào là rỗng. – ErikHeemskerk

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