Using declarations ใน .NET Core 3 และ C#8

ปกติการประกาศตัวแปรเพื่อใช้สำหรับการทำงานกับไฟล์ หรือ ตัวแปรที่ติดต่อกับฐานข้อมูล
จะการทำงานในลักษณะที่จะต้องมีตัวแปรอ้างอิงค้างไว้ จนเมื่อเสร็จสิ้นการทำงานจึงจะทำการยกเลิกการติดต่อ
จึงจะมีการเรียกใช้เมธอด Close() เมื่อเสร็จสิ้นการใช้งาน เนื่องจากเพื่อให้ผู้อื่นสามารถมาใช้งานได้ และ เมธอด Dispose() เพื่อทำการปล่อยการใช้พื้นที่บนหน่วยความจำ
โดยสามารถเขียน Code ได้ดังรูปที่ 1
รูปที่ 1
จะการทำงานในลักษณะที่จะต้องมีตัวแปรอ้างอิงค้างไว้ จนเมื่อเสร็จสิ้นการทำงานจึงจะทำการยกเลิกการติดต่อ
จึงจะมีการเรียกใช้เมธอด Close() เมื่อเสร็จสิ้นการใช้งาน เนื่องจากเพื่อให้ผู้อื่นสามารถมาใช้งานได้ และ เมธอด Dispose() เพื่อทำการปล่อยการใช้พื้นที่บนหน่วยความจำ
โดยสามารถเขียน Code ได้ดังรูปที่ 1
รูปที่ 1

จากรูปที่ 1 คือ Code แสดงคำสั่งการเขียนข้อมูลลง TextFile ซึ่งอธิบาย Code ได้ดังนี้
รูปที่ 2
- บรรทัดที่ 10 เป็นการประกาศ Object file จาก Class StreamWrite ที่อ้างอิงไปยังไฟล์ Data.txt
- บรรทัด 11-14 เป็นคำสั่งวนลูปจำนวน 100 รอบเพื่อเขียนข้อความลงไปในไฟล์
- บรรทัด 15 เป็นคำสั่งปิดไฟล์ เพื่อให้ Code อื่น ๆ สามารทำงานกับไฟล์ได้
รูปที่ 2
Classic Using
Classic using คือการเขียนคำสั่ง Using ที่มีก่อน C# 8.0 โดยใช้วิธีใส่ keyword using แล้วกำหนดเป็น block โดยใส่ วงเล็บปีกกาobject อะไรก็ตามที่ประกาศไว้ภายในวงเล็บปีกกาจะถูก dispose เมื่อโค้ดเคลื่อนออกนอกวงเล็บปีกกา
นั่นคือเราใช้วงเล็บปีกกาเป็นตัวกำหนด scope ของ variable หรือ object
รูปที่ 2 คือ Code แสดงการใช้งาน Classic Using ต่อไปนี้เป็นคำอธิบาย Code
- บรรทัดที่ 10: ประกาศ variable string array ขนาด 4 element
- บรรทัดที่ 11-14: ใส่ข้อความลงใน element ต่าง ๆ ของ variable
- บรรทัดที่ 15: เรียกเมธอด WriteLinesToFile โดยใช้แปร string ที่ประการไว้ข้างต้นเป็น argument
- บรรทัดที่ 16: แสดงข้อความเพื่อเป็นเครื่องหมายว่าโปรแกรมทำงานเสร็จแล้ว
- บรรทัดที่ 18-39: definition ของ method WriteLinesToFile ที่ภายในมีตัวอย่างโค้ด Classic Using method นี้ทำหน้าที่เขียน string ภายใน parameter ลงสู่ file parameter มีหนึ่งตัวเป็น data type IEnumerable ซึ่งหมายถึงเป็น type อะไรก็ดีที่ implement interface แบบ IEnumerable ไว้รวมถึง array ที่ใช้ในตัวอย่างนี้
- บรรทัดที่ 23: declare variable skippedLines ไว้ก่อนเข้า block using เพราะเราต้องการอ้างถึง variable นี้ที่บรรทัด 39 ที่อยู่นอก scope ของ using
- บรรทัดที่ 24,25: การใช้ Classic using จะตามด้วยวงเล็บที่ภายในมี declare variable ที่เราต้องการกำหนด scope
- บรรทัดที่ 26,28: นี่คือคู่ของวงเล็บปีกกาที่ใช้กำหนด scope ของ variable ที่เรา declare ไว้ในบรรทัดที่ 24,25
- บรรทัดที่ 27-37: loop การทำงานด้วยคำสั่ง foreach ที่จะ loop เป็นจำนวนครั้งเท่ากับ variable lines ภายใน loop มีคำสั่งนำข้อมูลใน variable lines บันทึกลงไปยัง file ครั้งละหนึ่ง element ยกเว้นว่าภายใน element นั้น string มีคำว่า Second อยู่ภายในจะข้ามไปและจะเพิ่มค่า variable skippedLines
- บรรทัดที่ 29: ตรวจสอบว่าภายใน element นี้ใน string มีคำว่า Second อยู่หรือไม่
- บรรทัดที่ 31: ถ้าภายใน element นี้ใน string ไม่มีคำว่า Second ให้บันทึกลง file โดยใช้ method file.WriteLine
- บรรทัดที่ 38: ตรงนี้ variable file ถูก dispose แล้วเพราะออกนอก scope ของ using
- บรรทัดที่ 37: ส่งค่าใน variable skippedLines เป็น return value โปรดสังเกตว่าบรรทัดนี้ variable skippedLines ยังคงอยู่ภายใน scope เพราะเรา declare มันไว้ในบรรทัดคำสั่งก่อน using
- บรรทัดที่ 38: เมื่อถึงบรรทัดนี้ variable file ถูก dispose เพราะถือว่าออกนอก scope การเป็นเช่นนี้ช่วยอำนวยความสะดวกให้เราไม่ต้องใส่คำสั่ง dispose ถ้าเราลืมใส่จะมีผลให้ variable file ยังคงอยู่และ file WriteLine2.txt ยังคงถูกเปิดค้างอยู่จนกว่าโปรแกรมจะจบการทำงานซึ่งไม่ดีเพราะโค้ดอื่นจะไม่สามาถใช้งาน file ได้
รูปที่ 3
Using declarations
Using declarations เป็น feature ใหม่ที่เริ่มใน C# version 8.0โดย Using declarations คือการประกาศ variable ด้วยการใส่ keyword using ไว้ข้างหน้า
การทำเช่นนี้เพื่อจะบอกให้ compiler รู้ว่า variable ที่กำลังประกาศนี้ควรถูก dispose เมื่อจบ enclosing scope
โดย Using declarations ใน C# version 8.0 มีวิธีเขียนที่กระชับกว่าการใช้ Using แบบ Classic
รูปที่ 3 คือโค้ดแสดงการใช้งาน Using declarations ต่อไปนี้เป็นคำอธิบายโค้ด
- บรรทัดที่ 10: ประกาศ variable string array ขนาด 4 element
- บรรทัดที่ 11-14: ใส่ข้อความลงใน element ต่าง ๆ ของ variable
- บรรทัดที่ 15: เรียกเมธอด WriteLinesToFile โดยใช้ variable string ที่ประการไว้ข้างต้นเป็น argument
- บรรทัดที่ 16: แสดงข้อความเพื่อเป็นเครื่องหมายว่าโปรแกรมทำงานเสร็จแล้ว
- บรรทัดที่ 18-39: definition ของ method WriteLinesToFile ที่ภายในมีตัวอย่างโค้ด Using declarations method นี้ทำหน้าที่เขียน string ภายใน parameter ลงสู่ file parameter มีหนึ่งตัวเป็น data type IEnumerable ซึ่งหมายถึงเป็น type อะไรก็ดีที่ implement interface แบบ IEnumerable ไว้รวมถึง array ที่ใช้ในตัวอย่างนี้
- บรรทัดที่ 20: declare variable โดยใส่คำสั่ง using ไว้ข้างหน้า โปรดสังเกตว่าต้องใส่ไว้หน้าสุด ก่อนการระบุ data type ของ variable
- บรรทัดที่ 21: เป็นบรรทัดคำสั่งต่อจากบรรทัดบน กำหนดชื่อ file ที่จะเขียนข้อมูลโดยใช้ method System.IO.StreamWriter
- บรรทัดที่ 22: declare variable ที่จะใช้เป็น status flag โปรดสังเกตว่าเรา declare variable ตัวนี้หลังบรรทัดคำสั่ง using
- บรรทัดที่ 25-35: loop การทำงานด้วยคำสั่ง foreach ที่จะ loop เป็นจำนวนครั้งเท่ากับ variable lines ภายใน loop มีคำสั่งนำข้อมูลใน variable lines บันทึกลงไปยัง file ครั้งละหนึ่ง element ยกเว้นว่าภายใน element นั้น string มีคำว่า Second อยู่ภายในจะข้ามไปและจะเพิ่มค่า variable skippedLines
- บรรทัดที่ 27: ตรวจสอบว่าภายใน element นี้ใน string มีคำว่า Second อยู่หรือไม่
- บรรทัดที่ 29: ถ้าภายใน element นี้ใน string ไม่มีคำว่า Second ให้บันทึกลง file โดยใช้ method file.WriteLine
- บรรทัดที่ 37: ส่งค่าใน variable skippedLines เป็น return value โปรดสังเกตว่าบรรทัดนี้ variable skippedLines ยังคงอยู่ภายใน scope
- บรรทัดที่ 38: เมื่อถึงบรรทัดนี้ variable file ถูก dispose เพราะถือว่าออกนอก scope การเป็นเช่นนี้ช่วยอำนวยความสะดวกให้เราไม่ต้องใส่คำสั่ง dispose ถ้าเราลืมใส่จะมีผลให้ variable file ยังคงอยู่และ file WriteLine2.txt ยังคงถูกเปิดค้างอยู่จนกว่าโปรแกรมจะจบการทำงานซึ่งไม่ดีเพราะโค้ดอื่นจะไม่สามาถใช้งาน file ได้
แม้ว่าการใช้ Using แบบ Classic จะยังใช้ได้ใน C# version 8.0 แต่จากตัวอย่างโค้ด จะพบว่าการใช้ Using Declarations จะทำให้การเขียนคำสั่งสั้นและกระชับมากขึ้นกว่าการใช้ Using แบบ Classic โดยไม่ต้องใส่ปีกกาครอบไว้ ป้องกันการลืมใส่แต่ปีกกาเปิด { แต่ ไม่ได้ใส่ปีกกาปิด } อีกด้วย