2010-06-03 45 views
52

Tôi nghĩ rằng không bắt buộc phải có hàm tạo mặc định trong lớp (C#).Hàm khởi tạo trống hoặc không có hàm tạo nào

Vì vậy, trong trường hợp đó, tôi sẽ có một hàm khởi tạo trống trong lớp hoặc tôi có thể bỏ qua nó không?

Thực tiễn tốt nhất để có một hàm tạo mặc định rỗng?

Class test 
{ 
    public test() 
    { 

    } 
     ...... 
} 

hoặc

Class test 
{ 
     ...... 
} 

Trả lời

56

Nếu lớp không được các bên thứ ba sử dụng và bạn không cần một hàm tạo quá tải, không viết một hàm tạo rỗng.

Nhưng ...

Hãy tưởng tượng bạn đã chuyển sản phẩm và bên thứ ba sử dụng lớp học của bạn. Một vài tháng sau đó có một yêu cầu mới mà làm cho bạn thêm một constructor với một đối số.

Bây giờ, bằng cách làm như vậy, trình biên dịch C# không còn tạo ra một hàm tạo mặc định nữa. Nếu bạn không thêm một hàm tạo rỗng, mã của bên thứ ba sẽ bị ngắt.

Theo ý kiến ​​của tôi, bạn nên luôn luôn định nghĩa các hàm tạo rỗng (một lớp lót) cho các lớp công khai được các bên thứ ba sử dụng.

+3

Về một chủ đề khác, nếu bạn muốn sử dụng lớp .NET của bạn trong một chương trình COM, một hàm khởi tạo không có công khai sẽ là bắt buộc - vì những lý do tương tự như Soe Moe đã giải thích, tôi sẽ đưa nó vào lớp một cách rõ ràng. –

+7

Bạn có thể tranh luận rằng các bài kiểm tra đơn vị của riêng bạn sẽ thất bại nếu bạn định chia khách hàng của bên thứ ba theo cách này. – Jon

+0

Đôi khi đơn giản hóa cách tiếp cận của bạn bằng thói quen sử dụng một mẫu nhất định là tốt. Đó là lý do của tôi để sử dụng dấu chấm phẩy javascript (vì tôi không muốn nhớ khi nào chúng cần thiết khi chúng lộn xộn). Tuy nhiên tôi nghĩ trong trường hợp này tôi sẽ dựa vào các bài kiểm tra đơn vị để bắt lỗi thay vì đặt các nhà thầu trống ở khắp mọi nơi. Sở thích cá nhân tôi cho là. Bất kể, câu trả lời này là tuyệt vời vì nó cho thấy logic lý do tại sao người ta muốn thêm một cách rõ ràng các nhà thầu rỗng. – aaaaaa

32

KISS - Nếu lớp học của bạn không cần phải làm bất cứ điều gì trong constructor mặc định - không xác định nó. Trình biên dịch sẽ tạo ra một cho bạn.

Từ horse's mouth:

Trừ lớp là tĩnh, các lớp học mà không nhà xây dựng được cho một constructor mặc định công bởi trình biên dịch C# để cho phép lớp instantiation.

+3

Để làm rõ: Nếu lớp của bạn * có * ít nhất một hàm tạo có một hoặc nhiều tham số, thì trình biên dịch C# sẽ * không * tạo hàm tạo mặc định cho bạn. Trong trường hợp đó, bạn * có thể * muốn tạo một cách rõ ràng một hàm tạo mặc định, ngay cả khi nó không làm bất cứ điều gì (tức là nó rỗng). (Xem câu trả lời được chấp nhận và những người khác để biết thêm.) – DavidRR

2

Theo mặc định C# sẽ thêm hàm tạo tham số 0 cho bạn. Vì vậy, không thêm một nếu bạn không có bất cứ điều gì đặc biệt để làm ở đó.

Bạn sẽ phải tự thêm bất kỳ hàm tạo lập trình trống nào - ngay cả khi không có mã - nếu bạn có một hàm tạo khác có tham số và muốn giữ cho hàm tạo ít tham số còn sống.

Một kịch bản mà bạn muốn thêm một constructor tham số ít sản phẩm nào là nếu bạn muốn thay đổi sửa đổi lần truy cập của nó từ công chúng đến cái gì khác (tư nhân, bảo vệ hoặc nội bộ)

2

Các biên dịch C# sẽ tạo ra mặc định constructor cho bạn, vì vậy bạn không nên viết một parameterless, với một cơ thể trống rỗng.

+0

Người lập trình kinh nghiệm đã nói với tôi rằng việc không có vấn đề đã gây ra sự cố cho họ trong tương lai, ví dụ: các lớp tĩnh – Coops

1

Không viết hàm khởi tạo trống nó sẽ được tạo theo mặc định

8

There's nothing like default constructors. Đó là hàm tạo ít tham số công khai trong C#. Trình biên dịch C# sẽ tìm kiếm các hàm tạo trong một lớp trong khi biên dịch và sẽ thêm một hàm tạo ít tham số công khai nếu không có các hàm tạo nào được định nghĩa. Vì vậy, nó là ok để bỏ qua xác định một constructor nếu đối tượng lớp của bạn không cần bất kỳ hoạt động đặc biệt để xây dựng. Thứ hai, nếu bạn định nghĩa một hàm tạo với tham số thì trình biên dịch sẽ không thêm một hàm tạo ít tham số công khai vì trình biên dịch sẽ giả định các đối tượng của bạn phải được xây dựng thông qua hàm tạo mà bạn đã định nghĩa. Có nói rằng, bạn phải xác định rõ ràng một constructor tham số-ít nếu bạn có ít nhất một constructor parameterized, nếu bạn cần các đối tượng của bạn để xây dựng với constructor parameteress.

Bạn cũng có thể có một hàm tạo không tham số riêng tư cũng là công cụ tạo các lớp đơn.

2

Lần duy nhất tôi sẽ bao gồm một hàm tạo tham số rỗng là nếu tôi muốn hàm tạo là riêng tư hoặc nếu tôi muốn một hàm tạo tham số gọi một quá tải khác bằng null làm tham số. BTW, trong ví dụ của bạn ở trên, bạn đã tạo ra hàm tạo của Test bằng cách không xác định công khai.

class Foo 
{ 
    public Foo() 
     : this(null) 
    { 
    } 

    public Foo(string bar) 
    { 
     if (bar != null) 
     { 
      Console.WriteLine(bar); 
     } 
    } 
} 
+0

Tôi đã sửa đổi mã. – Ram

+0

OK, lý do tôi lưu ý là vì một hàm tạo riêng có thể hữu ích cho việc buộc người dùng trong lớp của bạn sử dụng bất kỳ phương thức nào mà bạn có thể quyết định đưa vào lớp của bạn. Ví dụ lớp Foo của tôi có thể có một phương thức công khai tĩnh Foo CreateFoo() và không có các hàm tạo công khai nào. – Nate

5

Nếu bạn không cần một hàm tạo tham số, đừng thêm một cơ sở trống. Tuy nhiên, nếu ai đó muốn serialize/deserialize đối tượng của lớp học của bạn, sau đó bạn sẽ cần một constructor parameterless.

Nếu bạn xác định không có nhà thầu, trình biên dịch sẽ tự động tạo một tham số mặc định cho bạn, nhưng sẽ không nếu bạn tự định nghĩa một hàm tạo.

Ngẫu nhiên, bạn có thể chặn trình tạo mặc định được tạo tự động của trình biên dịch C# bằng cách xác định một hàm tạo riêng, trống.

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