มีอะไรใหม่ใน .NET Core 3 และ C# 8 : String Interpolation
การหาค่าของ string
.NET Core 3 ได้รับการปรับปรุงเรื่อง "การหาค่าของ string" (string interpolation)
เมื่อใช้ร่วมกับสัญลักษณ์ $ และ @ โดยอนุญาตให้การประเมินค่าของ "การระบุอย่างตรงตามที่เขียน" (interpolated verbatim strings)
สามารถกำหนดลำดับได้ทั้ง $@"..." และ @$"..." แปลกจากเวอร์ชันก่อนหน้านี้ที่เขียนได้เพียง $@"..." เท่านั้น
สัญลักษณ์ $ ทำหน้าที่ระบุว่า string ที่ตามมาอาจมีการสอดแทรกค่าที่ตัวแปลภาษาจะต้องนำไปถอดความก่อนจะดำเนินการอย่างอื่นกับมันต่อไป
โดยค่าดังกล่าวอาจเป็นเพียงค่าจากตัวแปรหรือซับซ้อนกว่านั้น เช่นเป็นนิพจน์ และมีได้มากกว่าหนึ่งค่า การหาค่าของ 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 ผลลัพธ์เป็นดังนี้
Name Hours
Adam 40.0
Bridgette 6.7
Carla 40.4
Daniel 82.0
Ebenezer 40.3
Francine 80.0
George 16.8
บรรทัด 31 แสดงวิธีเขียนโค้ดเมื่อต้องการแสดงค่าที่มีวงเล็บปีกกา
บรรทัด 33 ผลลัพธ์คือ {6324}
รูปที่ 2 แสดงตัวอย่างโค้ดจัดรูปแบบตัวประกอบส่วนที่เหลือ
บรรทัด 9 แสดงการจัดรูปแบบโดยใช้การจัดรูปแบบตัวประกอบ
บรรทัด 10 แสดงการจัดรูปแบบโดยใช้ method ToString ให้ผลลัพธ์เหมือนกันกับบรรทัด 9
บรรทัด 12 ประกาศตัวแปรเพื่อนำไปใช้แสดงตัวอย่างการแสดงค่าเงิน
บรรทัด 13 ผลลัพธ์คือ $100.00 (ในกรณีที่กำหนด windows เป็น U.S. English culture )
บรรทัด 16 แสดงการจัดค่าเวลากับ string ผสมกัน ผลลัพธ์คือ Name = Fred, hours = 11, minutes = 30
บรรทัด 19 ถึง 35 แสดงการจัดชิดหน้าหลังแบบต่าง ๆ
culture is en-US:
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 สาธิตกรณีต่าง ๆ ดังกล่าว
อธิบายการทำงานของโค้ดในรูปที่ 4
บรรทัด 9 การใช้สัญลักษณ์ข้อความตรงตามตัวอักษรทำให้ใช้คำว่า for เป็นชื่อตัวแปรได้ ถ้าไม่ใส่จะ error เพราะ for เป็นคำสงวนในภาษา C#
บรรทัด 10-13 ผลลัพธ์การทำงานเป็นดังนี้
Here is your gift, John!
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"
โค้ดในรูปที่ 4 แสดงตัวอย่างความสับสนระหว่างแอตทริบิวต์ในกรณีที่ชื่อเหมือนกัน คือ Info ที่มีประกาศคลาสชื่อนี้ (บรรทัดที่ 4)
และการอ้างถึง (บรรทัดที่ 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
ท่านผู้อ่านน่าจะมองเห็นประโยชน์ของการใช้งานกันแล้ว สามารถนำไปทดลองใช้ดูได้นะครับ











