Type
ทุกสิ่งทุกอย่างใน .NET คือไทป์ (type) ทั้งนั้น โดยแบ่งออกเป็น
- primitive type คือไทป์ที่ compiler (ของ .NET) รู้จักอยู่แล้ว
- user defined type คือไทป์ที่ถูกนิยามขึ้นใหม่จากโครงสร้าง struct
- object type คือไทป์ที่เกิดจากคลาส (class) ใน .NET หรือคลาสที่นิยามขึ้นใหม่
การจัดการกับ Type
primitive type ภาษา C# ต่างจากภาษา Java เพราะภาษา C# ยึดถือไทป์เป็นออบเจ็กค์ทั้งหมด ดังนั้นมันจึงอาจประกอบด้วย เมธอด (method) และ property หรืออื่นๆ (ทดสอบด้วยการ . (dot) ต่อท้ายไทป์นั้นๆ)
ต้นตระกูลของไทป์ทั้งหมดมาจากไทป์ที่ชื่อว่า System.Object ฉะนั้นมันจึงสามารถเปลี่ยนจากไทป์ใดๆเป็นออบเจ็กค์ไทป์ (object) โดยกระบวนการ boxing
value type VS reference type
เมื่อถูกจัดการกับหน่วยความจำ มันทั้งสองแตกต่างกัน
- value type เมื่อถูกสร้างเป็นออบเจ็กค์ CLR จะจัดสรรหน่วยความจำไว้ใน stack ข้อมูล (binary data) จะถูกเก็บไว้ภายในตัวเอง และต้องกำหนดค่าเริ่มต้นให้เสมอ
จึงเพิ่มประสิทธิภาพด้านความเร็วต่อการจัดการหน่วยความจำอีกเล็กน้อย
primitive type และ user defined type ถูกจัดการแบบ value type
- reference type เมื่อถูกสร้างเป็นออบเจ็กค์ CLR จะจัดสรรหน่วยความจำไว้สองแห่ง แห่งแรกอยู่ใน heap และแห่งที่สองอยู่ใน stack (ต่อไปจะเรียกว่ากล่องสองใบ ใบแรกอยู่ที่ heap และใบที่สองอยู่ที่ stack)
กล่องใบแรกหลังถูกสร้างขึ้นจะส่ง address ของตนไปยังกล่องใบที่สอง
กล้องใบที่สองจึงมีหน้าที่เก็บค่าอ้างอิง (reference) ไปยังกล่องใบแรก
ข้อมูล (binary data) จะถูกเก็บไว้ยังกล่องใบแรกเสมอ
object type ถูกจัดการแบบ reference type

struct VS class
เมื่อถูกจัดการกับหน่วยความจำ (ยกมาเฉพาะกรณีที่เห็นได้ชัด)
- มันทั้งสองแตกต่างกัน
struct ถูกจัดการแบบ value type
class ถูกจัดการแบบ reference type
- มันทั้งสองเหมือนกัน
สามารถสร้างออบเจ็กค์โดยคีย์ new ได้
Microsoft Development Network (MSDN) แนะนำให้ทำทุกอย่างด้วยคลาส และใช้ struct เท่าที่จำเป็นเท่านั้น เช่น หากเราต้องการนิยามไทป์ใหม่โดยประกอบด้วยจำนวนสมาชิกน้อยๆ และมีช่วงชีวิตสั้นหรืออยู่ภายในออบเจ็กค์ตัวอื่น จึงควรสร้างมันจาก struct
แนะนำ primitive type ที่ใช้บ่อย
-ชนิดตัวอักษร (character type) เช่น 'a', 'A'
char
-ชนิดจำนวนเต็ม (integer type) เช่น 10, 20
int
short
long
-ชนิดทศนิยม (floating-point type) เช่น 10.5f, 20.0
float
double
-ชนิดทศนิยม (decimal type)
decimal
-ชนิดบูลลีน (boolean type) เช่น true และ false
bool
***เรียนรู้เพิ่มเติมจาก MSDN
boxing และ unboxing
- boxing คือการแปลง value type ให้เป็น reference type เช่น
int i = 123;
Object o = (Object)i;
- unboxing คือการแปลง reference type เป็น value type เช่น
int d;
d = DateTime.Now.Day;
P04_PrimitiveTypes
- สร้างโปรเจ็กค์ใหม่เพิ่มเข้าไปยังโซลูชัน CsharpTutorialForFriends เหมือนเคย
- ตั้งชื่อมันว่า P04_PrimitiveTypes โดยโค้ดเพิ่มดังนี้
แบบฝึกหัด
- จากโค้ดข้างต้นจงให้เหตุผลว่าเหตุใดจึง compile ไม่ผ่าน
ทุกสิ่งทุกอย่างใน .NET คือไทป์ (type) ทั้งนั้น โดยแบ่งออกเป็น
- primitive type คือไทป์ที่ compiler (ของ .NET) รู้จักอยู่แล้ว
- user defined type คือไทป์ที่ถูกนิยามขึ้นใหม่จากโครงสร้าง struct
- object type คือไทป์ที่เกิดจากคลาส (class) ใน .NET หรือคลาสที่นิยามขึ้นใหม่
การจัดการกับ Type
primitive type ภาษา C# ต่างจากภาษา Java เพราะภาษา C# ยึดถือไทป์เป็นออบเจ็กค์ทั้งหมด ดังนั้นมันจึงอาจประกอบด้วย เมธอด (method) และ property หรืออื่นๆ (ทดสอบด้วยการ . (dot) ต่อท้ายไทป์นั้นๆ)
ต้นตระกูลของไทป์ทั้งหมดมาจากไทป์ที่ชื่อว่า System.Object ฉะนั้นมันจึงสามารถเปลี่ยนจากไทป์ใดๆเป็นออบเจ็กค์ไทป์ (object) โดยกระบวนการ boxing
value type VS reference type
เมื่อถูกจัดการกับหน่วยความจำ มันทั้งสองแตกต่างกัน
- value type เมื่อถูกสร้างเป็นออบเจ็กค์ CLR จะจัดสรรหน่วยความจำไว้ใน stack ข้อมูล (binary data) จะถูกเก็บไว้ภายในตัวเอง และต้องกำหนดค่าเริ่มต้นให้เสมอ
จึงเพิ่มประสิทธิภาพด้านความเร็วต่อการจัดการหน่วยความจำอีกเล็กน้อย
primitive type และ user defined type ถูกจัดการแบบ value type
- reference type เมื่อถูกสร้างเป็นออบเจ็กค์ CLR จะจัดสรรหน่วยความจำไว้สองแห่ง แห่งแรกอยู่ใน heap และแห่งที่สองอยู่ใน stack (ต่อไปจะเรียกว่ากล่องสองใบ ใบแรกอยู่ที่ heap และใบที่สองอยู่ที่ stack)
กล่องใบแรกหลังถูกสร้างขึ้นจะส่ง address ของตนไปยังกล่องใบที่สอง
กล้องใบที่สองจึงมีหน้าที่เก็บค่าอ้างอิง (reference) ไปยังกล่องใบแรก
ข้อมูล (binary data) จะถูกเก็บไว้ยังกล่องใบแรกเสมอ
object type ถูกจัดการแบบ reference type
struct VS class
เมื่อถูกจัดการกับหน่วยความจำ (ยกมาเฉพาะกรณีที่เห็นได้ชัด)
- มันทั้งสองแตกต่างกัน
struct ถูกจัดการแบบ value type
class ถูกจัดการแบบ reference type
- มันทั้งสองเหมือนกัน
สามารถสร้างออบเจ็กค์โดยคีย์ new ได้
Microsoft Development Network (MSDN) แนะนำให้ทำทุกอย่างด้วยคลาส และใช้ struct เท่าที่จำเป็นเท่านั้น เช่น หากเราต้องการนิยามไทป์ใหม่โดยประกอบด้วยจำนวนสมาชิกน้อยๆ และมีช่วงชีวิตสั้นหรืออยู่ภายในออบเจ็กค์ตัวอื่น จึงควรสร้างมันจาก struct
แนะนำ primitive type ที่ใช้บ่อย
-ชนิดตัวอักษร (character type) เช่น 'a', 'A'
char
-ชนิดจำนวนเต็ม (integer type) เช่น 10, 20
int
short
long
-ชนิดทศนิยม (floating-point type) เช่น 10.5f, 20.0
float
double
-ชนิดทศนิยม (decimal type)
decimal
-ชนิดบูลลีน (boolean type) เช่น true และ false
bool
***เรียนรู้เพิ่มเติมจาก MSDN
boxing และ unboxing
- boxing คือการแปลง value type ให้เป็น reference type เช่น
int i = 123;
Object o = (Object)i;
- unboxing คือการแปลง reference type เป็น value type เช่น
int d;
d = DateTime.Now.Day;
P04_PrimitiveTypes
- สร้างโปรเจ็กค์ใหม่เพิ่มเข้าไปยังโซลูชัน CsharpTutorialForFriends เหมือนเคย
- ตั้งชื่อมันว่า P04_PrimitiveTypes โดยโค้ดเพิ่มดังนี้
- จากโค้ดข้างต้นจงให้เหตุผลว่าเหตุใดจึง compile ไม่ผ่าน
Hello i am kavin, its my first occasion to commenting anywhere,
ตอบลบwhen i read this article i thought i could also create comment due to
this good paragraph.
Here is my site - best cellulite treatment
ช่วยเฉลยหน่อยคะว่าทำไมถึงทำไม่ได้ ตอนนี้งงมากเลยคะ
ตอบลบเพราะ Type bool ต้องเก็บเฉพาะค่า False และ True เท่านั้น ใช่หรือป่าวครับ
ตอบลบตัวแปร c ไม่ได้ กำหนดค่าเริ่มต้น
ตอบลบตัวแปร c ไม่ถูกนำมาคำนวณ หรือ ไม่ถูกกำหนดค่าเริ่มต้น จึงไม่มีค่าที่แสดงออกทางหน้าจอ...
ตอบลบchar c unassigned local variable
ตอบลบfloat 111.11f
dicimal 111.11m
bool = true||false