มีอะไรใหม่ใน C# 6.0
โดยส่วนตัวแล้วผมทำมาหาเลี้ยงชีพด้วย C# มาตลอดหลายปี แต่น้อยครั้งที่จะเขียนอะไรเกี่ยวกับมัน เพราะว่าบางทีการเขียนที่เน้นหนักไปในภาษา Programming ทำให้บทความมันดูน่าเบื่อ (จริงๆ แล้วไม่ได้เขียนบทความเป็นชิ้นเป็นอันต่างหาก)
C# ถือเป็นภาษาหนึ่งที่เกิดขึ้นมายาวนานและนักพัฒนาจำนวนไม่น้อยที่ใช้เป็นอาวุธในการทำมาหาเลี้ยงชีพเฉกเช่นเดียวกับกระผม แต่บทความนี้จะไม่ไปท้าวความตั้งแต่เริ่มต้น (เพราะผมก็ไม่รู้จริงเหมือนกัน) แต่เราจะมาดู Feature ใหม่ ๆ ที่เกิดขึ้นล่าสุดที่ทางทีมพัฒนาอ้างว่าเจ๋งสุดๆ แต่ก่อนอื่นผมอยากให้ดูพัฒนาการของภาษานี้ตั้งแต่เวอร์ชั่น 1.0 ว่ามี Feature อะไรในแต่ละ Version บ้าง

จากรูปด้านบนจะเห็นว่าในแต่ละ Version มี Feature ต่าง ๆ เพิ่มขึ้นมามากมาย (บางอันผมยังไม่เคยใช้เลยบอกตรง ๆ) ในหัวข้อนี้เราจะมาดูความสามารถที่เพิ่มขึ้นมาใน Version ล่าสุดกัน
เรามาเริ่มต้นด้วยเรื่องแรกเลย คือ Auto Property Initializers
Auto Property Initializers คือการอนุญาติให้เราเซ็ดค่า Default ให้กับ Property ของ Class ได้โดยใน version ก่อนเมื่อเราสร้าง Class ที่ประกอบด้วย Property ต่าง ๆ หากเราจะทำการเซตค่า Default ต้องทำผ่าน Constructor หรือทำการเซ็ตค่าให้หลังจาก Instant class เป็น Object แล้วสำหรับ Property ประเภท Public หากพูดให้ฟันง่ายๆ คือแบบเดิมเป็นประเภท non-default value แต่ในเวอร์ชั่น 6.0 หากเราต้องการให้ Property ของเรามีค่า Default เราสามารถใส่เข้าไปได้เลย ลองมาดูตัวอย่างกัน
class Employee
{
public string FirstName{get;set;}="John";
public string LastName{get;set;}="Travolta";
public string Age{get;set;}=18;
}
จาก Class ตัวอย่างเรายังคงใช้ getter|setter ได้เหมือน Property ปกติทั่วไปแต่ทุกครั้งที่เรา Instant Class ไปเป็น Object property ใน class ก็จะถูกเซ็ตค่า Default ไว้ให้
เรื่องถัดมาคือ Exception Filters
Feature นี้ถือเป็น Feature หนึ่งที่รอมานานสำหรับ C# แต่สำหรับคนที่ใช้ VB กับ F# คงได้ใช้กันไปบ้างแล้ว ปกติเราดัก try{}catch(exception ex){} ที่เวอร์ชั่นที่ผ่านมาเราไม่สามารถเลือกได้ว่าจะ catch exception อะไร เราทำได้เพียง เอา exception ที่ได้มาแยกเอาเองว่ามันคือ Exception อะไร สำหรับ C# 6.0 เราสามารถใส Condition ลงไปใน catch เพื่อเลือกเอา Exception ที่เราต้องการได้เลย เรามาลองดูตัวอย่างกันดีกว่า เดี๋ยวจะหาว่าโม้
try{
// Some code might throw exception.
}
catch(Exception exception)if(exception.GetType()!=typeof(SqlException))
{
// Handle exception if it is not SqlException!!!
}
จาก Code ตัวอย่างมันจะดักทุก ๆ Exception ที่ไม่ใช่ SqlException แต่ถ้าใช่เมื่อใหร่มันจะปล่อยผ่านไป หลายคนอาจจะสงสัยว่ามันจะได้ประโยชน์อะไร เมื่อดัก Exception แล้วเกิด Exception ก็ควรจะได้ Exception เรามาดูตัวอย่างที่สองเพื่อชี้ให้เห็นถึงประโยชน์ของ Feature นี้กัน
try{
throw new CustomException("John");
}catch(Exception ex) if(ex.Message=="John"){
// Do something for Mr.Jonh
}catch(Exception ex) if(ex.Message=="Jake"){
// Do something for Mr.Jake
}catch(Exception ex){
// Handle exception
}
เรื่องที่สามคือ Await in catch and finally block
ในชีวิตการทำงานจริง ๆ บ่อยครั้งที่เราต้องจัดการกับ Exception ที่เกิดขึ้น เช่น เขียน exception เป็น log file หรือเขียนลงใน database ซึ่งการทำงานเหล่านี้ล้วนต้องใช้เวลา สำหรับ C# เวอร์ชั่นก่อนหน้านี้ถึงแม้จะมี Asynchronous แต่กลับไม่รองการทำงานใน block ของ catch และ finally ดังนั้นใน version นี้เราสามารถใช้ความสามารถของ Asynchronous ใน catch และ finally เพื่อประหยัดเวลา เราลองมาดูตัวอย่างกันดีกว่า
try{
// Code that might throw an exception.
}
catch(Exception ex)
{
await LogException(ex);
}
Feature สุดท้ายที่เราจะกล่าวถึงคือ Dictionary Initializer
สำหรับ Feature นี้ไม่ถือเป็น Feature ใหม่แต่เป็นการเปลี่ยนวิธีการ Initial ค่าตั้งต้นของ Dictionary จากเดิมที่เราทำกันแบบตัวอย่างด้านล่าง
Dictionary<int,string> employeeDic=new Dictionary<int,string>()
{
{1,"Ramish"},
{2,"Dawood"},
{3,"Ali"}
};
สำหรับใน Version 6.0 การ initial จะเปลี่ยนไปเป็นดังนี้
var employeeDic=new Dictionary<int,string>
{
[1]="Ramish",
[2]="Dawood",
[3]="Ali"
}
สำหรับ Primary Constructor เป็นที่ยืนยันแน่นอนแล้วว่าถูกถอดออก ส่วน Declaration Expression ยังไม่มีความแน่นอนผมจะยังไม่ขอกล่าวถึงในบทนี้
นอกจาก Feature หลัก ๆ ที่ผมได้กล่าวมาข้างต้นแล้วยังมีอย่างอื่นอีกมากที่มีการเปลี่ยนแปลงและเพิ่มเข้ามาหากมีเวลาจะทยอยทำความเข้าใจและเขียนออกมาให้ได้อ่าน ครับ
แหล่งอ้างอิง