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 ซึ่งผมก็ไม่รู้เรื่อง เอาไปอ่านกันเองละกันนะครับ ที่นี่ ใครอ่านแล้วเข้าใจมาอธิบายผมด้วยก็ดี

Comment

Comment:

Tweet

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

#4 By 4YrClgHaINRr (82.209.251.174) 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 (202.153.130.221) on 2013-07-30 07:03

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

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

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

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