วันจันทร์ที่ 15 พฤศจิกายน พ.ศ. 2553

สวัสดี Types

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 ไม่ผ่าน

6 ความคิดเห็น:

  1. 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

    ตอบลบ
  2. ช่วยเฉลยหน่อยคะว่าทำไมถึงทำไม่ได้ ตอนนี้งงมากเลยคะ

    ตอบลบ
  3. ไม่ระบุชื่อ20 กรกฎาคม 2558 เวลา 04:39

    เพราะ Type bool ต้องเก็บเฉพาะค่า False และ True เท่านั้น ใช่หรือป่าวครับ

    ตอบลบ
  4. ไม่ระบุชื่อ22 ตุลาคม 2558 เวลา 03:12

    ตัวแปร c ไม่ได้ กำหนดค่าเริ่มต้น

    ตอบลบ
  5. ไม่ระบุชื่อ13 มกราคม 2559 เวลา 13:34

    ตัวแปร c ไม่ถูกนำมาคำนวณ หรือ ไม่ถูกกำหนดค่าเริ่มต้น จึงไม่มีค่าที่แสดงออกทางหน้าจอ...

    ตอบลบ
  6. char c unassigned local variable
    float 111.11f
    dicimal 111.11m
    bool = true||false

    ตอบลบ