2009-11-04 32 views
6

Tính tương thích ngược là mối quan tâm lớn đối với các nhà thiết kế ngôn ngữ, đặc biệt khi ngôn ngữ phổ biến như C#. Theo thời gian, các ngôn ngữ tích lũy các tính năng lỗi thời. Nó được coi là thực hành tốt để tránh các tính năng này, nhưng chúng được giữ trong ngôn ngữ để tương thích với các phiên bản cũ.Tính năng C# nào sẽ bị xóa nếu tính tương thích ngược không phải là vấn đề?

Những tính năng ngôn ngữ hoặc các thư viện lớp cơ sở trong C# nên được loại bỏ nếu khả năng tương thích ngược là không phải là một vấn đề?

Tôi không yêu cầu về tính năng mà một số nhà phát triển như và những người khác không ưa. Tôi quan tâm đến các tính năng được (khá nhiều) phổ biến được coi là tốt nhất tránh (có lẽ bởi vì bây giờ có một cách tốt hơn hoàn toàn để làm điều tương tự).

+2

Làm thế nào về GOTO? Như trong GOTO "chủ quan và tranh luận"? –

+0

Có cách nào tôi có thể tinh chỉnh câu hỏi sẽ thỏa mãn những người muốn đóng cửa không? Tôi nhận ra rằng những tính năng ngôn ngữ mà mỗi nhà phát triển thích là chủ quan, nhưng tôi nghĩ có một số thứ hầu như được coi là xấu. – ctford

+0

Tôi không chắc điểm của nó là gì ngoài việc "tranh luận", bỏ phiếu để đóng chủ quan và tranh luận. – user7116

Trả lời

16

ArrayList.

Không còn điểm nào trong việc sử dụng nó nữa. Danh sách <> là cách tốt hơn.

+6

Đây không phải là tính năng C#, đó là lớp BCL, nhưng tôi đồng ý. – configurator

+6

Ngoại trừ những trường hợp hiếm hoi mà bạn có thể thực sự muốn lưu trữ danh sách các loại đối tượng khác nhau. – Chris

+0

Chúng ta đang nói về các tính năng C#, hoặc các loại trong BCL? ArrayList là thứ hai, nhưng câu hỏi là về trước đây có vẻ như. –

1

Lớp ReaderWriterLock về cơ bản là vô nghĩa hiện có lợi cho lớp học ReaderWriterLockSlim, mà chính Microsoft nói là is recommended for all new development.

+1

Chỉ cần một nitpick: giống như các ví dụ khác, điều này phải làm với thư viện .Net, chứ không phải chính C#. –

+0

@Neil: Thật thú vị, tôi đã chỉ ra rằng trong câu trả lời ban đầu của tôi, nhưng sau đó nó đã được chỉnh sửa bí ẩn vì lý do nào đó. –

4

Tôi biết đây là một câu trả lời rõ ràng nhưng bất kỳ lớp, tài sản hoặc phương pháp đánh dấu bằng thuộc tính [Obsolete] có lẽ sẽ là người đầu tiên được gỡ bỏ.

+3

trừ khi tất nhiên nó cũng được đánh dấu [luân hồi (đúng)] –

-18

Danh sách chung (như được đề cập bởi Reshure) bao gồm "var". Tôi là người đề xuất khai báo một cách rõ ràng.

Edit: Tôi nghĩ mọi người đều ngang hàng "danh sách chung chung" với "Generics". Nếu bạn thích, "bộ sưu tập chưa được phân loại" chẳng hạn như Hashtable hoặc ArrayList.

+2

var là suy luận loại và không liên quan trực tiếp đến generics. Nó là khá nhiều cần thiết cho LINQ và giúp giảm các khai báo kiểu không cần thiết-verbose (mặc dù nó được mở để lạm dụng). Trong mọi trường hợp, nó sẽ không bị xóa khỏi ngôn ngữ ... – Lee

+0

Danh sách chung ??? Cũng không phải vì bạn không thích một tính năng mà nó nên được loại bỏ. –

+0

Yeesh. Tôi là tất cả cho bất cứ điều gì mà làm cho C# của tôi trông giống như HTML. – aehiilrs

-2

Từ của BCL:

  1. COM Interop
  2. StringCollection (Danh sách Chung)
  3. StringDictionary (Generic điển)
+1

Tôi sẽ không gọi COM Interop một cái gì đó chỉ liên quan đến "tương thích ngược". Có rất nhiều * mới * phát triển bản địa ra khỏi đó.COM Interop là một phần quan trọng cho interop này, ngay cả khi bạn không sử dụng COM cả. –

+0

Tôi sử dụng StringCollection khi tuần tự hóa các bộ sưu tập các chuỗi cho các thiết lập ứng dụng bằng cách sử dụng tính năng Visual Studio/.NET Framework Settings. – jasonh

13

Tôi đã nghe nói nhiều về C# nhà thiết kế đề cập rằng họ hối tiếc tạo mảng covariant.

+1

+1 Như đã giải thích rõ ở đây: http://blogs.msdn.com/ericlippert/archive/2009/09/24/why-is-covariance-of-value-typed-arrays-inconsistent.aspx – jpbochi

2

Loại không được niêm phong theo mặc định.

0

Trường System.IO.Path.InvalidPathChars. Sử dụng nó dẫn đến nguy cơ bảo mật, nhưng không có gì họ có thể làm về nó vì lý do tương thích.

+0

nguồn hoặc bài viết về điều này? – corymathews

2

Khi triển khai IEnumerable<T>, bạn sẽ phải triển khai IEnumerator<T> GetEnumerator() cũng như System.Collections.IEnumerator GetEnumerator() vì các lý do tương thích ngược.

+0

Trong thực tế, nó không chỉ vì lý do tương thích ngược. Nó cần phải có để hỗ trợ liệt kê bất kỳ 'IEnumerable' bất kể loại của nó. – jpbochi

1

Tham số hàm tạo thuộc tính được đặt tên.

Hiện tại, bạn thiết lập các thông số được đặt tên với:

[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = true)] 

Đây là từ thời điểm C# 1, nhưng bây giờ có nhà xây dựng đối tượng:

new Foo(explicit, values) { Implicit = value } 

nào sẽ cho kết quả như sau Công cụ tạo thuộc tính:

[AttributeUsage(AttributeTargets.Method) { Inherited = false, AllowMultiple = true }] 
Các vấn đề liên quan