2010-03-02 40 views
8

Tôi mong đợi những đối số tùy chọn ngọt ngào từ những ngày tôi lập trình bằng C++. Tôi biết họ không tồn tại trong C#, nhưng câu hỏi của tôi là Tại sao phải là.Lý do cho C# không hỗ trợ các đối số mặc định/mặc định là gì?

Tôi nghĩ rằng quá tải phương thức là một sự thay thế kém khiến mọi thứ trở nên lộn xộn rất nhanh.

void foo(int x,int y,int z=0){ 
    //do stuff... 
} 

//is so much more clean than 

void foo(int x,int y){ 
    foo(x,y,0); 
} 
void foo(int x,int y,int z){ 
//do stuff 
} 

Tôi chỉ không hiểu lý do là gì. Trình biên dịch C# rõ ràng sẽ không gặp vấn đề gì khi chỉ hỗ trợ cho Microsoft.

Tại sao, khi C# được thiết kế, họ có muốn hỗ trợ các đối số tùy chọn không?

+0

Sam Ng viết blog về nó, Triết học! : http://blogs.msdn.com/samng/archive/2009/04/17/named-and-optional-arguments-ties-and-philosophies.aspx –

Trả lời

12

Như Andrey nói, C# 4 có các tham số tùy chọn đối số được đặt tên. Tuy nhiên, điều đáng chú ý là một trong những mối quan tâm khiến Anders miễn cưỡng đưa họ bắt đầu với - cụ thể là giá trị mặc định (phải là hằng số) được nướng vào mã số gọi - vẫn còn hiện diện. Nói cách khác, đó là cùng một vấn đề khi truy cập công khai các giá trị const có thể truy cập công khai từ C# 1.

+4

Đồng ý với điều này. Vấn đề là các vấn đề với các giá trị mặc định không được phần lớn các nhà phát triển sử dụng nó, nhận được phức tạp khi lắp ráp với tham số tùy chọn được cập nhật với * giá trị mặc định khác *.Mặt khác, các đối số được đặt tên là một đối số tốt để có các tham số tùy chọn ... – OregonGhost

+0

Tôi không mua đối số đó với các tham số tùy chọn. Khi thay đổi API công khai, người dùng sẽ phải thay đổi mã của họ để phản ứng với hành vi khác nhau bất kể bạn đang sử dụng phương thức quá tải hoặc tham số tùy chọn. – ChaosPandion

+0

@ChaosPandion: Dù bạn có mua hay không, đó là lý do mà Anders đã đưa ra trước đây. –

6

tôi nghĩ sẽ vô ích khi cố gắng trả lời câu hỏi "Tại sao?". Nhưng tôi có tin tốt, C# 4.0 có chúng.

+0

oooh, không biết. Tôi mong đợi nó! :) – Earlz

+0

Mặt khác, C# 4.0 có chúng cho khả năng tương tác dễ dàng hơn, không phải cho mục đích chung - hầu hết mọi người sẽ không hiểu điều đó và chỉ sử dụng chúng cho mọi thứ. Tôi không nghĩ đây là tin tốt. – OregonGhost

1

Đối số tùy chọn không đơn giản như vậy. Bạn có thể gặp các vấn đề phức tạp nếu bạn có các phương thức quá tải mà tất cả đều có các đối số tùy chọn. Quy tắc giải quyết có thể trở nên rất phức tạp rất nhanh chóng. Tôi đoán cho phiên bản đầu tiên của C# không có giải pháp tốt, vì vậy họ bỏ qua các thông số tùy chọn.

Nhưng bạn có thể biết rằng C# 4.0 sẽ có các đối số tùy chọn và được đặt tên, do đó, có vẻ như đó không phải là một ý tưởng tồi nói chung! ;-)

7

Nó chưa có, nhưng nó ở trong C# 4. Điều này phần lớn là chi phí và tính năng phù hợp với các phần chính mới của ngôn ngữ (chẳng hạn như Generics in .Net 2, hoặc linq trong 3). Các đối số tùy chọn sẽ phù hợp với các công cụ động mới sắp có trong phiên bản 4, do đó đã được bao gồm.

Để báo Eric Lippert (Ai được mình trích dẫn Eric Gunnerson) về việc tại sao nhiều tính năng dường như tốt không bao gồm:

(1) đây không phải là một quá trình trừ; chúng tôi không bắt đầu với C++ hoặc Java hoặc Haskell và sau đó quyết định có để lại một số tính năng của chúng. Và (2) chỉ là một tính năng tốt là không đủ. Các tính năng phải hấp dẫn đến nỗi chúng đáng giá với chi phí khổng lồ về thiết kế, triển khai, thử nghiệm, ghi chép và vận chuyển đối tượng địa lý. Họ phải có giá trị chi phí phức tạp ngôn ngữ và làm cho nó khó khăn hơn để thiết kế các tính năng khác trong tương lai.

+0

+1 cho sự phức tạp gia tăng trong các tính năng khác trong tương lai , mặc dù tôi thích các đối số mặc định. – dsimcha

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