วันเสาร์ที่ 23 สิงหาคม พ.ศ. 2557

บล็อกและขอบเขตของตัวแปรและเทคนิคการป้องกันข้อผิดพลาดในการรับข้อมูลตัวเลข

บล็อกและขอบเขตของตัวแปร

    การประกาศตัวแปรใน vc# นั้นไม่จำเป็นต้องประกาศตัวแปรทุกๆ ตัวที่ต้องใช้ไว้ล่วงหน้าเสมอไป แต่สามารถประกาศไว้ ณ จุดที่ต้องการใช้งานก็ได้ เพราะบางครั้งการที่เราต้องใช้ตัวแปรหรือไม่ อาจขึ้นกับเงื่อนไข เช่น ลักษณะต่อไปนี้ตัวแปร z จะถูกสร้างเฉพาะเมื่อเงื่อนไข y !=0 เป็นจริง


     หากเราประกาศตัวแปรไว้ในลูป หรือภายในเงื่อนไขดังโค้ดที่กล่าวมานี้ สิ่งที่ต้องพิจารณาในลาดับถัดไปคือ หากเรานำตัวแปรไปใช้นอกเงื่อนไขหรือนอกลูป ก็จะเกิดข้อผิดพลาดขึ้น เช่น


    ในโค้ดนี้เกิดข้อผิดพลาด เพราตัวแปร z ประการไว้ในบล็อกของ if ซึ่งเมื่อสิ้นสุดบล็อกนี้ แล้วตัวแปรดังกล่าวจะถูกยกเลิกไป ดั้งนั้น เมื่อเราอ้างถึงที่นอกบล็อก จึงเกิดข้อผิดพลาดดังกล่าว

เทคนิคการป้องกันข้อผิดพลาดในการรับข้อมูลตัวเลข

         บางครั้งข้อมูลที่เราจะนำไปใช้นั้น อาจไม่สามารถกำหนดค่าที่แน่นอนไว้ล่วงหน้าได้ เช่น อาจรับผ่าน TxetBox เป็นต้น ซึ่งข้อมูลที่รับมานั้นอาจไม่ถูกต้องตามรูปแบบก็ได้ เช่น หากเราต้องการข้อมูลที่เป็นตัวเลข แต่ ผู้ใช้อาจใส่เป็นอักขระ หรือไม่ก็ใส่ข้อมูลใดๆ เลยก็ได้ ซึ่งอาจส่งผลไปถึงขั้นตอนที่เราจะนำข้อมูลนี้ไปต่อไป ที่อาจทาให้เกิดข้อผิดพลาดขึ้นได้ ดังลักษณะในรูปต่อไปนี้


    ทั้งนี้เพื่อเป็นการป้องกันข้อผิดพลาดดังกล่าวนี้ เราต้องมีการตรวจสอบข้อมูลก่อนการใช้งานเสมอ โดยเฉพาะอย่างยิ่งข้อมูลชนิดตัวเลข ซึ่งนาไปคำนวณ โดยเทคนิคการตรวจสอบตัวเลขที่เราควรรู้ในเบื้องต้นพอสรุปได้ดั้งนี้

การใช้คำสั่ง TryParse()

      คำสั่ง (เมธอด) TryParse() ใช้ในการแปลงข้อมูลไปเป็นข้อมูลชนิดตัวเลขพร้อมกันนี้จะตรวจสอบไปด้วยว่า ข้อมูลนั้นสามารถแปลงเป็นตัวเลขได้หรือไม่ ดังนั้น คำสั่งนี้สามารถป้องกันการผิดพลาดจากการแปลงข้อมูลได้ ซึ่งรูปแบบของคำสั่งนี้ คือ


       ชนิดข้อมูล คือ ชนิดข้อมูลที่จะใช้ในการแปลง ทั้งนี้เราต้องดูว่าจะแปลงไปเป็นข้อมูลชนิดใด เช่น หากเป็น 123 ก็อาจเลือกชนิด int หรือหากเป็น 4.56 ก็อาจใช้ชนิด double เป็นต้น

       out ตัวแปรเก็บผลลัพธ์ คำสั่งนี้จะแปลงค่าผลลัพธ์ที่แปลงเสร็จแล้วกลับออกมาด้วย ดังนั้น จึงต้องมีตัวแปรในการเก็บผลลัพธ์นี้ ซึ่งต้องสร้างตัวแปรนี้เอาไว้ล่วงหน้าก่อน โดยต้องเขียนคีย์เวิร์ด out กำกับไว้หน้าตัวแปรเสมอ

     หากสามารถแปลงเป็นชนิดตัวเลขนั้นได้ เมธอดนี้จะคืนค่า ture พร้อมส่งตัวเลขที่ผลลัพธ์ไปเก็บไว้ที่ตัวแปลที่กำหนด แต่หากไม่สาเร็จจะคืนค่า false ดังนั้น คำสั่ง TryParse() เราควรใช้คู่กับการตรวจสอบไปด้วย if จะเหมาะสมที่สุด เช่น หากต้องตรวจสอบว่าแปลงข้อมูลใน textBox1 ไปเป็นชนิดตัวเลข double ได้หรือไม่ ก็กำหนดโค้ดตามลักษณะดังนี้



    หรือการนำเอาไปใช้ในอีกลักษณะอื่นๆ ที่น่าสนใจ เช่น เราเอาตรวจสอบว่า ถ้าไม่ใช้ข้อมูลตัวเลขโดยใช้ โอเปอเรเตอร์ ! ก็หยุดการทำงานในส่วนมี่เหลือด้วยคาสั่ง return เช่น




การตรวจสอบเงื่อนไขของข้อมูล

    ใน vc# หากเรานำข้อมูลที่ไม่ใช่ชนิดเดี๋ยวกันไปเปรียบเทียบกัน ก็จะเกิดข้อผิดพลาด เช่นเดี๋ยวกันดังเช่นกรณีต่อไปนี้

     เนื่องจากข้อมูลที่อ่านได้จากพร็อปเพอร์ตี้ Text นั้นจะเป็นชนิดสตริงไม่ใช่ตัวเลข จึงเป็นการเปรียบเทียบข้อมูลของคนละประเภท เช่น “abe” > 0 ซึ่งเป็นแนวทางการแก้ปัญหาก็ต้องตรวจสอบและแปลงด้วย TryParse() ก่อนแล้วค่อยนำไปเปรียบเทียบ เช่น


ตัวอย่างที่ 3.8    เป็นการคำนวณหาจานวนเงินท่าต้องจ่ายราคา และจำนวนสินค้าที่เรากำหนด ซึ่งเป็นการตัวอย่างจากบทที่แล้วมาแก้ไขใหม่ โดยก่อนที่จะคำนวณต้องมีการตรวจสอบก่อนว่า ข้อมูลที่ผู้ใช้ใส่เข้ามานั้นเป็นตัวเลขจริงหรือไม่เพื่อป้องกันข้อผิดพลาด โดยราคาสินค้าสามารถเป็นตัวเลขทศนิยมได้ ส่วนจำนวนที่ซื้อต้องเป็นจำนวนเต็ม

1. จัดวางคอนโทรล พร้อมกำหนดชื่อที่จำเป็นดังรูป


2. ดับเบิลคลิกที่ปุ่ม คำนวณ แล้วกำหนดโค้ดดังนี้


3.รันโปรแกรม แล้วลองใส่ข้อมูลที่ไม่ใช่ตังเลขดูว่า การตรวจสอบถูกต้องหรือไม่