มีอะไรใหม่ใน .NET Core 3 และ C# 8 : String Interpolation

มีอะไรใหม่ใน .NET Core 3 และ C# 8 : String Interpolation
การหาค่าของ string
.NET Core 3 ได้รับการปรับปรุงเรื่อง "การหาค่าของ string" (string interpolation)
เมื่อใช้ร่วมกับสัญลักษณ์ $ และ @ โดยอนุญาตให้การประเมินค่าของ "การระบุอย่างตรงตามที่เขียน" (interpolated verbatim strings)
สามารถกำหนดลำดับได้ทั้ง $@"..." และ @$"..." แปลกจากเวอร์ชันก่อนหน้านี้ที่เขียนได้เพียง $@"..." เท่านั้น
เมื่อใช้ร่วมกับสัญลักษณ์ $ และ @ โดยอนุญาตให้การประเมินค่าของ "การระบุอย่างตรงตามที่เขียน" (interpolated verbatim strings)
สามารถกำหนดลำดับได้ทั้ง $@"..." และ @$"..." แปลกจากเวอร์ชันก่อนหน้านี้ที่เขียนได้เพียง $@"..." เท่านั้น
สัญลักษณ์ $ ทำหน้าที่ระบุว่า string ที่ตามมาอาจมีการสอดแทรกค่าที่ตัวแปลภาษาจะต้องนำไปถอดความก่อนจะดำเนินการอย่างอื่นกับมันต่อไป
โดยค่าดังกล่าวอาจเป็นเพียงค่าจากตัวแปรหรือซับซ้อนกว่านั้น เช่นเป็นนิพจน์ และมีได้มากกว่าหนึ่งค่า การหาค่าของ string
ทำได้โดยหาค่าของนิพจน์เหล่านั้นแล้วแปลงมันให้เป็น string เสียก่อนจึงจับรวมกับ string ที่แวดล้อม
การใช้สัญลักษณ์ $ เพื่อทำการหาค่าของ string เริ่มมีใน C#6
แต่การให้กำหนดลำดับได้ทั้ง $@"..." และ @$"..." เพิ่งจะเริ่มมีใน C#8
รูปที่ 1 ตัวอย่างโค้ดแสดงจัดรูปแบบตัวประกอบ
โดยค่าดังกล่าวอาจเป็นเพียงค่าจากตัวแปรหรือซับซ้อนกว่านั้น เช่นเป็นนิพจน์ และมีได้มากกว่าหนึ่งค่า การหาค่าของ string
ทำได้โดยหาค่าของนิพจน์เหล่านั้นแล้วแปลงมันให้เป็น string เสียก่อนจึงจับรวมกับ string ที่แวดล้อม
การใช้สัญลักษณ์ $ เพื่อทำการหาค่าของ string เริ่มมีใน C#6
แต่การให้กำหนดลำดับได้ทั้ง $@"..." และ @$"..." เพิ่งจะเริ่มมีใน C#8
รูปที่ 1 ตัวอย่างโค้ดแสดงจัดรูปแบบตัวประกอบ
รูปที่ 2 ตัวอย่างโค้ดแสดงจัดรูปแบบตัวประกอบเพิ่มเติม
การจัดรูปแบบตัวประกอบ
การหาค่าของ string นี้มีขึ้นเพื่ออำนวยความสะดวกในการเขียนโปรแกรม และช่วยให้โปรแกรมอ่านง่ายขึ้นจากเดิมหากต้องการสอดแทรกค่าเข้าไปใน string และจัดรูปแบบของมันจะต้องใช้วิธี "จัดรูปแบบตัวประกอบ" (Composite Formatting) ที่เยิ่นเย้อกว่า
รูปที่ 1 แสดงตัวอย่างโค้ดจัดรูปแบบตัวประกอบส่วนแรก
- บรรทัด 9 ประกาศตัวแปร string ที่จะนำไปใช้ในการจัดรูปแบบตัวประกอบ
- บรรทัด 10 string ที่เป็นค่าคงที่คือ "Name = " และ ", hours = " สิ่งที่ถูกจัดรูปแบบคือ "{0}" ที่มีดรรชนีเป็นศูนย์ซึ่งเป็นค่าจากตัวแปร name ส่วน "{1:hh}" มีดรรชนีเป็นหนึ่งซึ่งเป็นค่าจากออพเจ็กต์ DateTime.Now
- บรรทัด 12 ประกาศตัวแปร string ที่จะนำไปใช้ในการจัดรูปแบบตัวประกอบ
- บรรทัด 13 แสดงตัวอย่างการระบุค่าดรรชนีของตัวจัดรูปแบบ และการนำค่าที่ได้จากจัดรูปแบบตัวประกอบไปเก็บไว้ในตัวแปร
- บรรทัด 15 ผลลัพธ์การทำงานคือ Prime numbers less than 10: 2, 3, 5, 7
- บรรทัด 17 ประกาศตัวแปรและกำหนดค่าเริ่มต้นด้วยค่าจากจัดรูปแบบตัวประกอบ แสดงการใช้ตัวกำหนดรูปแบบ X (เลขฐานสิบหก) E (วิทยาศาสตร์) N (ตัวเลข)
- บรรทัด 19 ผลลัพธ์คือ 0x7FFFFFFFFFFFFFFF 9.223372E+018 9,223,372,036,854,775,807.00
- บรรทัด 21 ประกาศ string array เพื่อจะนำไปแสดงในตาราง
- บรรทัด 23 ประกาศ array ของค่าที่เป็นตัวเลขเพื่อจะนำไปแสดงในตาราง
- บรรทัด 26 แสดงหัวคอลัมน์ไว้ใช้ในตาราง
- บรรทัด 27 แสดงตารางและการจัดคอลัมน์ วนค่าใน array เพื่อแสดงแถวต่าง ๆ ใน array ผลลัพธ์เป็นดังนี้
Adam 40.0
Bridgette 6.7
Carla 40.4
Daniel 82.0
Ebenezer 40.3
Francine 80.0
George 16.8
- บรรทัด 31 แสดงวิธีเขียนโค้ดเมื่อต้องการแสดงค่าที่มีวงเล็บปีกกา
- บรรทัด 33 ผลลัพธ์คือ {6324}
- บรรทัด 9 แสดงการจัดรูปแบบโดยใช้การจัดรูปแบบตัวประกอบ
- บรรทัด 10 แสดงการจัดรูปแบบโดยใช้ method ToString ให้ผลลัพธ์เหมือนกันกับบรรทัด 9
- บรรทัด 12 ประกาศตัวแปรเพื่อนำไปใช้แสดงตัวอย่างการแสดงค่าเงิน
- บรรทัด 13 ผลลัพธ์คือ $100.00 (ในกรณีที่กำหนด windows เป็น U.S. English culture )
- บรรทัด 16 แสดงการจัดค่าเวลากับ string ผสมกัน ผลลัพธ์คือ Name = Fred, hours = 11, minutes = 30
- บรรทัด 19 ถึง 35 แสดงการจัดชิดหน้าหลังแบบต่าง ๆ
First Name = | Fred|
Last Name = | Opals|
Price = | $100.00|
First Name = |Fred |
Last Name = |Opals |
Price = |$100.00 |
รูปที่ 3 ตัวอย่างโค้ดแสดงการทำ string อินเทอพอลเลชัน
String Interpolation
ในหัวข้อการจัดรูปแบบตัวประกอบจะเห็นว่าข้อดี คือ มันทำให้เราสามารถจัดรูปแบบของ string ได้อย่างหลากหลายแต่ข้อเสีย คือเขียนโปรแกรมไม่สะดวก เป็นวิธีโบราณล้าสมัย คล้ายการรูปแบบของ string ในฟังก์ชัน prinft ของภาษา C
ดังนั้นตั้งแต่เวอร์ชัน 6 เป็นต้นมาภาษา C# จึงจัดให้มี string interpolation ที่อำนวยความสะดวกให้การจัดรูปแบบของ string ทำได้สะดวกกว่าการใช้วิธีจัดรูปแบบตัวประกอบ
รูปที่ 3 แสดงตัวอย่างการทำ string interpolation ในลักษณะต่าง ๆ
- บรรทัด 9 กระกาศตัวแปร string
- บรรทัด 10 ประการตัวแปรเก็บเวลาขณะนั้น
- บรรทัด 12 แสดงการจัดรูปแบบของ string ด้วยการใช้วิธีจัดรูปแบบตัวประกอบ
- บรรทัด 13 แสดงการจัดรูปแบบของ string ด้วยการใช้ string interpolation ผลลัพธ์ของทั้งบรรทัด 12 และบรรทัดนี้จะเหมือนกันทุกประการ คือ Hello, Mark! Today is Wednesday, it's 19:40 now.
- บรรทัด 15 แสดงวิธีจัดข้อความชิดซ้ายและขวา ผลลัพธ์คือ |Left | Right|
- บรรทัด 17 ประกาศตัวคงค่าเพื่อเก็บค่าความกว้างของฟิลด์ที่จัดชิดขวา
- บรรทัด 18 แสดงค่าของ PI 3.14159265358979 - default formatting of the pi number
- บรรทัด 19 แสดงค่าของ PI แต่กำหนดเอาทศนิยมสามตำแหน่ง ผลลัพธ์ได้เป็น 3.142 - display only three decimal digits of the pi number
- บรรทัด 21 เปลี่ยนค่าในตัวแปร name
- บรรทัด 22 ประกาศตัวแปรใช้เก็บค่าอายุ
- บรรทัด 23 ผลการทำงานคือ He asked, "Is your name Horace?", but didn't wait for a reply :-{
- บรรทัด 24 ผลการทำงานคือ Horace is 34 years old.
- บรรทัด 26 ตัวแปรเก็บค่าความเร็วแสง
- บรรทัด 27 ใช้คลาส FormattableString ที่ช่วยให้สามารถสร้างตัวแปรเก็บ string ที่ใช้วิธีจัดรูปแบบตัวประกอบ
- บรรทัด 29 กำหนดรูปแบบเป็นภาษาดัตช์
- บรรทัด 30 แปลงค่าจากไทป์ FormattableString เป็น string แบบภาษาดัตช์ใส่ในตัวแปร
- บรรทัด 32 กำหนดรูปแบบเป็นภาษาอังกฤษ
- บรรทัด 33 แปลงค่าจาก type FormattableString เป็น string แบบภาษาอังกฤษใส่ในตัวแปร
- บรรทัด 35 เรียกใช้ Static Method Invariant เพื่อแปลงค่าในตัวแปร message ให้เป็นรูปแบบ invariant culture
- บรรทัด 37 ผลลัพธ์การทำงานคือ nl-NL The speed of light is 299.792,458 km/s.
- บรรทัด 38 ผลลัพธ์การทำงานคือ en-IN The speed of light is 2,99,792.458 km/s.
- บรรทัด 39 ผลลัพธ์การทำงานคือ Invariant The speed of light is 299,792.458 km/s.
รูปที่ 4 แสดงตัวอย่างการใช้ข้อความตรงตามตัวอักษรเพื่อกำหนดว่าเป็นข้อความไม่ใช่คำสั่ง อย่างที่สองใส่หน้า string เพื่อระบุว่าสิ่งที่อยู่ใน string เป็นอักขระล้วน
รูปที่ 5 แสดงตัวอย่างการใช้ข้อความตรงตามตัวอักษรเพื่อป้องกันไม่ให้ตัวแปลภาษาสับสนระหว่างแอตทริบิวต์ในกรณีที่ชื่อเหมือนกัน
ข้อความตรงตามตัวอักษร
สัญลักษณ์ @ คือ "ข้อความตรงตามตัวอักษร" (verbatim identifier)เมื่อใส่นำหน้าสิ่งต่าง ๆ จะทำให้สิ่งนั้นเป็นข้อความตามที่กำหนด มีวิธีใช้สามแบบ
- อย่างแรกคือกำหนดว่านี่เป็นข้อความไม่ใช่คำสั่ง
- อย่างที่สองใส่หน้า string เพื่อระบุว่าสิ่งที่อยู่ใน string เป็นอักขระล้วน ๆ ไม่มี "เอสเคปโค้ด" (escape code) ปะปน
- และอย่างสุดท้ายใช้เพื่อป้องกันไม่ให้ตัวแปลภาษาสับสนระหว่างแอตทริบิวต์ในกรณีที่ชื่อเหมือนกัน ตัวอย่างโค้ดในรูปที่ 4 และ 5 สาธิตกรณีต่าง ๆ ดังกล่าว
- บรรทัด 9 การใช้สัญลักษณ์ข้อความตรงตามตัวอักษรทำให้ใช้คำว่า for เป็นชื่อตัวแปรได้ ถ้าไม่ใส่จะ error เพราะ for เป็นคำสงวนในภาษา C#
- บรรทัด 10-13 ผลลัพธ์การทำงานเป็นดังนี้
Here is your gift, James!
Here is your gift, Joan!
Here is your gift, Jamie!
- บรรทัด 15 การใช้สัญลักษณ์ข้อความตรงตามตัวอักษรทำให้สามารถใส่ตัว \ ไว้ภายในข้อความได้โดยตัวแปลภาษาจะถือว่าเป็นตัว \ ถ้าไม่ใส่ตัวแปลภาษาจะถือว่าตัวอักษรที่ถัดจาก \ เป็น escape code
- บรรทัด 16 ถ้าไม่ต้องการใช้สัญลักษณ์ข้อความตรงตามตัวอักษรจะสามารถใส่ตัว \ ไว้ภายในข้อความได้โดยใส่ \ สองอัน ตัวแปลภาษาจะถือว่าเป็นตัว \ ถ้าใส่ตัวเดียวตัวแปลภาษาจะถือว่าตัวอักษรที่ถัดจาก \ เป็น escape code
- บรรทัด 18 ผลลัพธ์คือ c:\documents\files\u0066.txt
- บรรทัด 19 ผลลัพธ์คือ c:\documents\files\u0066.txt
- บรรทัด 21 ตัวอย่าง string ที่ไม่ใช้สัญลักษณ์ข้อความตรงตามตัวอักษร
- บรรทัด 22 ตัวอย่าง string ที่ใช้สัญลักษณ์ข้อความตรงตามตัวอักษร
- บรรทัด 24 ผลลัพธ์การทำงาน He said, "This is the last chance!"
- บรรทัด 25 ผลลัพธ์การทำงาน He said, "This is the last \u0063hance\x0021"
และการอ้างถึง (บรรทัดที่ 25) เพราะคำว่า Info เมื่อใช้เป็นแอตริบิวต์อาจหมายถึงการเขียนย่อจาก InfoAttribute ก็ได้
ซึ่งซ้ำกันกับชื่อคลาสที่เราประกาศไว้ จึงเกิด error
error CS1614. Ambiguous Info and InfoAttribute. Prepend '@' to select 'Info'. Specify the full name 'InfoAttribute' to select it.
จากตัวอย่างโค้ด string interpolation ซึ่งมีความปรับสามารถเพิ่มเติมใน .NET Core 3
ท่านผู้อ่านน่าจะมองเห็นประโยชน์ของการใช้งานกันแล้ว สามารถนำไปทดลองใช้ดูได้นะครับ