C# Generic

posted on 19 Dec 2004 19:30 by tidno1 in csharp-and-dotnet

Generic types are added to the language to enable programmers to achieve a high level of code reuse and enhanced performance for collection classes. Generic types can differ only by arity. Parameters can also be forced to be specific types.

นี่คือคำอธิบายของ ms-help ถ้าพูดกันง่าย ๆ มันก็คือ template ของ C++ นั่นเอง
เวลาใช้ก็ต้อง using System.Collections.Generic (มี collection class มาให้ใช้ด้วยนะ <<Generics in the Base Class Library.pdf>>)
ลองมาดูตัวอย่างกัน <<Generic code.txt>>

ในคลาสแรกนี้เป็นการสร้าง linked-list แบบง่าย ๆ กัน โดยที่สามารถกำหนด data type ของ แต่ละ node ได้ใน Main
MyList list = new MyList(); ซึ่งก็คือการสร้าง linked-list ที่แต่ละ node เก็บ integer ไว้

เอาล่ะ ปัญหาต่อมาก็คือ c# เนี่ย เวลาจะใช้ตัวแปร เราต้อง initialize ค่าให้มันก่อน แล้วพอใช้ generic type ล่ะ เราจะรู้ได้ไงว่าตัวแปรนั้นเป็น reference หรือ value type
ถ้าเป็น reference เราก็อาจกำหนด T t = null; ถ้าเป็น value ก็เป็น T t = 0; แล้วมันก็อาจจะวุ่นกว่านั้นอีกถ้าเป็น struct
C# 2.0 จึงมี keyword ว่า default วิธีใช้ก็คือ

T t = default(T);

ซึ่งจะ return null หรือ 0 มาให้ ตาม type ที่มันเป็น และถ้า T เป็น struct มันก็จะ initialize ตัวแปรทั้งหมดให้ก่อนด้วย

ข้อแตกต่างระหว่าง C# Generics กับC++ templates ก็คือ
-C# generics do not provide the same amount of flexibility as C++ templates. For example, it is not possible to call arithmetic operators in a C# generic class, although it is possible to call user defined operators.
-C# does not allow non-type template parameters, such as template C{}.
-C# does not support explicit specialization; that is, a custom implementation of a template for a specific type.
-C# does not support partial specialization: a custom implementation for a subset of the type arguments.
-C# does not allow the type parameter to be used as the base class for the generic type.
-C# does not allow type parameters to have default types.
-In C#, a generic type parameter cannot itself be a generic, although constructed types can be used as generics. C++ does allow template parameters.
-C++ allows code that might not be valid for all type parameters in the template, which is then checked for the specific type used as the type parameter. C# requires code in a class to be written in such a way that it will work with any type that satisfies the constraints. For example, in C++ it is possible to write a function that uses the arithmetic operators + and - on objects of the type parameter, which will produce an error at the time of instantiation of the template with a type that does not support these operators. C# disallows this; the only language constructs allowed are those that can be deduced from the constraints.

ขี้เกียจแปลครับ อ่านเอาเองละกัน

แล้วนอกจากนี้ยังมีเรื่องของ Constraints on Type ซึ่งผมก็ไม่รู้เรื่อง เอาไปอ่านกันเองละกันนะครับ ที่นี่ ใครอ่านแล้วเข้าใจมาอธิบายผมด้วยก็ดี




Articles like these put the consumer in the driver seat-very <a href="http://vmdpleq.com">imaptront.</a>

#4 By 4YrClgHaINRr ( on 2013-07-31 10:24

Thanks for <a href="http://fuesupwjsyy.com">shinrag.</a> Always good to find a real expert.

#3 By lzB7UNxU ( on 2013-07-30 07:03

IJWTS wow! Why can't I think of thnigs like that?

#2 By bMII0D7wrhN ( on 2013-07-28 15:12

ประโยชน์ของ generic นอกจากที่เขียนไว้ก็คือช่วยลดการทำ boxing, unboxing และป้องกัน(ลด)ปัญหาการเกิด runtime error ด้วยครับ

#1 By pongneng ( on 2008-03-17 12:31