C#

เข้ารหัสข้อมูลอ่อนไหวใน ASP.NET

เข้ารหัสข้อมูลอ่อนไหวใน ASP.NET

ยุคที่แฮกเกอร์ชุกชุม มิจฉาชีพมากมาย โปรแกรมอัปมงคลเข้าปลอมปน หน่วยงานรัฐและเอกชนปล่อยข้อมูลผู้ลงทะเบียนรั่วไหล ฯลฯ เหตุการณ์เหล่านี้มีแต่จะรุนแรงขึ้นทุกวัน ในบทความนี้ 9Expert Training จึงจะสอนวิธีเข้ารหัสข้อมูลเพื่อการรักษาความปลอดภัย เทคนิคจำเป็นสำหรับผู้พัฒนาเว็บแอพแบบ ASP.NET เพื่อป้องกันผู้ไม่หวังดีนำข้อมูลที่อ่อนไหวไปแสวงหาผลประโยชน์ แสดงตัวอย่างเป็นโค้ดภาษา C# เข้ารหัสด้วยอัลกอริทึมแบบ AES (Advanced Encryption Standard) ที่เสริมความปลอดภัยให้แอพที่ใช้โปรโตคอล HTTPS ขึ้นไปอีกระดับ
การดึงข้อมูลการผลิตแบบเรียลไทม์ด้วย Power BI

การดึงข้อมูลการผลิตแบบเรียลไทม์ด้วย Power BI

บทความนี้ 9Expert จะสอนวิธีสร้างเว็บเซอร์วิสที่ดึงข้อมูลการผลิตจากเครื่องจักรในโรงงานอุตสาหกรรม นำมาให้บริการเป็น API endpoint แล้วนำข้อมูลไปแสดงเป็นรายงาน Power BI ที่แสดงภาพข้อมูลการผลิตอัปเดตอัตโนมัติแบบเรียลไทม์
BOT ดึงอัตราแลกเปลี่ยนธนาคารแห่งประเทศไทยอัตโนมัติผ่าน API ด้วย .NET Core

BOT ดึงอัตราแลกเปลี่ยน ธปท. อัตโนมัติผ่าน API ด้วย .NET Core

ในบทความนี้ 9Expert Training จะนำเสนอวิธีดึงอัตราแลกเปลี่ยนเงินสกุลต่าง ๆ 48 สกุล อัพเดตอัตโนมัติทุกวัน แปลงเป็นเงินบาท ผ่าน API ของของธนาคารแห่งประเทศไทย (ธปท.) โดยการเขียนโค้ดภาษา C# แบบ .NET Core ที่สามารถนำไปใช้ใน Appได้ทุกแบบ (โมบาย เว็บ เซอร์วิส) ทุกแพลตฟอร์ม (Windows, Linux macOS, Android)
programming-in-c-sharp-advantage-part-9

ข้อดีของภาษา C# เมื่อเทียบกับภาษาอื่น ๆ ตอนที่ 9

เมธอดเสริม (Extension Method) แปลกกว่าเมธอดสมาชิกอื่น ๆ ที่เวลานิยามเราต้องนิยามมันแบบสแตติกเมธอด (static method เมธอดที่เป็นสมาชิกของคลาส ไม่ใช่ของออพเจ็กต์) แต่เวลาเรียกใช้งานเรากลับต้องเรียกใช้งานแบบอินสแตนซ์เมธอด (instance method เมธอดที่เป็นสมาชิกของออพเจ็กต์ ไม่ใช่ของคลาส) พารามิเตอร์ตัวแรกของเมธอดเป็นตัวกำหนดว่าเมธอดนั้นทำงานกับอะไร ในรูปที่ 1 บรรทัดที่ 9 จะเห็นว่ามีคำสั่ง (โมดิไฟเออร์) this ปรากฏอยู่หน้าพารามิเตอร์ คำสั่ง this ทำหน้าที่กำหนดว่าเมธอดนี้ทำงานกับออพเจ็กต์ (ไม่ใช่กับคลาส)
ภาพหน้าปก Interface กับ การสืบคุณสมบัติจากหลายแหล่ง (Multiple Inheritance)

C# Interface กับ Multiple Inheritance เทียบกับภาษาอื่น

การออกแบบและเขียนโปรแกรมแบบ OOP (Object Oriented) ตั้งอยู่บนหลักการสามประการที่เปรียบได้กับสามเสาหลัก ประกอบด้วย Encapsulation, Inheritance และ Polymorphism หากท่านเข้าใจหลักการทั้งสามนี้ ก็เท่ากับว่าท่านเข้าใจหัวใจของ OOP ทั้งหมดแล้ว สำหรับบทความนี้จะกล่าวถึงการสืบคุณสมบัติ หรือ Inheritance นั่นเอง
ภาพหน้าปก มีอะไรใหม่ใน .NET Core 3 และ C# 8 : Stackalloc ซ้อนนิพจน์

มีอะไรใหม่ใน .NET Core 3 และ C# 8 : Stackalloc ซ้อนนิพจน์

เริ่มตั้งแต่ C# 8 และ .NET Core 3.0 ถ้าผลลัพธ์ของนิพจน์ stackalloc มีชนิดข้อมูลเป็นแบบ System.Span<T> หรือ System.ReadOnlySpan<T> เราสามารถใส่นิพจน์ stackalloc ซ้อนไว้ภายในนิพจน์อื่น ๆ ได้
ภาพหน้าปก ภาษา C# และภาษา CIL เป็นมาตรฐานสากล รับรองโดยองค์กร ISO และ ECMA

ภาษา C# และภาษา CIL เป็นมาตรฐานสากล รับรองโดยองค์กร ISO และ ECMA

ภาษา C# และภาษา CIL เป็นมาตรฐานสากล รับรองโดยองค์กร ISO และ ECMA โดยข้อกำหนดจำเพาะ (specification) ของภาษา C# ปรากฏในเอกสารที่รับรองโดย ISO และ ECMA เอกสารนี้ (ECMA-334 และ ISO/IEC 23270) เป็นอกสารหนาหกร้อยหน้า พรรณนาถึงข้อกำหนดของภาษา C# โดยละเอียดทุกแง่มุม เป็นเอกสารที่เปิดให้สาธรณะชนดาวน์โหลดมาอ่านได้โดยอิสระ
ภาพหน้าปก ข้อดีของภาษา C# : Auto-property initializers

ข้อดีของภาษา C# : Auto-property initializers

ภาษา C# สร้างความอุ่นใจในการใช้งานตัวแปร เพราะคอมไพเลอร์จะกำหนดค่าเริ่มต้นให้ตัวแปรโดยอัตโนมัติ ขณะที่บางภาษา เช่น C ไม่มีหลักประกันเช่นนี้
ภาพหน้าปก มีอะไรใหม่ใน .NET Core 3 และ C# 8 : String Interpolation

มีอะไรใหม่ใน .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
ภาพประกอบหน้าปกภาษา C# เร็วกว่า ภาษา JAVA

ภาษา C# เร็วกว่า ภาษา JAVA

จากการทดสอบโดยใช้โปรแกรมวัดความเร็ว (benchmark) พบว่า application ที่พัฒนาด้วยภาษา C# มีประสิทธิภาพสูงกว่า application เดียวกันที่ถูกพัฒนาโดยใช้ภาษา Java การวัดความเร็วของตัวภาษาเองล้วน ๆ เป็นสิ่งไม่มีความหมาย เพราะเหมือนกับพูดว่าภาษาไทยหรือภาษาอังกฤษอันไหนเร็วกว่ากัน แต่การวัดความเร็วของapplication ที่ถูกพัฒนาด้วยภาษาใดภาษาหนึ่งเปรียบเทียบกันสามารถทำได้ ผลลัพธ์ที่ได้จะส่อให้เห็นประสิทธิภาพของตัวแปลภาษาและ runtime ของภาษานั้น ๆ
กลุ่มของ .NET

กลุ่มของ .NET

Framework ของไมโครซอฟท์ที่ใช้ชื่อทางการค้าว่า .NET (ดอนเน็ต) มีหลายแบบหลายเวอร์ชั่น รวมแล้วไม่ต่ำกว่าสามสิบแบบ อย่างที่ได้เรียนให้ทราบไปแล้วในบทความ .NET Core คืออะไร แม้จะมีจำนวนมาก แต่ทั้งหมดก็อาจถูกจัดประเภทออกเป็นกลุ่มใหญ่ ๆ ได้ 4 กลุ่มคือ • .NET Framework • .NET Core • .NET Native • .NET Standard
.NET Core คืออะไร

.NET Core คืออะไร

.NET Core มีองค์ประกอบหลายส่วน อาทิ ตัว run time ชื่อ CoreCLR ซึ่งเป็นตัวrun time ที่มีทุกอย่างครบสมบูรณ์เช่นเดียวกับตัว run time CLR ใน .NET Framework ของ Windows หน้าที่ของมันคือทำตัวเป็น virtual machine เพื่อ Run และดูแลโปรแกรมที่เขียนไว้เพื่อให้ทำงานใน .NET
Switch Statement with Pattern Matching

มีอะไรใหม่ใน .NET Core 2 และ C# 7 : Pattern Matching ด้วยคำสั่ง Switch

ในภาษา C# เวอร์ชัน 7.0 การตรวจสอบเพื่อการจับคู่รูปแบบ (Pattern Matching: PM) ด้วยคำสั่ง if และ switch ได้รับการพัฒนาให้ดียิ่งขึ้น ยืดหยุ่นกว่าเดิม เขียนโค้ดได้สะดวกขึ้น แต่เดิมการทำ PM ด้วยหลักวัตถุวิธีเราจะสร้างคลาสฐานเป็นแบบ “abstract” จากนั้นจะใช้กรรมวิธีสืบคุณสมบัติเป็นคลาสลูกหลาย ๆ แบบตามต้องการ ส่วนเก็บข้อมูลและโค้ดเพื่อจัดการข้อมูลจะถูกผนึกไว้เป็นหน่วยเดียวกัน ซึ่งเป็นการ “เชื่อมแน่น” (tight coupling) ในกรณีที่เราต้องการการ “เชื่อมหลวม” (loose coupling) เราจะแยก ส่วนเก็บข้อมูลและโค้ดเพื่อจัดการข้อมูลออกจากกัน จากนั้นทำ PM ด้วยคำสั่ง if และ switch ซึ่งหากมีรูปแบบจำนวนวนมาก โค้ดจะยืดยาวเยิ่นเย้อ
รูปแสดงหัวข้อ App ไม่ค้างตอนอ่านไฟล์ใหญ่

มีอะไรใหม่ใน .NET Core 2 และ C# 7 : App ไม่ค้างตอนอ่านไฟล์ใหญ่

.NET Core version ที่ออกใหม่ก็จะใช้งานกับภาษา C# version ใหม่สุดได้ .NET Core version ปัจจุบันคือversion 2.1 สนับสนุนภาษา C# version 7.1 ส่วนversionต่อไปคือ 3.0 จะสนับสนุนภาษา C# version 8.0 ในหัวข้อนี้เราจะมาดูตัวอย่างการเขียนโค้ด การทำงานกับซิปไฟล์ (zip file) ด้วยภาษา C# ใน.NET Core ว่าเหมือนหรือแตกต่างกับการเขียนภาษา C# ใน .NET Framework หรือไม่อย่างไร
ข้อดีของภาษา C# เมื่อเทียบกับภาษาอื่น ๆ ตอนที่ 14

ข้อดีของภาษา C# เมื่อเทียบกับภาษาอื่น ๆ ตอนที่ 14

ในตอนที่แล้วผู้เขียนพูดถึงเรื่องการเจาะจงอินเตอร์เฟส ซึ่งมีไว้เพื่อแก้ปัญหาในกรณีที่คลาสหนึ่งคลาสสืบคุณสมบัติจากอินเตอร์เฟสสองตัว และอินเตอร์เฟสสองตัวนั้นมีเมธอดชื่อเดียวกันและมีซิกเนเจอร์ตรงกัน จะมีผลให้อินเตอร์เฟสทั้งสองเรียกไปยังเมธอดเดียวกัน ในตอนนี้หัวข้อนี้จะพูดถึงการสร้างสมาชิกของอินเตอร์เฟสสองตัวแบบเจาะจงบ้าง
หน้าปกบทความ Backward Compatibility (การเข้ากันได้ย้อนหลัง) ของ API

Backward Compatibility (การเข้ากันได้ย้อนหลัง) ของ API

บทความตอนนี้พูดถึง Backward Compatibility ของ API ซึ่งคนโค้ดควรรู้และระมัดระวังเมื่อใช้งาน Framework ที่ออก version ใหม่กับ source code เก่าหรือ binary ที่ Compile ไว้กับ version เก่า หรือเมื่อเขียน library ใช้งานเอง เช่น ปัญหา Reference Types ที่ไม่เกี่ยวข้อง parameter แบบ Reference Types กับแบบที่ค่าเป็น null ไม่ได้ parameter ทางเลือก (Optional parameters) และ ปัญหาเรื่องความเข้ากันได้ย้อนหลังในระดับ source code และ binary เมื่อมีการทำ method overload กับ Type ที่เป็น Generic
C#7 ตัวกระทำ is กับ คุณสมบัติใหม่ในคำสั่ง switch และ Ref local

.NET Core 2 และ C# 7 : ตัวกระทำ is, switch ใหม่ และ Ref local

เริ่มในภาษาC# เวอร์ชั่น 7.0 ขึ้นไปตัวกระทำ is มีความสามารถเพิ่มจากเดิมเพื่อใช้ในงานตรวจสอบรูปแบบที่ซับซ้อนได้ดีขึ้นกว่าเดิม ตัวกระทำ is ใช้หาชนิดของtypeเพื่อตรวจสอบความเข้ากันได้ขณะrunโปรแกรม มันทำหน้าที่ตรวจว่า objectหรือผลลัพธ์จากนิพจน์สามารถแปลงไปเป็นชนิดข้อมูลที่กำหนดได้หรือไม่ มีsyntaxอย่างที่เห็นในรูปที่ 1 บรรทัด 3
การ Deconstruct Tuple และ Type อื่น ๆ

.NET Core 2 และ C# 7 : Deconstruct Tuple และ Type อื่นๆ

ภาษาC# 7.0 ขึ้นไปสนับสนุนการประกาศตัวแปรแบบ discard ซึ่งเป็นตัวแปรแบบเขียนได้เท่านั้น (read-only) โดยที่ท่านจะประกาศตัวแปรแบบนี้กี่ตัวก็ได้ แต่ทุกตัวจะมีชื่อเดียวกันหมดคือ _ (เครื่องหมายขีดเส้นใต้หรือ underscore) ประโยชน์ของตัวแปรแบบ discard คือการนำไปใช้กับTuple (Tuple อ่านรายละเอียดเรื่องTupleได้จากบทความตอนก่อนหน้านี้) เพราะการรับค่าส่งกลับจากmethodที่ส่งค่ากลับเป็นTuple หรือการเรียกใช้methodที่มีพารามิเตอร์แบบ out เราจะต้องประกาศตัวแปรไว้รับค่า ซึ่งบ่อยครั้งที่เราไม่ต้องการใช้ค่าจากตัวแปรเหล่านั้น แต่ก็จำต้องประกาศ ทำให้โค้ดรกรุงรังโดยเปล่าประโยชน์
Hybrid App คืออะไร

Hybrid App คืออะไร

บทความที่แล้วเราได้พูดถึงการพัฒนาแอพลิเคชั่นด้วย Native App ไปแล้ว โดยจะพบว่า Native App จะต้องความรู้ความสามารถเฉพาะทางค่อนข้างมาก จึงต้องใช้ต้นทุนในการพัฒนาสูงมาก ดังนั้นมีอีกทางเลือกหนึ่งในการพัฒนาแอพลิเคชั่น คือ Hybrid App
Native App คืออะไร

Native App คืออะไร

ในปัจจุบัน การพัฒนาแอพลิเคชั่นสำหรับสมาร์ทโฟนและแท็ปเล็ตมีหลากหลายแบบ แบบที่นิยมจะมีอยู่สองแบบคือ Native App และ Hybrid App
ข้อดีของภาษา C# เมื่อเทียบกับภาษาอื่น ๆ ตอนที่ 7

ข้อดีของภาษา C# เมื่อเทียบกับภาษาอื่น ๆ ตอนที่ 7

ในภาษาซีชาร์ปเราสามารถกำหนดหน้าที่ใหม่ให้แก่ตัวกระทำ (Operator โอเปอร์เรเตอร์) เพื่อให้มันทำงานแตกต่างไปจากการทำงานปรกติที่ถูกกำหนดไว้โดยปริยายได้ เรียกการทำเช่นนี้ว่าโอเปอร์เรเตอร์โอเวอร์โหลดดิง (operator overloading) ภาษาจาวาไม่มีคุณสมบัตินี้ และเราจะทำเช่นนี้ในภาษาซีมาตรฐานก็ไม่ได้เหมือนกัน
ภาพหน้าปก มีอะไรใหม่ใน .NET Core 2 และ C# 7 : ไม่ต้อง run dotnet restore

มีอะไรใหม่ใน .NET Core 2 และ C# 7 : ไม่ต้อง run dotnet restore

ใน .NET เวอร์ชั่น 2.0 ขึ้นไปเราไม่ต้อง run คำสั่ง dotnet restore อีกต่อไปแล้ว เพราะเมื่อท่านใช้คำสั่งที่ต้องการ dotnet restore NuGet จะ run ให้เองโดยอัตโนมัติ dotnet restore เป็นคำสั่งหรับดึง dependency ไฟล์ต่าง ๆ เช่นไฟล์ Assembly ที่เป็น library ของ .NET Core ) และเครื่องเมื่ออื่น ๆ ที่โปรเจ็กต์นั้นต้องการใช้ โดยดาวน์โหลดซอฟต์แวร์ผ่านบริการของ NuGet เป็นคำสั่งที่มีมาตั้งแต่ .NET Core เวอร์ชั่น 1.x โดยการดึง dependency และเครื่องมือจะเกิดขึ้นพร้อม ๆ กันและทำงานขนานกัน
ข้อดีของภาษา C# เมื่อเทียบกับภาษาอื่น ๆ ตอนที่ 2

ข้อดีของ ภาษา C# เมื่อเทียบกับภาษาอื่น ๆ ตอนที่ 2

ข้อดีอีกอย่างหนึ่งของภาษาซีชาร์พเมื่อเทียบกับภาษาซีคือเราสามารถอ้างถึงตัวแปรหรือเมธอดที่อยู่ในไฟล์อื่นได้โดยไม่ต้องสร้าง “เฮดเดอร์ไฟล์” (ซอร์สไฟล์ที่มีนามสกุล .h) แล้วจึงใช้คำสั่ง #include เพื่อบอกให้คอมไพเลอร์รู้ว่าสิ่งที่อ้างถึงนั้นอยู่ในไฟล์ไหน ที่เป็นอย่างนั้นเพราะคอมไพเลอร์ภาษาซีชาร์พจะตรวจสอบซอร์สไฟล์ทั้งหมดภายในโปรเจ็กต์ให้โดยอัตโนมัติ
เขียนโปรแกรมวัตถุวิธีซีชาร์พ ตอน 4: กลเม็ด พรอพเพอร์ตี้

การเขียนโปรแกรมแบบวัตถุวิธีในภาษาซีชาร์ป (OOP with C#) ตอนที่ 4

ในตอนที่ผ่านมาผู้เขียนได้พูดถึงพรอพเพอร์ตี (property) โดยละเอียด และได้พาดพิงถึงหลักการที่เกี่ยวข้องกับคลาสสิกพรอพเพอร์ตี อาทิ สมาชิกแบบฟิลด์, เอนเคปซูเลชัน, การเชื่อมหลวมและเกตเตอร์/เซตเตอร์ ในบทความตอนนี้ผู้เขียนจะพูดถึงแง่มุมต่าง ๆ ของการเขียนโค้ดใช้งานพรอพเพอร์ตี เช่น วิธีใส่โค้ดคัดกรองข้อมูลในคลาสสิกพรอพเพอร์ตี วิธีเขียนและใช้งาน “ออโตพรอพเพอร์ตี” (auto implemented properties) และวิธีลดทอนพรอพเพอร์ตีด้วย “นิพจน์ฝังตัว” (Expression-bodied members) ที่มีประโยชน์มาก เพราะจะช่วยให้การเขียนโค้ดกระชับขึ้นไปอีก
เขียนโปรแกรมวัตถุวิธีซีชาร์พ

การเขียนโปรแกรมแบบวัตถุวิธีในภาษาซีชาร์ป (OOP with C#) ตอนที่ 3

พรอพเพอร์ตี ของดีใน C# ในตอนที่ผ่านมาผู้เขียนได้พูดถึงพรอพเพอร์ตี (property) ไปแล้วอย่างคร่าวๆ ในบทความตอนนี้ได้เวลาที่จะพูดถึงพรอพเพอร์ตีโดยละเอียดเสียที พรอพเพอร์ตีเป็นเรื่องสำคัญ มันเป็นสมาชิกของคลาสที่ช่วยให้เราเขียนโปรแกรมตามลัทธิวัตถุวิธีได้ง่ายขึ้นและสวยงามขึ้น มันเป็นคุณสมบัติพิเศษในภาษาซีชาร์พที่ท่านจะไม่พบในภาษาอื่น การศึกษาให้เข้าใจว่าพรอพเพอร์คืออะไร มีประโยชน์อย่างไร และใช้งานอย่างไรจะช่วยให้ท่านเขียนโค้ดแบบ OOP ในภาษาซีชาร์พได้อย่างสง่างาม
การเขียนโปรแกรมแบบวัตถุวิธีในภาษาซีชาร์ป OOP

การเขียนโปรแกรมแบบวัตถุวิธีในภาษาซีชาร์ป (OOP with C#) ตอนที่ 1

การเขียนโปรแกรมแบบวัตถุวิธีในภาษาซีชาร์ป (OOP with C#) การออกแบบและเขียนโปรแกรมแบบวัตถุวิธี (Object Oriented Programming: OOP ออพเจ็กต์โอเรียนเท็ดโปรแกรมมิง) ตั้งอยู่บนหลักการสามประการที่เปรียบได้กับสามเสาหลัก ประกอบด้วย หลักการเอนแคปซูเลชัน (Encapsulation) อินเฮียริแตนซ์ (Inheritance) และโพลิมอร์ฟิสซึม (Polymorphism) หากท่านเข้าใจหลักการทั้งสามนี้ ก็เท่ากับว่าท่านเข้าใจหัวใจของ OOP ทั้งหมดแล้ว
การควบคุมการมองเห็น (Visibility)

การควบคุมการมองเห็น (Visibility)

เรียนรู้การควบคุมการมองเห็น (Visibility) ใน C# ด้วย Access Type ทั้ง Public, Internal, Protected และ Private เพื่อกำหนดระดับการเข้าถึงสมาชิกของ Class
Class คืออะไร

Class คืออะไร

Class คือ ต้นแบบของวัตถุ (Object) สำหรับในการพัฒนาแบบ OOP (Object Oriented Programming) วัตถุแต่ละสิ่งนั้นจะมีคุณลักษณะและการทำงานที่เหมือนกัน หรือคล้ายกัน
Exception ใน .NET

Exception ใน .NET

Exception หมายถึง ข้อยกเว้นเมื่อเกิดความผิดพลาดในการทำงานของคำสั่ง
การใช้เงื่อนไขถ้า....แล้ว (if....else)

การใช้เงื่อนไขถ้า....แล้ว (if....else)

เรียนรู้การใช้เงื่อนไข if..else ในภาษา C# สำหรับการตัดสินใจในโปรแกรม พร้อมตัวอย่างการคำนวณเกรดจากคะแนนสอบ