Properties

11 February 2016

Properties คืออะไร

Properties คือสมาชิกของคลาสที่ทำให้สามารถอ่านหรือเขียนข้อมูลให้กับตัวแปรในคลาสได้ยืดหยุ่นและซับซ้อนขึ้น ซึ่งใช้หลักการทำงานของเมธอดในการทำงานภายใน โดยปกติแล้ว property จะใช้สำหรับการเข้าถึงตัวตัวแปรที่เป็น private ภายในคลาส โดยที่โปรแกรมภายนอกไม่สามารถเข้าถึงตัวแปรนั้นโดยตรงได้

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

public returnType PropertyName
{
    get
    {
        return // data to return; 
    }
    set { 
        privateField = value;
    }
}

จากรูปแบบของการประกาศ properties นั้นจะเห็นว่ามันคล้ายกับเมธอด แต่เพียงจะมีเมธอดย่อยแยกลงไปอีกคือ get และ set โดยในการส่งค่ากลับหรือกำหนดค่านั้น สามารถทำได้ในรูปแบบ expressions ได้ สำหรับตัวแปร value นั้นจะเป็นค่าคงที่ของค่าที่ส่งเข้ามา นอกจากนี้ Property ยังสามารถที่จะกำหนดให้สามารถอ่านหรือเขียนได้อย่างเดียวได้

สร้างและใช้งาน Properties ในภาษา C#

มาดูตัวอย่างการใช้งานของ property ที่เกี่ยวกับอุณหภูมิ เพื่อให้คุณได้เข้าใจเกี่ยวกับการใช้งานของ Property ได้มากขึ้น

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Properties
{
    class Location {

        public string name;
        private double celsius = 0;

        public double Celsius
        {
            get { return celsius; }
            set { celsius = value; }
        }

        public double Fahrenheit
        {
            get { return (celsius * 1.8) + 32; }
            set { celsius = (value - 32) * 5.0 / 9.0;}
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            Location a = new Location();
            Location b = new Location();
            Location c = new Location();

            a.name = "New York";
            a.Fahrenheit = 56;

            b.name = "Bangkok";
            b.Celsius = 32;

            c.name = "Kiev";
            c.Fahrenheit = 32;

            Console.WriteLine("Temperature in " + a.name + " is " + (int)a.Celsius + " C");
            Console.WriteLine("Temperature in " + b.name + " is " + b.Fahrenheit + " F");
            Console.WriteLine("Temperature in " + c.name + " is " + c.Fahrenheit + " F");
        }
    }
}

จากตัวอย่างด้านบนเป็นการใช้ properties ในภาษา C# เราได้สร้างคลาส Location ขึ้นมาและมีตัวแปร celsius ซึ่งเป็นตัวแปรแบบ private โดยเราจะใช้ property ในการอ่านและเขียนข้อมูลสำหรับมัน เรามีสอง properties คือ Celsiusและ Fahrenheit โดยทั้งสองนี้จะมีฟังก์ชันสำหรับการ set และ get แยกกัน นั่นหมายความว่า คุณสามารถแก้ไขหรือปรับปรุงค่าก่อนที่จะเก็บได้

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

a.Fahrenheit = 56; // invoke set
int temp = b.Fahrenheit; // invoke get

จากโค้ดตัวอย่างในสองคำสั่งด้านบน เมธอด set ใน property จะถูกเรียกใช้งานเมื่อเราได้ทำการกำหนดค่าให้กับ Property ด้วยตัวดำเนินการกำหนดค่า และเมธอด get จะถูกใช้งานเมื่อเราได้นำค่าของ Property มาใช้งานในรูปแบบของ Expression นั่นหมายความว่า เราสามารถที่จะคำนวณและเปลี่ยนแปลงค่าต่างๆ ภายในเมธอดเหล่านี้ก่อนที่จะกำหนดค่าให้กับตัวแปรภายในคลาสหรือส่งกลับไปยังกาเรียกใช้ได้

Temperature in New York is 13 C
Temperature in Bangkok is 89.6 F
Temperature in Kiev is 32 F

และนี่เป็นผลลัพธ์ของโปรแกรมในการใช้ Property เก็บค่าอุณหภูมิ

Read only property

ในตัวอย่างก่อนหน้า เป็นตัวอย่างของการใช้งาน Property ที่สามารถอ่านและเขียนได้ ในภาษา C# คุณสามารถที่จะกำหนดให้ Property อ่านได้เพียงอย่างเดียวได้ โดยไม่ต้องกำหนดเมธอด set ให้กับ Property ต่อไปเป็นตัวอย่างของ Property ทีไ่ด้อ่านได้อย่างเดียวหรือ Read only property

using System;

class Person
{

    private string firstName;
    private string lastName;

    public Person(string firstName, string lastName)
    {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public string Name
    {
        get
        {
            return firstName + " " + lastName; 
        }
    }

}

class Program
{
    static void Main(string[] args)
    {

        Person person = new Person("Mark", "Roberts");
        Console.WriteLine(person.Name);

    }
}

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

person.Name = "Some names"; // Error

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับ Property และวิธีการใช้งานของมันที่จะช่วยให้สามารถเข้าถึงสมาชิกภายในคลาสได้อย่างยืดหยุ่น ซึ่งมันสามารถทำงานได้เหมือนฟังก์ชันแต่มีการเรียกใช้งานที่ง่ายเหมือนตัวแปร ซึ่งการใช้ Property นั้นถือว่าเป็นแนวคิดหนึ่งของ Encapsulation รวมทั้งการสร้างและใช้งาน Read only property

บทความนี้เป็นประโยชน์หรือไม่? Yes · No