Các tính năng C # hoặc .Net để cắt đứt giả sử không cần tương thích ngược? [đóng cửa]


18

Bất kỳ sản phẩm hoặc khung phát triển. Chủ yếu là nó được thực hiện để bắt kịp nhu cầu của người dùng, tận dụng sức mạnh tính toán mới và chỉ đơn giản là làm cho nó tốt hơn. Đôi khi mục tiêu thiết kế chính cũng thay đổi với sản phẩm. Khung C # hoặc .net cũng không ngoại lệ. Như chúng ta thấy, phiên bản thứ 4 ngày nay khác rất nhiều so với phiên bản đầu tiên. Nhưng điều này đến như một chướng ngại vật cho sự tương thích ngược tiến hóa này.

Trong hầu hết các khung / sản phẩm, có các tính năng sẽ bị cắt nếu không cần hỗ trợ tương thích ngược. Theo bạn, những tính năng này trong C # /. Net là gì?

Hãy đề cập đến một tính năng cho mỗi câu trả lời.



4
Câu hỏi rõ ràng là không mang tính xây dựng theo các hướng dẫn, và rõ ràng mang tính xây dựng dựa trên các câu trả lời tuyệt vời. Bỏ phiếu để mở lại.
psr

1
xấu hổ vì nó đóng cửa, vẫn có thể Eric sẽ viết blog này thay vì trả lời ở đây?
jk.

Câu trả lời:


35

Phương pháp ẩn danh . Tôi nghĩ rằng mọi người đều đồng ý rằng cú pháp phương thức ẩn danh được chọn cho C # 2.0 là chunky và cồng kềnh so với cú pháp lambda mà chúng tôi đã thêm vào C # 3.0. Thật đáng tiếc khi có hai cú pháp gần như giống hệt nhau để làm điều tương tự.


1
Đồng ý, phương pháp ẩn danh là tuyệt vời khi chúng tôi không có lambdas ... bây giờ chúng chỉ là dư thừa.
Michael Brown

9
Có một tính năng đặc biệt của các phương thức ẩn danh tốt hơn nhiều so với biểu thức lambda .... tên hoàn hảo của chúng !!
thám hiểm

1
Tại thời điểm này, tôi thậm chí không nhớ cú pháp cho một phương thức ẩn danh trong C #. Tôi sẽ phải tìm kiếm nó nếu vì một lý do kỳ quái nào đó tôi cần sử dụng nó thay vì lambda.
Kyralessa

33

Tôi sẽ thoát khỏi các bộ sưu tập Không chung chung. Chúng là một thứ gớm ghiếc ... và có quá nhiều trường hợp tôi đang sử dụng linq và phải làm một cái gì đó như

var customObjects = container.CustomObjects.Cast<CustomObject>();

Mỗi lần tôi phải làm điều đó, một phần nhỏ trong tâm hồn tôi chết đi.


Điều này là quá tuyệt vời.

1
Không phải tất cả các cổng của .NET đều hỗ trợ Generics. .NET Micro là một ví dụ. Có thể không áp dụng nếu CustomObjects sẽ không bao giờ chuyển sang nền tảng này.
goodguys_activate

2
Đó là lợi thế để không có linh hồn.
CaffGeek

29

void như một loại . Tại sao trên trái đất là "void" một loại? Nó không có phiên bản, nó không có giá trị, bạn không thể sử dụng nó làm đối số loại chung, loại tham số chính thức, loại cục bộ, loại trường hoặc loại thuộc tính. Nó không có ý nghĩa như một loại; đúng hơn, đó là một thực tế về tác động của một cuộc gọi phương thức đối với ngăn xếp của máy ảo. Nhưng máy ảo chỉ có thế: một máy ảo. Máy thật sẽ đặt giá trị trả về vào một thanh ghi (thường là EAX trên x86) và hoàn toàn không ảnh hưởng đến ngăn xếp! Vô hiệu như một loại chỉ là một ý tưởng tồi xung quanh.

Tệ hơn: khi được sử dụng trong một loại con trỏ như trong void*nó có nghĩa là một cái gì đó hoàn toàn khác với những gì nó có nghĩa là khi được sử dụng như một loại trả về. Bây giờ nó có nghĩa là "một con trỏ đến một vị trí lưu trữ không xác định", không liên quan gì đến ý nghĩa của nó là "một phương thức không trả về bất kỳ giá trị nào".

Chúng ta có thể thay thế void*như một loại con trỏ với IntPtr. (Và void**với IntPtr*và vân vân.) Chúng tôi có thể thay thế khoảng trống như một kiểu trả về với "Đơn vị", một loại mà có một giá trị duy nhất, cụ thể là, null. Việc triển khai CLR sau đó có thể quyết định rằng một lệnh gọi hàm đơn vị có thể tối ưu hóa việc sử dụng các thanh ghi hoặc ngăn xếp của nó một cách thích hợp, biết rằng null được "trả về" có thể được bỏ qua một cách an toàn.

Trong một thế giới như vậy, bạn không còn cần tách biệt Func<A, R>Action<T>đại biểu. Action<T>chỉ là Func<T, Unit>.


4
... Và Taskchỉ là một Task<Unit>. Thực hiện lại các bit thư viện của CTP async khiến tôi thực sự mong muốn điều này ...
Jon Skeet

24

Những tuyên bố trống rỗng; . Dễ bị lỗi, hầu như luôn luôn là một lỗi đánh máy và không cung cấp cho bạn ý nghĩa bổ sung nào chưa được thể hiện bằng {}.


7
Chưa kể hình phạt hiệu suất khổng lồ theo JIT 64 bit </ snark>.
Jesse C. Choper

7
Một tuyên bố trống có một hình phạt hiệu suất? Tại sao vậy?
quentin-starin

22

Hiệp phương sai không an toàn trên mảng kiểu tham chiếu . Với hiệp phương sai kiểu trên IEnumerable<T>, ít nhất một số nhu cầu về hiệp phương sai mảng đã biến mất. (Nếu chúng ta có giao diện danh sách chỉ đọc covariant thì chúng ta sẽ không cần đến nó.)


Tôi hoàn toàn sẽ viết nó xuống khi tôi thấy tiêu đề câu hỏi - bạn đánh bại tôi với nó :(
Chris Smith

1
Khả năng nhận được một tham chiếu mảng covariant và ghi một cách an toàn vào các tham chiếu mảng được đọc từ nó là hữu ích. Nếu giống như IList<T>được kế thừa từ IReadableList<out T>và không chung chung IPemutable, nó có thể hỗ trợ những thứ như sắp xếp, nhưng mảng hỗ trợ dễ dàng hơn.
supercat

14

Toán tử đơn nguyên cộng . Toán tử hữu ích nhất mọi thời đại. Nếu chúng ta không phải giữ nó cho compat ngược, tôi sẽ lấy nó ra trong tích tắc. Ai sử dụng thứ này, có ai không?

(Làm rõ: Toán tử cộng đơn +xkhông phải là toán tử preincrement ++x, không phải toán tử postincrement x++và không phải là toán tử cộng nhị phân x+y.)


1
for (int i = 0; i <trần; i ++)
Michael Brown

13
Anh ấy không nói về các toán tử preincrement và postincrement: anh ấy nói về dấu cộng đơn phương, ngược lại với dấu âm trên một số : +1 == 1. Nó khá gần với một no-op.
Jesse C. Choper

8
Nó không chỉ là về hiệu ứng trên đầu ra có thể đọc được của máy, nó có thể cải thiện giao diện mã cho con người : if(a == +1 || a == -1){...}.
Thomas Bratt

5
@ShuggyCoUK: Điều đặc biệt kỳ lạ về nó là nó quá tải . Bởi vì điều đó xảy ra rất nhiều. Bạn biết đấy, cách bạn viết một số JavaScript và bạn nghĩ như thế nào , tôi ước rằng JS cho phép tôi tạo ra ngữ nghĩa đơn phương cộng với toán tử do người dùng định nghĩa như C # .
Eric Lippert

2
@Eric Tôi không nhận ra nó quá tải. wow, bạn có thể thực hiện một số hành vi khó chịu với điều đó :)
ShuggyCoUk

12

Mặc định chữ số thành double

Đối với hầu hết các ứng dụng kinh doanh , decimaldù sao thì cũng phù hợp hơn ... hoặc có lẽ sẽ tốt hơn nếu chỉ xóa ý tưởng về mặc định và buộc nhà phát triển thực sự đưa ra lựa chọn.

(Việc "xóa mặc định" cũng phù hợp với một số thứ khác. Ví dụ, tôi đã từ bỏ việc cố gắng thuyết phục mọi người rằng các lớp nên được niêm phong theo mặc định, nhưng tôi nghi ngờ việc thuyết phục mọi người rằng họ nên nghĩ về nó dễ dàng hơn liệu lớp mới của họ có nên được niêm phong hay không và làm cho nó rõ ràng.)


Có lẽ tôi muốn xác định những chữ có nghĩa là một giá trị không thể được biểu diễn dưới dạng gấp đôi / chính xác ...
ShuggyCoUk

Nếu họ vào Java - hãy giới thiệu chúng đến các văn bản thiêng liêng của Joshua Bloch "thiết kế hoặc tài liệu để thừa kế hoặc nếu không thì cấm" martinfowler.com/bliki/DesignInherribution.html IIRC kotlin mặc định niêm phong các lớp, vì vậy ngành công nghiệp đang chuyển sang một hướng tốt hơn trong khía cạnh này.
Elazar Leibovich

Tại sao các lớp nên được niêm phong?
James

@James: Vì chính xác những lý do Josh đưa ra. Thiết kế một lớp cho phép kế thừa theo cách hợp lý, nhất quán cần có thời gian - và làm như vậy mà không biết kế thừa sẽ được sử dụng như thế nào thậm chí còn tồi tệ hơn.
Jon Skeet

1
@Pacerier: Chẳng hạn, hãy nghĩ về sự bất biến. Một lớp không niêm phong không thể tuyên bố là bất biến, vì các lớp con có thể đưa ra khả năng biến đổi.
Jon Skeet

7

Đây là một hướng dẫn hơn là một tính năng, nhưng tôi nghĩ nó quan trọng bởi vì nó đã ăn sâu vào tâm trí của mọi người như là giải pháp kinh điển và tốt nhất:

Các mô hình chính thức để thực hiện IDisposable.

Đó là cồng kềnh và có những cách tốt hơn .


6

Tôi biết có sự khác biệt lớn giữa các lớp hẹn giờ khác nhau. Nhưng dù sao chúng ta cũng không thể thoát khỏi một hoặc hai trong số họ?


4

Các phương thức và loại ArrayList<T>đã trở nên lỗi thời với Linq, ví dụ:

  • Array.TrueForAll có thể được thay thế bằng Enumerable.All
  • Array.FindAll có thể được thay thế bằng Enumerable.Where
  • List<T>.ConvertAll có thể được thay thế bằng Enumerable.Select
  • Predicate<T> có thể được thay thế bằng Func<T, bool>
  • Converter<T,R> có thể được thay thế bằng Func<T, R>
  • IComparer<T> thực sự nên là một đại biểu Func<T, T, int>

3
Tôi thích Predicate<T>bởi vì nó nắm bắt được ý định về cách sử dụng chức năng và tiết kiệm một chút gõ.
Zebi

2

Các đại biểu không chung chung Giống như các bộ sưu tập không chung chung, các đại biểu không chung chung bây giờ vô dụng khi chúng ta có chuỗi Func và Action. Và tôi đã cắt bỏ các biến thể ở ba tham số. Nếu bạn có nhiều hơn ba tham số, tạo cấu trúc và sử dụng tham số đó làm tham số đơn. Tuyên bố một đại biểu cụ thể để xử lý sự kiện không phải là rất DRY.


3
Làm thế nào bạn sẽ xác định một đại biểu cho một phương thức có một tham chiếu int với Action hoặc Func? Làm thế nào bạn sẽ xác định một tổ hợp với Func? Đó là, không có cách nào để nói "đại biểu DD (D d);" với Func.
Eric Lippert

2
hmmm ... tôi đứng chính xác Đó là lý do tại sao tôi rời bỏ công việc tạo ra các công cụ tôi sử dụng trong bàn tay có khả năng của bạn;)
Michael Brown

@EricLippert: Tôi muốn thấy một lớp đại biểu đặc biệt thông qua phép thuật CLR chứa các đại biểu "mọi" và kết hợp các tham số giá trị / tham chiếu [tìm kiếm một đại biểu trong lớp ma thuật với tên được định dạng phù hợp sẽ tạo ra loại] và có tất cả các đại biểu chữ ký thích hợp kế thừa từ đó. Mã muốn một đại biểu cụ thể vẫn sẽ yêu cầu một loại chính xác, nhưng mã muốn có một chữ ký cụ thể có thể sử dụng tên ma thuật.
supercat

-1

Dịch vụ web asmx

Tôi nghĩ rằng họ khá lỗi thời với WCF ngày nay.


6
Vâng, nhưng đôi khi dễ dàng hơn nhiều để mò mẫm. . .
Wyatt Barnett

-2

Winforms
Thật tốt khi không phải điều hướng giữa hai nền tảng máy tính để bàn. WPF là nơi mọi thứ đang diễn ra, vì vậy thật bực bội khi có sự dư thừa ở cấp độ nền tảng.


Winforms có vẻ ổn định hơn, nhanh hơn và ít lỗi hơn WPF ...
Pacerier

Khi bạn chỉ cần hack một ứng dụng máy tính để bàn nhỏ, WPF là quá mức cần thiết.
Kyralessa

Có vẻ như ở giữa WPF đã trở nên khá lỗi thời khi ủng hộ WinRT. Tuy nhiên, với tôi có vẻ như Winforms sống động hơn WPF trong phát triển kinh doanh. Xem thêm stackoverflow.com/questions/913417/ Mạnh
Doc Brown
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.