Simple property vs public field

posted on 02 Nov 2005 21:20 by tidno1 in csharp-and-dotnet

เคยมีคนถามเหมือนกันว่าการใช้ property (เหมือนกับการเขียน get/set method ใน java) กับการกำหนด field(ตัวแปร ภายใน class) ให้เป็น public นั้นต่างกันยังไง (โดยไม่ care หลักของ oo ที่ห้ามไม่ให้ตัวแปรเป็น public) โดยเฉพาะ property ที่ไม่ได้มีอะไรพิเศษดังนี้

class Example {
    private string name;

    public string Name {
        get {
            return name;
        }

        set {
            name = value;
        }
    }
}

สู้เขียนอย่างนี้ไปเลยดีกว่ามั้ย

class Example {
    public string Name;
}

คนที่เขียนโปรแกรมโดยไม่ได้เคร่งหลัก OO มากมายนักคงจะเลือกใช้วิธีหลังอยู่แล้ว เพราะว่าการใช้ property ก็เหมือนกับการเรียกใช้ method ซึ่งจะต้องมี overhead มากกว่าการเรียกใช้ field ธรรมดา

ดังนั้นแล้ว การที่ property เทียบได้กับ method ทำให้เราไม่สามารถ pass property เป็น parameter แบบ ref หรือ out ได้ ไม่เชื่อก็ลองรัน code นี้ดู

class Test {
    static void Main() {
      Example ex = new Example( );
      ByRef(ref ex.PName); // Compile-time error
      ByOut(out ex.PName); // Compile-time error
      ByRef(ref ex.FName); // Okay
      ByOut(out ex.FName); // Okay
    }
  
    static void ByRef(ref string name) { 

    }
    
    static void ByOut(out string name) {
        name = ""
    }
}

class Example {
    public string FName;

    public string PName {
        get {
            return FName;
        }

        set {
            FName = value;
        }
    }
}

Comment

Comment:

Tweet

อ่า..ม่ายเข้าใจอ่ะ

#5 By Soup on 2005-11-08 18:49

อ่อ get ล่ะ

#4 By plynoi แว่วศรี on 2005-11-03 22:34

#1 คือปกติเราจะใช้งาน property เหมือนกับว่ามันเป็นแค่ field ตัวนึงของคลาสนั้นน่ะครับ

แบบว่าเราเรียก ex.PName ได้ด้วยความรู้สึกที่เหมือนกับใช้งานตัวแปรธรรมดา เพียงแต่ว่าถ้าเราเอามันส่งเป็นพารามิเตอร์เข้า method แบบ pass by reference ไม่ได้(เพราะมันไม่ใช้ตัวแปร เลยไม่มี address)

#3 By T!D on 2005-11-03 13:31

เรามองว่า property ที่เป็น private ก็เป็น property เหมือนกันนะ
เพียงต่อเป็น property ที่ต้องการ verify ค่า
เลยต้องมี method
ถ้าไม่ต้องการ verify ค่าก็จะทำเป็น public ตลอดเลยอ่ะ

#2 By kaze on 2005-11-03 11:08

สงสัยอันนี้อ่ะคับ

pass property เป็น parameter แบบ ref หรือ out ได้

หมายถึงอะไรเหรอ

#1 By plynoi แว่วศรี on 2005-11-03 01:18