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

.NET Core 3 ได้รับการปรับปรุงเรื่อง "การหาค่าของ string" (string interpolation) เมื่อใช้ร่วมกับสัญลักษณ์ $ และ @ โดยอนุญาตให้การประเมินค่าของ "การระบุอย่างตรงตามที่เขียน" (interpolated verbatim strings) สามารถกำหนดลำดับได้ทั้ง $@"..." และ @$"..." แปลกจากเวอร์ชันก่อนหน้านี้ที่เขียนได้เพียง $@"..." เท่านั้น สัญลักษณ์ $ ทำหน้าที่ระบุว่า string ที่ตามมาอาจมีการสอดแทรกค่าที่ตัวแปลภาษาจะต้องนำไปถอดความก่อนจะดำเนินการอย่างอื่นกับมันต่อไป โดยค่าดังกล่าวอาจเป็นเพียงค่าจากตัวแปรหรือซับซ้อนกว่านั้น เช่นเป็นนิพจน์ และมีได้มากกว่าหนึ่งค่า การหาค่าของ string ทำได้โดยหาค่าของนิพจน์เหล่านั้นแล้วแปลงมันให้เป็น string เสียก่อนจึงจับรวมกับ string ที่แวดล้อม การใช้สัญลักษณ์ $ เพื่อทำการหาค่าของ string เริ่มมีใน C#6 แต่การให้กำหนดลำดับได้ทั้ง $@"..." และ @$"..." เพิ่งจะเริ่มมีใน C#8
ภาพหน้าปก มีอะไรใหม่ใน .NET Core 3 และ C# 8 : String Interpolation
ทักษะ (ระบุได้หลายทักษะ)

มีอะไรใหม่ใน .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 อินเทอพอลเลชัน

 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 เป็นอักขระล้วน

แสดงตัวอย่างการใช้ข้อความตรงตามตัวอักษรเพื่อกำหนดว่าเป็นข้อความไม่ใช่คำสั่ง อย่างที่สองใส่หน้า 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
ท่านผู้อ่านน่าจะมองเห็นประโยชน์ของการใช้งานกันแล้ว สามารถนำไปทดลองใช้ดูได้นะครับ