2008-09-19 87 views
6

Từ Wikipedia:Tại sao C# và VB có Generics? Họ cung cấp những lợi ích gì? Generics, FTW

lập trình Generic là một phong cách của lập trình máy tính, trong đó thuật toán được viết về to-be-định-sau loại mà là sau đó khởi tạo khi cần thiết cho các loại cụ thể được cung cấp dưới dạng tham số và được tiên phong bởi Ada mà xuất hiện vào năm 1983. Cách tiếp cận này cho phép viết các chức năng phổ biến hoặc các loại khác nhau chỉ trong tập hợp loại hoạt động khi được sử dụng, do đó giảm trùng lặp.

Generics cung cấp khả năng xác định các loại được chỉ định sau. Bạn không phải truyền các mục vào một loại để sử dụng chúng vì chúng đã được nhập.

Tại sao C# và VB có Generics? Họ cung cấp những lợi ích gì? Bạn thấy lợi ích gì khi sử dụng chúng?

Những ngôn ngữ khác cũng có tính năng generics?

Trả lời

6

C# và VB có generics để tận dụng lợi thế của generics hỗ trợ trong CLR cơ bản (hoặc là cách khác xung quanh?). Chúng cho phép bạn viết mã ina bằng ngôn ngữ tĩnh có thể áp dụng cho nhiều loại loại mà không cần viết lại mã cho từng loại bạn sử dụng cho chúng (thời gian chạy sẽ làm điều đó cho bạn) hoặc sử dụng System.Object và đúc ở khắp mọi nơi (như chúng tôi đã làm với ArrayList).

Bạn đã đọc article chưa?

Những ngôn ngữ này cũng có Generics:

  • C++ (thông qua mẫu)
  • Ada (thông qua mẫu)
  • Eiffel
  • D (thông qua mẫu)
  • Haskell
  • Java
+0

Có một số khác biệt giữa generics và mẫu. C++, Ada và D có sau, không chắc về phần còn lại. – BCS

+2

Mẫu vẫn cho phép viết bằng generics, ngoài các nội dung khác. –

0

Ví dụ phổ biến là bộ sưu tập. ví dụ. một tập hợp kiểu T, như một phương thức Add (T) và phương thức T get(). Cùng mã, các loại bộ sưu tập an toàn khác nhau.

C++, D, Ada và những người khác có mẫu, một bộ siêu khổng lồ mà làm điều đó một lỗi nhỏ khác nhau có cùng kết quả cuối cùng (và sau đó một số).

IIRC Java có Generics, nhưng tôi không làm Java.

0

Cách dễ nhất để giải thích là đưa ra một ví dụ. Giả sử bạn muốn hai hashtables, một trong đó ánh xạ các đối tượng của chuỗi kiểu để nhập int và một ánh xạ các đối tượng của chuỗi kiểu để gõ đúp. Bạn có thể định nghĩa Hashtable và sau đó sử dụng các loại K và V. Nếu không có generics, bạn sẽ phải sử dụng loại 'đối tượng', ngoài việc phải được đúc để có ý nghĩa, từ bỏ an toàn. Chỉ cần khởi tạo Hashtable và Hashtable và bạn đã có bảng băm của bạn với typechecking thích hợp và tất cả.

0

Java cũng có generics. C++ có các mẫu.

Các ngôn ngữ động như Perl và Javascript không có cùng giới hạn loại để chúng có được hầu hết các lợi ích giống với ít công việc hơn.

+0

Không phải là lợi ích, bởi vì họ không cung cấp bất kỳ loại an toàn nào cả. – Thomas

+0

Có nhiều lợi ích hơn cho các bộ sưu tập chung hơn loại an toàn. – Wedge

2

Từ MSDN:

Generics cung cấp các giải pháp cho một giới hạn trong các phiên bản trước đây của runtime ngôn ngữ chung và C# ngôn ngữ, trong đó tổng quát là thực hiện bằng cách đúc các loại đến và từ phổ thông loại đối tượng cơ sở. Bằng cách tạo một lớp học chung chung, bạn có thể tạo một bộ sưu tập an toàn loại lúc biên dịch.

Đọc phần còn lại của bài viết đó để xem một số ví dụ về cách Generics có thể cải thiện khả năng đọc và hiệu suất của mã của bạn.

5

Cá nhân, tôi nghĩ rằng chúng cho phép tiết kiệm rất nhiều thời gian. Tôi vẫn đang sử dụng .NET Framework 1.1 và mỗi khi bạn muốn có một bộ sưu tập cụ thể, bạn cần tạo một bộ sưu tập mạnh mẽ bằng cách thực hiện CollectionBase. Với Generics, bạn chỉ cần khai báo bộ sưu tập của mình như thế là List<MyObject> và nó được thực hiện.

2

Có lẽ cách sử dụng phổ biến nhất đối với họ là có ArrayLists được nhập mạnh mẽ. Trong .NET 1.1, bạn cần phải bỏ tất cả mọi thứ từ đối tượng đến kiểu mong muốn của bạn, hoặc sử dụng một cái gì đó như CodeSmith để tạo ra một ArrayList được gõ mạnh mẽ.

Ngoài ra, chúng giúp giảm boxing. Một lần nữa, trong .NET 1.x, nếu bạn cố gắng sử dụng một ArrayList với một kiểu giá trị, bạn sẽ kết thúc boxing và unboxing các đối tượng trên khắp nơi. Generics tránh điều đó bằng cách cho phép bạn định nghĩa Type, cho dù là Reference hay Value.

Có sử dụng hữu ích khác đối với họ quá, xử lý sự kiện, LINQ truy vấn vv

1

Generics trong .NET là tuyệt vời cho bộ sưu tập đối tượng. Bạn có thể định nghĩa kiểu đối tượng của mình tuy nhiên bạn muốn và có thể có một Danh sách mà không cần viết bất kỳ mã nào cho nó, và có quyền truy cập vào tất cả các chức năng hiệu quả của bộ sưu tập chung của .NET List trong khi gõ an toàn cho T. công cụ tuyệt vời.

0

Trong mục tiêu-C bạn có thể sử dụng các giao thức để đạt được mục đích của generics. Tuy nhiên, vì ngôn ngữ bị đánh máy yếu, nó thường không quan tâm nhiều như khi bạn đang chiến đấu với hệ thống kiểu để sử dụng một đường dẫn mã cho nhiều loại.

1

Generics được xây dựng dựa trên khái niệm mẫu trong C++ nếu bạn đã quen thuộc với chúng.

của nó một cách để thực hiện một thuật toán hoặc dữ liệu cấu trúc nhưng trì hoãn các loại thực tế nó được sử dụng trên.

Danh sách sau đó có thể được gán với bất kỳ loại của sự lựa chọn int, chuỗi của bạn và thậm chí cả các loại tùy chỉnh kiểu được gán vào xây dựng danh sách. Nhưng bạn sẽ có thể sử dụng danh sách các hoạt động thêm loại bỏ, vv

Bạn thực sự có thể tiết kiệm rất nhiều công sức viết mã bởi làm quen với Generics. Và bạn không cần phải bỏ hộp và mở hộp giữa các loại.

Java cũng có cả Generics. Chúng được gọi là ký tự đại diện.

1

Generics trong .net, như thừa kế và mở rộng các phương pháp, cho phép giảm sự trùng lặp mã. Hãy để tôi giải thích bằng cách tái cấu trúc.

Nếu tất cả các lớp học với một tổ tiên chung có một phương pháp phổ biến, đặt phương pháp phổ biến trong tổ tiên chung của lớp (thừa kế).

Nếu một số lớp học có một phương pháp phổ biến mà sử dụng một hợp đồng nào để đạt được kết quả nào đó, làm cho các phương pháp phổ biến thành một phương pháp khuyến nông trên mà hợp đồng nào.

Nếu một số phương thức hoặc lớp có cùng mã chỉ khác nhau theo loại được kích hoạt (đặc biệt là khi các chi tiết của loại không liên quan đến hoạt động của phương thức), hãy thu thập các phương thức hoặc lớp đó vào chung chung.

1

Chúng tăng hiệu suất cho các bộ sưu tập bằng cách sử dụng các loại giá trị, vì không yêu cầu boxing/unboxing. Chúng dễ sử dụng hơn vì bạn sẽ không phải cast một đối tượng (ví dụ sử dụng ArrayList) cho kiểu mong muốn - và tương tự như vậy chúng giúp thực thi an toàn kiểu.

3

Hãy xem xét những chữ ký phương pháp:

//Old and busted 
public abstract class Enum 
{ 
    public static object Parse(Type enumType, string value); 
} 
//To call it: 
MyEnum x = (MyEnum) Enum.Parse(typeof(MyEnum), someString); 

//New and groovy 
public abstract class Enum 
{ 
    public static T Parse<T>(string value); 
} 

//To call it: 
MyEnum x = Enum.Parse<MyEnum>(someString); 

Look ma: Không có loại thời gian chạy thao tác.

+0

Tôi thích nhận xét của bạn về cái nhìn ma. : D – ferventcoder

1

lợi thế lớn nhất của Generics so với các loại generic không trong C# (không Java, Java là một câu chuyện khác nhau) là họ là nhanh hơn nhiều. JIT tạo ra mã máy tốt nhất mà nó có thể đưa ra cho một kiểu nhất định. List<int> thực sự là một danh sách các int và không phải là các đối tượng số nguyên bao bọc một int. Điều này làm cho các loại chung nhanh chóng và an toàn, có thể giúp bạn phát hiện nhiều lỗi tuyệt vời tại thời gian biên dịch :)