c# get{}set{}

本文深入解析C#中属性(property)的工作原理,通过一个简单的示例解释了如何使用属性的get和set方法,并展示了它们在代码中如何被调用及执行顺序。
public class cls
    {
        private int book;//定义一个域
        public int Book
        {
            get
            {
                Console.WriteLine("dsf");
                return book;

}
            set
            {
                Console.WriteLine("aaa");
                book = value;

}
        }
        public static void Main()
        {
            cls obj = new cls();
            obj.Book = 120; //注意这一句 
            Console.WriteLine(obj.Book);
        }

结果是aaa
          dsf
         120
有没有人知道这个结果是怎么出来的??

答:
给你讲讲底层吧,你定义的property 有get set两个块,实际上这两个块会编译成两个方法,你可以认为编译以后有如下定义:
public void set_Book(int value){
    Console.WriteLine("aaa");
    this.book = value;
}
public int get_Book(){
    Console.WriteLine("dsf");

    return this.book;

}

你所看到的 obj.Book = 120;在编译以后实际上是直接调用的方法如:obj.set_Book(120);

这下你能理解了么?

你执行的几句话顺序是:
cls obj = new cls();
obj.set_Book(120);
Console.WriteLine(obj.get_Book());

那么就是按照先后顺序输出Console.WriteLine的内容,没什么好稀奇的。

property的好处是在设计层面上的,虽然这种概念让人困惑,不过如果你学过java,知道java bean里面property的设计是如何完成的,那么你就能感觉到property在C#里面实现的是多么优雅。
2.
obj.Book = 120; 这句话调用了Set方法,输出了aaa
Console.WriteLine(obj.Book);这句话调用 了Get方法输出dsf,然后又输出了Book的值120

C#中,`get` 和 `set` 主要用于属性的定义,它们为类的字段提供了封装和访问控制的机制。 ### 使用方法 #### 读写属性 同时带有 `get` 和 `set` 访问器的属性为读写属性。以下是一个简单的示例: ```csharp class ExampleClass { private int privateField; // 私有的变量 public int PublicProperty // 公有属性,用于获取和设置私有变量的值 { get { return privateField; } set { privateField = value; } } } ``` 在上述代码中,`PublicProperty` 是一个公有属性,通过 `get` 访问器可以获取 `privateField` 的值,通过 `set` 访问器可以设置 `privateField` 的值,其中 `value` 是 `set` 访问器的隐式参数,代表要赋予的值 [^2]。 #### 只读属性 只包含 `get` 访问器的属性为只读属性,外部代码只能获取该属性的值,不能设置。示例如下: ```csharp class ReadOnlyExample { private int readonlyField = 10; public int ReadOnlyProperty { get { return readonlyField; } } } ``` 在这个例子中,`ReadOnlyProperty` 是只读属性,外部无法修改 `readonlyField` 的值,只能通过该属性获取其值。 #### 只写属性 只包含 `set` 访问器的属性为只写属性,不过这种情况相对较少使用。示例如下: ```csharp class WriteOnlyExample { private int writeOnlyField; public int WriteOnlyProperty { set { writeOnlyField = value; } } } ``` 在上述代码中,`WriteOnlyProperty` 是只写属性,外部代码只能设置 `writeOnlyField` 的值,不能获取。 ### 原理 编译器在处理C#中的属性时,会将属性转化为一对特殊的 `get` 和 `set` 访问器方法。例如,对于以下属性定义: ```csharp public class cls { private int book; public int Book { get { Console.WriteLine("dsf"); return book; } set { Console.WriteLine("aaa"); book = value; } } } ``` 编译器实际上会将其编译成两个方法,类似于以下定义: ```csharp public void set_Book(int value) { Console.WriteLine("aaa"); this.book = value; } public int get_Book() { Console.WriteLine("dsf"); return this.book; } ``` 当代码中使用 `obj.Book = 120;` 时,编译后实际上是调用 `obj.set_Book(120);`;当使用 `Console.WriteLine(obj.Book);` 时,编译后实际上是调用 `Console.WriteLine(obj.get_Book());` [^3]。 这种机制使得属性的使用看起来像是直接访问类的字段一样,但实际上是通过方法来控制对字段的访问,从而实现了对类的行为和状态的封装和公开 [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值