วันนี้ผมได้ลองทดสอบใช้งาน C# 7.0 บน VS15  โดยปัจจุบันนี้จะทดสอบด้วย RC1 ตัวปัจจุบัน (และจะอัพเดทที่นี่จนถึง RTM version)

ลองสรุปรายการที่ทางทีมพัฒนาได้ส่ง C#7.0 ออกมาให้ทดสอบกัน ซึ่งเน้นปรับปรุง performance ด้วยข้อดีของ Functional Programming และอื่นๆมาให้ตามนี้ครับ

  • Out Variables คือเราไม่ต้องประกาศตัวแปรเพื่อรับค่า out variable จาก function อีกต่อไป
  • Pattern Matching เป็นการเขียนโปรแกรมด้วยการเช็คตัวแปรตาม pattern ในแต่ละแบบ
  • Local Function เป็นการสร้าง function ใน function อีกที ช่วยจัดระเบียบภายในให้เป็นสัดส่วน โดยไม่ต้องไปสร้าง function ใหม่เพิ่มเติม  ซึ่ง local function มีคุณสมบัติเหมือน function ปกติทุกอย่าง และมีข้อดีช่วยลด memory allocation ซึ่ง performance จะดีกว่าการใช้ lambda
  • Tuples เพิ่ม tuple types และ tuple literals มาให้ใช้งาน (install nuget System.ValueTuple )
  • Deconstruction คือการนำ tuple object ที่ได้จาก function มาย่อยเป็น variables ใช้งานในจุดที่เรียกใช้ function และรับค่ากลับมา
  • Literal เพิ่ม Binary Literals จากที่มี Dec/Hex separator ก่อนนี้ ซึ่งช่วยให้เรากำหนดค่า number format ใน code ได้
  • Ref returns and locals อนุญาติให้ใช้ ref กับ return ตำแหน่งตัวแปร
  • Generalized async return types ให้เราสามารถสร้าง Task<T> ขึ้นใช้งานเอง ตัวอย่างเช่น ValueTask<T> ใช้แก้ปัญหาเรื่อง performance จาก Task<T> เดิมที่ต้อง allocate memory มาสร้างตัวแปรของ Task<T> แม้จะไม่ execute code ส่วนของ task ก็ตาม
  • Full expression bodied members เพิ่มการใช้งาน expression ได้ทุกจุดของ code นอกเหนือจาก C#6 ทำได้แค่ระดับ function และ get property
  • Throw expressions อนุญาตให้เราโยน exception ออกมาจาก expression logic ได้
  • Records เป็นการลดรูปการประกาศ class สำหรับใช้เป็น data object อย่างเดียว และไม่สามารถแก้ไขค่าได้จากการ set value ผ่าน property แต่จะใช้ .With() ในการจัดการ 

ลองมาดูตัวอย่างการใช้งานฟีเจอร์ใหม่ๆ ที่มีกันครับ

Out Variables

line 7: ประกาศ function มีที่ out parameter และมี body เป็น expression ในการ set ค่าให้ x, y
line 3: สำหรับ C# รุ่นก่อนจะต้องประกาศตัวแปรมาก่อน เพื่อส่งเข้า function และนำค่ามาใช้งาน ต่อไปสำหรับ C#7 ไม่ต้องทำแบบนั้นแล้ว

Pattern Matching

การใช้ ‘is’
line 3-4 ลดรูปการประกาศตัวแปรเพื่อนำมารับค่าที่ cast type มาจาก x  แล้วนำไปใช้งาน
line 5 ลดรูปการประกาศตัวแปรเพื่อทำการ as Type เช่นกัน
line 9 – 14 เราก็ยังสามารถเขียนได้อีกวิธีโดยการใช้ switch ‘case’ and ‘when’

Local Function

line 3: เป็นการสร้าง local function ที่ใช้ expression body โดยสร้าง tuple object ส่งกลับออกมา
line 4: ทำการเรียกใช้ local function
เรายังสามารถสร้าง recuresion ด้วย local function ได้อีกด้วย

Tuples and Deconstruction

line 2  : เป็นการสร้าง tuple object แบบเดิม ซึ่งไม่สะดวกเท่าไหร่นักมีโค้ดรกตา
line 6 : จะเห็นได้ว่า สร้าง tuple object ได้ง่ายขึ้นมาก คลีนสะอาดตาดีมาก เหมือน FP อื่นๆที่มีใช้กัน
line 10 : อีกฟีเจอร์ที่ FP อื่นๆไม่มีคือการตั้งชื่อ property ดีมากๆ เพราะเวลาที่มี item1 – 10 คงจำไม่ได้ว่าแต่ละตัวคืออะไร
line 15 : เป็น local function ไว้เทส deconstruction tuple type (string, string, int)
line 18: เป็นการรับค่า tuple object ด้วยการประกาศตัวแปรปกติ
line 22: เราสามารถนำ (item1, item2, item3) ที่ได้ออกมาจาก function มาสร้างตัวแปรแต่ละตัวที่จุดรับค่าได้
line 26: เราสามารถ assign ค่าใหม่ให้ deconstruction tuple ได้ในแบบนี้

Number Literals

จะเห็นว่าง่ายต่อการอ่านในกรณีที่ค่านั้นมีความยาวมากๆ

Ref returns and locals

line 12: เป็นการสร้าง function โดยให้ return memory location ของ array index ออกมา
line 5: บอกโปรแกรมให้ทำการอ้างอิงตำแหน่งของตัวแปรมาใช้งาน แล้วปริ้นออกมาดู
line 8: บวกค่าเข้าไปอีก 5  แล้วปริ้นออกมาดู ทั้ง ref variable และ array object  จะเห็นว่าได้ค่าเดียวกัน

Summary

มันยอดมากจ๊อจ  ยังคงมีฟีเจอร์อีกหลายตัวที่ยังไม่ถูกใส่มาใน RC1 นี้  และก็ยังขาด FP feature สำคัญอีกอันคือ immutable local variable ที่ยังไม่เห็นวี่แววใน C# 7.0 นี้  หวังว่าจะมีให้เห็นในอนาคตเร็วๆนี้ครับ

ref : https://github.com/dotnet/roslyn

 

(Visited 598 times, 1 visits today)

Leave a Reply