{รับคืออะไร; ตั้ง; } ไวยากรณ์ใน C #?


577

ฉันกำลังเรียนรู้ ASP.NET MVC และฉันสามารถอ่านเอกสารภาษาอังกฤษได้ แต่ฉันไม่เข้าใจจริงๆว่าเกิดอะไรขึ้นในรหัสนี้:

public class Genre
{
    public string Name { get; set; }
}

สิ่งนี้หมายความว่า: { get; set; }?


4
โดยทั่วไปแล้วความจำ - ผู้สร้างทำให้วัตถุของคุณไม่แน่นอน getters ละเมิด "บอกวัตถุสิ่งที่ต้องทำอย่าขอข้อมูลและดำเนินการด้วยตนเอง" ดังนั้นโดยทั่วไปอย่าเพิ่มตัวตั้งค่าและตัวรับตามค่าเริ่มต้น คุณจะต้องการบ่อย แต่คุณควรพบความต้องการที่แท้จริงก่อนที่จะเพิ่มพวกเขา โดยเฉพาะอย่างยิ่งไม่ควรใช้ setters ในรหัสการผลิต (มุ่งมั่นเพื่อความไม่สามารถใช้ได้ทุกที่ที่เป็นไปได้และเมื่อจำเป็นต้องมีการกลายพันธุ์คุณควรขอให้มันกลายพันธุ์ให้คุณไม่ได้ตั้งค่า)
Bill K

8
เพียงเพื่อเพิ่มบางสิ่งบางอย่าง ... ถ้าคุณไม่ใส่{get; set;}คุณกำลังสร้างสนามแต่ถ้าคุณใส่{get; set;}คุณกำลังสร้างทรัพย์สิน การมีคุณสมบัติสามารถทำให้บางอย่างง่ายขึ้นโดยเฉพาะเมื่อทำงานกับ Reflection
Seichi

@Seichi โดยใช้ get-setter สร้าง Field ด้วย แต่อันนี้ถูกซ่อนประกาศเป็นส่วนตัวและแก้ไขโดยคุณสมบัติที่สร้างอัตโนมัติ ทั้งหมดที่ทำโดยคอมไพเลอร์
Jonathan Ramos

1
คุณสมบัติอัตโนมัติไม่เอาชนะวัตถุประสงค์ของเขตข้อมูลส่วนตัวหรือไม่
mireazma

คำตอบ:


567

มันเป็นคุณสมบัติอัตโนมัติที่เรียกว่าและเป็นชวเลขเป็นหลักสำหรับสิ่งต่อไปนี้ (โค้ดที่คล้ายกันจะถูกสร้างโดยคอมไพเลอร์):

private string name;
public string Name
{
    get
    {
        return this.name;
    }
    set
    {
        this.name = value;
    }
}

93
Klaus คุณช่วยอธิบายได้ว่าอะไรจะเกิดขึ้นกับรหัสนี้? มันอาจได้ประโยชน์จากคำอธิบายที่ละเอียดกว่านี้
TylerH

3
ดังนั้นเพื่อให้แน่ใจว่า: มันเหมือนกับว่าฉันใช้งาน=โอเปอเรเตอร์มากเกินไปแต่มีเพียงองค์ประกอบเดียวใช่มั้ย
Hi-Angel

9
ทำไมเราต้องการ var ส่วนตัว :-/ ความอัปยศ.
Oliver Dixon

2
@TylerH เหตุผลของตัวแปรส่วนตัวคือการห่อหุ้มส่วน get / set จัดให้มี "gate" เพื่อรับหรือตั้งค่าตัวแปร แม้ว่าจะมีหลายเหตุผลที่จะไม่ใช้ get / setters เพราะ "gate" สามารถทำลาย encapsulation ของตัวแปรส่วนตัว (ไม่ควรเข้าถึงได้)
Alexander

4
อาจชัดเจน แต่ฉันต้องการชี้แจงว่าชวเลขไม่ใช่ชวเลขอย่างแท้จริง นั่นคือไม่มีการnameสร้างตัวแปรส่วนตัว หากคุณพยายามอ้างอิงตัวแปรส่วนตัวนี้ภายในคลาสมันจะล้มเหลว ฉันไม่แน่ใจว่า C # ทำอย่างไร แต่มันจะทำงานราวกับว่ามีตัวแปรส่วนตัวที่ไม่มีชื่อซึ่งคุณไม่สามารถเข้าถึงในรหัสของคุณ
Denziloe

432

ดังนั้นฉันเข้าใจว่ามัน{ get; set; }เป็น "คุณสมบัติอัตโนมัติ" ซึ่งเหมือนกับ @Klaus และ @Brandon กล่าวว่าเป็นการจดชวเลขเพื่อเขียนคุณสมบัติด้วย "เขตข้อมูลสำรอง" ดังนั้นในกรณีนี้:

public class Genre
{
    private string name; // This is the backing field
    public string Name   // This is your property
    {
        get => name;
        set => name = value;
    }
}

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

getและsetเป็นaccessorsซึ่งหมายความว่าพวกเขาสามารถเข้าถึงข้อมูลและข้อมูลในเขตข้อมูลส่วนตัว (โดยทั่วไปจากเขตข้อมูลสำรอง ) และมักทำจากคุณสมบัติสาธารณะ (ดังที่คุณเห็นในตัวอย่างด้านบน)

ไม่มีการปฏิเสธว่าข้อความข้างต้นค่อนข้างสับสนดังนั้นเรามาดูตัวอย่าง สมมติว่ารหัสนี้หมายถึงประเภทของดนตรี ดังนั้นในประเภทคลาสเราจะต้องการแนวเพลงที่แตกต่าง สมมติว่าเราต้องการมี 3 ประเภท: ฮิปฮอปร็อคและประเทศ ในการทำเช่นนี้เราจะใช้ชื่อClassเพื่อสร้างอินสแตนซ์ใหม่ของคลาสนั้น

Genre g1 = new Genre(); //Here we're creating a new instance of the class "Genre"
                        //called g1. We'll create as many as we need (3)
Genre g2 = new Genre();
Genre g3 = new Genre();

//Note the () following new Genre. I believe that's essential since we're creating a
//new instance of a class (Like I said, I'm a beginner so I can't tell you exactly why
//it's there but I do know it's essential)

ตอนนี้เราได้สร้างอินสแตนซ์ของคลาส Genre แล้วเราสามารถตั้งชื่อประเภทโดยใช้คุณสมบัติ 'ชื่อ' ที่ตั้งค่าไว้ด้านบน

public string Name //Again, this is the 'Name' property
{ get; set; } //And this is the shorthand version the process we're doing right now 

เราสามารถตั้งชื่อ 'g1' เป็น Hip Hop ได้โดยการเขียนสิ่งต่อไปนี้

g1.Name = "Hip Hop";

สิ่งที่เกิดขึ้นที่นี่เป็นเรื่องซับซ้อน อย่างที่ฉันพูดไว้ก่อนหน้านี้getและsetการเข้าถึงข้อมูลจากเขตข้อมูลส่วนตัวที่คุณไม่สามารถเข้าถึงได้ getสามารถอ่านข้อมูลจากฟิลด์ส่วนตัวนั้นและส่งคืนได้ setสามารถเขียนข้อมูลในเขตข้อมูลส่วนตัวนั้นเท่านั้น แต่ด้วยการมีคุณสมบัติที่มีทั้งสองอย่างgetและsetเราสามารถทำหน้าที่ทั้งสองนั้นได้ และโดยการเขียนg1.Name = "Hip Hop";เราใช้setฟังก์ชันจากคุณสมบัติชื่อของเรา

setvalueใช้ตัวแปรโดยปริยายเรียกว่า โดยทั่วไปความหมายนี้คือเมื่อใดก็ตามที่คุณเห็น "ค่า" ภายในsetหมายถึงตัวแปร ตัวแปร "value" เมื่อเราเขียนg1.Name =เรากำลังใช้=ที่จะผ่านในตัวแปรซึ่งในกรณีนี้คือvalue "Hip Hop"ดังนั้นคุณสามารถคิดแบบนี้ได้:

public class g1 //We've created an instance of the Genre Class called "g1"
{
    private string name;
    public string Name
    {
        get => name;
        set => name = "Hip Hop"; //instead of 'value', "Hip Hop" is written because 
                              //'value' in 'g1' was set to "Hip Hop" by previously
                              //writing 'g1.Name = "Hip Hop"'
    }
}

สิ่งสำคัญคือให้สังเกตว่าตัวอย่างข้างต้นไม่ได้เขียนไว้ในรหัส มันเป็นรหัสสมมุติมากกว่าที่แสดงถึงสิ่งที่เกิดขึ้นในพื้นหลัง

ดังนั้นตอนนี้เราจึงตั้งชื่ออินสแตนซ์ชื่อของ g1 ของประเภทผมเชื่อว่าเราจะได้รับชื่อโดยการเขียน

console.WriteLine (g1.Name); //This uses the 'get' function from our 'Name' Property 
                             //and returns the field 'name' which we just set to
                             //"Hip Hop"

และถ้าเราทำสิ่งนี้เราจะเข้าไป"Hip Hop"อยู่ในคอนโซลของเรา

ดังนั้นเพื่อจุดประสงค์ของคำอธิบายนี้ฉันจะทำตัวอย่างด้วยผลลัพธ์เช่นกัน

using System;
public class Genre
{
    public string Name { get; set; }
}

public class MainClass
{
    public static void Main()
    {
        Genre g1 = new Genre();
        Genre g2 = new Genre();
        Genre g3 = new Genre();

        g1.Name = "Hip Hop";
        g2.Name = "Rock";
        g3.Name = "Country";

        Console.WriteLine ("Genres: {0}, {1}, {2}", g1.Name, g2.Name, g3.Name);
    }
}

เอาท์พุท:

"Genres: Hip Hop, Rock, Country"

18
โดยส่วนตัวฉันจะแสดงความคิดเห็นออกเช่นนี้set{name = value;} // 'value' here is equal to "Hip Hop"
maksymiuk

2
@iLoveUnicorns ก็มีสำหรับวัตถุประสงค์ของนามธรรมข้อมูล เขตข้อมูลสำรองคือสิ่งที่มีข้อมูลจริง นิยามคุณสมบัติจริงกำหนดวิธีการเข้าถึงข้อมูลด้วยgetและsetวิธีการ ลิงค์ที่ฉันให้ไว้มีคำพูดที่ยอดเยี่ยมจาก John Guttag ที่ด้านบนของหน้า ฉันอยากจะแนะนำให้อ่านหนังสือของเขาหรือแม้กระทั่งเรียนหลักสูตรออนไลน์ฟรี
โจซี่ ธ อมป์สัน

2
เราไม่สามารถใช้: public class Genre{public string Name;} แทนที่จะเป็น: public class Genre{ public string Name { get; set; }}. ฉันหมายความว่าทำไมเราถึงต้องได้รับ ตั้ง; }?
user2048204

1
ดูเหมือนว่าความกังวลของฉันได้ถูกสะท้อนออกไปแล้ว หากคุณประกาศด้วยวิธีนี้: "ชื่อสตริงสาธารณะ {get; set;}" และคุณเข้าถึงวิธีนี้: g1.Name = "Hip Hop"; - แล้วการวางแนววัตถุอยู่ที่ไหน ฉันไม่ต้องการแม้แต่สิ่งที่เรียกว่า "เขตข้อมูลสำรอง" เขตข้อมูลสำรองไม่มีอยู่เท่าที่ฉันกังวล เพราะฉันเข้าสู่พื้นที่สาธารณะเท่านั้น และถ้าเขตข้อมูลสาธารณะเป็น "สาธารณะ" ก็จะไม่เป็นไปตามมาตรฐาน OO กลับไปที่ COBOL กันเถอะ
บารุคอัตตา

1
คำตอบที่ดี แต่ถ้าเราอวดความคิด“ ตั้ง” เป็นผู้เปลี่ยนแปลงไม่ใช่ผู้เข้าถึง
pythlang

100

สิ่งเหล่านี้เป็นคุณสมบัติอัตโนมัติ

อีกวิธีหนึ่งในการเขียนคุณสมบัติด้วยเขตข้อมูลสำรอง

public class Genre
{
    private string _name;

    public string Name 
    { 
      get => _name;
      set => _name = value;
    }
}

7
สิ่งที่เรียกว่า "เขตข้อมูลสำรอง"?
kn3l

4
@stackunderflow: เขตข้อมูลสำรองเป็นที่จัดเก็บข้อมูล (สิ่งที่ถูกส่งคืนเมื่อใช้getและยังคงใช้อยู่set) เช่นเดียวกับตู้ที่getและsetเปิดประตู
โทมัส

5
@stackunderflow: _nameในคำตอบนี้ข้อมูลการสนับสนุนคือ ในคุณสมบัติอัตโนมัติฟิลด์สำรองจะถูกซ่อนไว้
จัสติน

36

นี่เป็นวิธีสั้น ๆ ในการทำสิ่งนี้:

public class Genre
{
    private string _name;

    public string Name
    {
      get => _name;
      set => _name = value;
    }
}

33

เป็นทางลัดในการเปิดเผยข้อมูลสมาชิกในแบบสาธารณะเพื่อให้คุณไม่จำเป็นต้องสร้างสมาชิกข้อมูลส่วนตัวอย่างชัดเจน C # จะสร้างข้อมูลส่วนตัวให้คุณ

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


2
Kelsey - คุณช่วยอธิบายว่าไวยากรณ์นี้ทำให้รหัส "ยืดหยุ่น" ได้อีกหรือไม่? ฉันไม่เห็นมัน หากคุณต้องการเพิ่ม "ตรรกะ" ใด ๆ ลงใน setter หรือทะเยอทะยานดังนั้นในกรณีอีเธอร์ (มีหรือไม่มีข้อมูลส่วนตัว) คุณจะยังคงทำลายส่วนต่อประสานตามที่เป็นอยู่และต้องการการเข้ารหัส
บารุคอัตตา

18

โดยทั่วไปมันเป็นทางลัดของ:

class Genre{
    private string genre;
    public string getGenre() {
        return this.genre;
    }
    public void setGenre(string theGenre) {
        this.genre = theGenre;
    }
}
//In Main method
genre g1 = new Genre();
g1.setGenre("Female");
g1.getGenre(); //Female

5
สิ่งนี้ไม่ตอบคำถาม OP กำลังพูดถึงคุณสมบัติ
theB

6
ฉันรู้ว่าคุณสมบัติ Get and Set เป็นตัวอย่างที่ช่วยให้เข้าใจได้ดีขึ้น
Jirson Tavera

10

1
อืม ... นี่หมายความว่าคุณเก็บ nil อ้างอิงถึงสตริงแล้วโหลดค่าจากตำแหน่งมาตรฐานเมื่อget; set;ถูกเรียก?
Aurum Aquila

1
ใช่มันคงnullเหมือนstringตัวแปรใด ๆจนกระทั่งsomeInstanceOfGenere.Name = "someValue"
Daniel A. White

6

พวกเขาเป็น accessors สำหรับชื่อทรัพย์สินสาธารณะ

คุณจะใช้มันเพื่อรับ / ตั้งค่าของคุณสมบัตินั้นในอินสแตนซ์ของประเภท


6

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

คุณสามารถอ่านเพิ่มเติมใน MSDN ของคุณสมบัติ Auto-ดำเนิน Programming คู่มือ


6
  • รูปแบบ get / set จัดเตรียมโครงสร้างที่อนุญาตให้เพิ่มตรรกะระหว่างการตั้งค่า ('set') หรือการดึง ('get') ของอินสแตนซ์คุณสมบัติของคลาส instantiated ซึ่งอาจเป็นประโยชน์เมื่อต้องการตรรกะการสร้างอินสแตนซ์ คุณสมบัติ

  • พร็อพเพอร์ตี้สามารถมี accessor 'get' เท่านั้นซึ่งทำเพื่อให้คุณสมบัตินั้นเป็นแบบอ่านอย่างเดียว

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


5

ซึ่งหมายความว่าหากคุณสร้างตัวแปรประเภทประเภทคุณจะสามารถเข้าถึงตัวแปรเป็นคุณสมบัติได้

Genre oG = new Genre();
oG.Name = "Test";

5
เมื่อคุณไม่ใช้คุณสมบัติที่ใช้งานอัตโนมัติคุณยังคงสามารถเข้าถึงได้ในลักษณะนี้ เช่น AIP ไม่เกี่ยวกับการเข้าถึงจากภายนอก แต่เกี่ยวกับการประกาศภายในชั้นเรียน
abatishchev

4

{ get; set; }ไวยากรณ์ดังกล่าวเรียกว่าคุณสมบัติอัตโนมัติไวยากรณ์ C # 3.0

คุณต้องใช้ Visual C # 2008 / csc v3.5 ขึ้นไปเพื่อคอมไพล์ แต่คุณสามารถรวบรวมผลลัพธ์ที่มีเป้าหมายต่ำที่สุดเท่าที่จะทำได้คือ. NET Framework 2.0 (ไม่ต้องใช้รันไทม์หรือคลาสที่สนับสนุนคุณสมบัตินี้


4

ใน Visual Studio ถ้าคุณกำหนดคุณสมบัติXในคลาสและคุณต้องการใช้คลาสนี้เป็นชนิดเท่านั้นหลังจากสร้างโครงการของคุณคุณจะได้รับคำเตือนที่ระบุว่า"Field X ไม่เคยถูกกำหนดให้และจะมีค่าเริ่มต้นเสมอ ค่า"

โดยการเพิ่ม{ get; set; }การXคุณสมบัติที่คุณจะไม่ได้รับการแจ้งเตือนนี้

นอกจากนี้ใน Visual Studio 2013 และเวอร์ชันที่สูงขึ้นโดยการเพิ่ม{ get; set; }คุณจะสามารถดูการอ้างอิงทั้งหมดไปยังคุณสมบัตินั้น

ป้อนคำอธิบายรูปภาพที่นี่


4

มันเป็นชวเลข คุณสามารถเขียนpublic string Name { get; set; }เหมือนในหลาย ๆ ตัวอย่าง แต่คุณสามารถเขียนได้:

private string _name;

public string Name
{
    get { return _name; }
    set { _name = value ; } // value is a special keyword here
}

ทำไมถึงใช้งาน มันสามารถใช้ในการกรองการเข้าถึงทรัพย์สินตัวอย่างเช่นคุณไม่ต้องการให้ชื่อรวมตัวเลข

ผมขอยกตัวอย่าง:

private class Person {
    private int _age;  // Person._age = 25; will throw an error
    public int Age{
        get { return _age; }  // example: Console.WriteLine(Person.Age);
        set { 
            if ( value >= 0) {
                _age = value; }  // valid example: Person.Age = 25;
        }
    }
}

อย่างเป็นทางการเรียกว่าคุณสมบัติการใช้งานอัตโนมัติและนิสัยที่ดีในการอ่าน ( คู่มือการเขียนโปรแกรม ) ฉันก็จะแนะนำวิดีโอสอนC # คุณสมบัติ: ทำไมต้องใช้ "รับ" และ "ชุด"


2

รับการตั้งค่าเป็นตัวดัดแปลงการเข้าถึงคุณสมบัติ รับอ่านฟิลด์คุณสมบัติ ชุดเซ็ตค่าคุณสมบัติ รับเป็นเหมือนการเข้าถึงแบบอ่านอย่างเดียว ชุดเป็นเหมือนการเข้าถึงแบบเขียนอย่างเดียว ในการใช้คุณสมบัติเป็น read write ทั้ง get และ set ต้องใช้


1
ฉันคิดว่าการตั้งค่าไม่ใช่การปรับเปลี่ยนการเข้าถึง infact เป็น accessors ตัวดัดแปลงการเข้าถึงเป็นเช่น: สาธารณะส่วนตัวภายใน ฯลฯ
Rohit Arora

1

Get ถูกเรียกใช้เมื่อคุณสมบัติปรากฏขึ้นที่ด้านขวา (RHS) Set ถูกเรียกใช้เมื่อคุณสมบัติปรากฏขึ้นที่ด้านซ้ายมือ (LHS) ของสัญลักษณ์ '='

สำหรับคุณสมบัติที่นำไปใช้โดยอัตโนมัติเขตข้อมูลสำรองจะทำงานเบื้องหลังและมองไม่เห็น

ตัวอย่าง:

public string Log { get; set; }

ในขณะที่สถานที่ให้บริการที่ไม่ได้ดำเนินการโดยอัตโนมัติเขตข้อมูลสำรองอยู่ข้างหน้ามองเห็นได้เป็นตัวแปรที่กำหนดขอบเขตส่วนตัว

ตัวอย่าง:

private string log;

public string Log
{
    get => log;
    set => log = value;
}

นอกจากนี้ยังมีมูลค่าที่ระบุไว้ที่นี่คือ 'getter' และ 'setter' สามารถใช้ 'เขตข้อมูลสำรอง' ที่แตกต่างกัน


ดูเหมือนจะไม่ตอบคำถามที่ถาม
TylerH

ให้คำแนะนำเมื่อมีการเรียกใช้และตั้งค่า คำตอบทั้งหมดที่กล่าวมาข้างต้นทำให้เกิดความประทับใจว่าฟิลด์สำรองสำหรับรับและตั้งค่าเหมือนกัน แต่มันไม่ใช่กรณี ดังนั้นคำตอบของฉันเกี่ยวข้องกับคำถามหลักมาก หวังว่าคุณจะเห็นด้วยกับฉัน
บาลา

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

0

กำหนดตัวแปรส่วนตัว

ข้างในตัวสร้างและโหลดข้อมูล

ฉันสร้างค่าคงที่และโหลดข้อมูลจากค่าคงที่ไปยังคลาสรายการที่เลือก

public  class GridModel
{
    private IEnumerable<SelectList> selectList;
    private IEnumerable<SelectList> Roles;

    public GridModel()
    {
        selectList = from PageSizes e in Enum.GetValues(typeof(PageSizes))
                       select( new SelectList()
                       {
                           Id = (int)e,
                           Name = e.ToString()
                       });

        Roles= from Userroles e in Enum.GetValues(typeof(Userroles))
               select (new SelectList()
               {
                   Id = (int)e,
                   Name = e.ToString()
               });
    }

  public IEnumerable<SelectList> Pagesizelist { get { return this.selectList; } set { this.selectList = value; } } 
  public IEnumerable<SelectList> RoleList { get { return this.Roles; } set { this.Roles = value; } }
  public IEnumerable<SelectList> StatusList { get; set; }

}

0

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

public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string FullName => $"{FirstName} {LastName}";
}

public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string FullName { get { return $"{FirstName} {LastName}"; } }
}

FullName เป็นคุณสมบัติ สิ่งที่มีลูกศรเป็นทางลัด จากโลกภายนอกเราสามารถเข้าถึง FullName แบบนี้:

var person = new Person();
Console.WriteLine(person.FullName);

ผู้โทรไม่สนใจว่าคุณจะใช้งาน FullName อย่างไร แต่ในชั้นเรียนคุณสามารถเปลี่ยนชื่อเต็มได้ตามที่คุณต้องการ

ลองดูคำอธิบายโดยละเอียดของ Microsoft Documentation:

https://docs.microsoft.com/en-us/dotnet/csharp/properties

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.