มีอะไรใหม่ใน C# 7

ภาษา C# version ใหม่ ได้เปิดให้ใช้งานตั้งแต่เดือนมีนาคม 2017 แล้ว และพร้อมใช้งานใน Visual Studio 2017

ใน C# 7 นั้นได้เพิ่มความสามารถของภาษาเพื่อให้เขียนโค้ดได้สั้นลง และรองรับการเขียนโปรแกรมสมัยใหม่ เช่น tuple ซึ่งลดข้อจำกัดของการคืนค่าของฟังก์ชันได้มากกว่า 1 ค่า หรือการใช้งานฟังก์ชันในลักษณะของตัวแปร คล้ายกับของ Javascript

รายการ feature ใหม่ใน C# 7 มีดังนี้

  1. ตัวแปร out: เราสามารถประกาศตัวแปร out พร้อมกับส่งเข้าไปเป็นตัวแปรในการเรียกฟังก์ชันได้แล้ว เช่น p.GetCoordinate(out int x, out iny y); หรือจะใช้ var แทน data type ได้ เพราะคอมไพเลอร์สามารถหา type จาก method signature ได้อยู่ดี จึงทำให้การใช้งานฟังก์ชันในกลุ่ม Try… เช่น TryParse สะดวกมากขึ้น นอกจากนี้ยังสามารถใช้ _ (underscore) ถ้าเราไม่ต้องการส่งค่า Parameter ตัวนั้นๆได้ด้วย เช่น p.GetCoordinate(out var x, out _);
  2. pattern: ใช้เพื่อเปรียบเทียบข้อมูลตามเงื่อนไขที่กำหนด (นอกเหนือจากการใช้ boolean expression ทั่วไป)
    • constant pattern: เปรียบเทียบกับค่าคงที่ เช่น x is null
    • type pattern: เปรียบเทียบกับชนิดของตัวแปร เช่น x is int i ซึ่งตัวแปร i นี้สามารถนำไปใช้ต่อได้ทันทีในฐานะตัวแปรชนิด int
    • var pattern: คล้ายกับ type pattern แต่จะ resolve type เองจาก scope ของตัวแปร
    • switch statement pattern: ใช้เพื่อเปรียบเทียบแบบ type pattern โดยระบุเจาะจงเพิ่มลงไปได้อีกด้วยคำสั่ง when เช่น
      • switch (shape) {
        case Circle c: <วงกลม>;
        case Rentangle r when ( r.Width == r.Height ): <สี่เหลี่ยมจัตุรัส>;
        case Rentangle r: <สีเหลี่ยมผืนผ้า>;
        }
  3. tuple: การรับค่าที่คืนจากฟังก์ชันมากกว่า 1 ค่า เช่น การประกาศฟังก์ชันดังนี้
    • (string, string) LookupName(int id) { return (first, last); }
  4. deconstruction: ใช้แยกเก็บเข้าตัวแปรแยกจากกัน
    • tuple: ประกาศตัวแปรให้สอดคล้องกับสิ่งที่คืนค่าจาก tuple เช่น
      var (first, last) = LookupName(id);
    • object: class นั้นๆจะต้อง implement void Deconstruct(out T1 var1, …); และคืนค่าตามตัวแปร out ที่กำหนดไว้
  5. local function: เราสามารถประกาศฟังก์ชันที่ใช้เฉพาะภายในฟังก์ชันนั้นเท่านั้นได้ในลักษณะแบบเดียวกับ anonymous function ใน Java หรือ Javascript
  6. literal: สามารถใช้ _ (underscore) เพื่อคั่นการแสดงผลตัวเลขยาวๆ เช่น เลขฐาน 2 (0b1010_1011_1100_1101_1110_1111) หรือ ฐาน 16  (0xAB_CD_EF) ให้ดูง่ายขึ้น
  7. การใช้ ref เป็น return type: เราสามารถคืนค่าแบบ reference ได้ นอกเหนือจากการ pass by reference ซึ่งมีประโยชน์กับตัวแปรประเภทที่ต้องจองหน่วยความจำล่วงหน้าเป็นจำนวนมาก อย่างการใช้กับโปรแกรมจำพวกเกม
  8. ปรับปรุง async return type: เพิ่ม ValueTask<T> เพื่อใช้งานกับข้อมูลที่รู้ค่าตั้งแต่ก่อนการ await เพื่อปรับปรุงประสิทธิภาพ นอกจากนี้ยังเปิดให้คืนค่าอื่นๆได้
  9. expression body member: เพิ่มการใช้ expression body (การใช้ => ) ใน
    • accessor: public string Name { get => names[id]; set => names[id] = value; }
    • contructor: public Person(string name) => names.TryAdd(id, name);
    • finalizer: ~Person() => names.TryRemove(id, out _);
  10. throw expression: เราสามารถ throw exception ตามเงื่อนไขด้วยคำสั่ง inline expression พวก ? หรือ ?? ได้ เช่น return (parts.Length > 0) ? parts[0] : throw new InvalidOperationException(No name!);

ที่มา: https://blogs.msdn.microsoft.com/dotnet/2017/03/09/new-features-in-c-7-0/

สแลช (Slash)

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s