zoukankan      html  css  js  c++  java
  • C#属性和字段区别、get与set用法

    属性和字段的区别

        在C#中,我们可以非常自由的、毫无限制的访问公有字段,但在一些场合中,我们可能希望限制只能给字段赋于某个范围的值、或是要求字段只能读或只能写,或是在改变字段时能改变对象的其他一些状态,这些单靠字段是无法做到的,于是就有了属性,属性中包含两个块:set和get,set块负责属性的写入工作,get块负责属性的读取工作。在两个块中都可以做一些其他操作,如在set中验证赋的值是否符合要求并决定是否进行赋值。当缺少其中一块时属性就只能读或只能写,set和get块中属性必需有一个,因为即不能读又不能写的属性是没有意义的。

    class MyClass

    {

           Private  string  name;

     public string Name

     {

      get {return Name;}

      set {Name=value;}

     }

    }

    (1)属性可以保证安全,当不在本类中使用时可以保证使用属性名可以避免

    用字段的名字。

    (2)属性的set和get函数可以限制字段的一些功能,以达到某种目的。 

    如:private int a=0;

    public int A
    {
         get{return this.a;}
         set
         {
             if(value >= 0 && value <= 100)
                  this.a=value;
             else
                  throw new Exception("值的范围不合法。");
         }
    }
    (3)属性没有存储数据的功能,数据都存在字段中,所以只有修改字段的数据才能更改数据,修改属性的值没用。
     
     
    Get/Set用法:
    转自:http://blog.sina.com.cn/s/blog_82526aa60100txtx.html

     在程序中经常碰到get、set,不甚明白,在网上查询时也说的迷迷糊糊,所以整理下,以学的明白透彻点。

        有两个类person:

        public class person

        {

          public string name;

        }

        public class person

        {

          public string Name{set;get;}

        }

        第一个类型的name属性未封装,其name属性直接通过public关键字暴露给系统中的其他类了,而第二个类型的name属性通过get set关键字进行了封装,get和set分别对应的是可读和可写,相当于如下代码:

        private string name;

        public string Name

        {

          get { return name; }

         set { name = value; }

       }

        简单说下区别吧:当实例化第一个“person”这个类时,系统在分配内存空间时对name属性直接分配内存,之后对name属性的操作也是直接操作内存中name属性所在的这个块;而当实例化第二个“人”类型时,系统会先分配一个叫name的private私有的内存空间(此处的name对于类的内部使用,Name对于外部操作使用,要有所区分),之后的读与写的操作都是通过Name这个public的类似于指针的东西来关联name进行,以此达到封装的目的,并且通过get和set关键字也可以控制可读还是可写。建议用后者,封装的好处可以参考相关文档,不再累述了~

        至于get和set的作用,除了控制读写之外还有其他的作用,举个简单的例子,比如说当我给Name赋值的时候想要先进行一些逻辑判断,就可以这样:

            private string name;

            public string Name

            {

                get { return name; }

                set

                {

                 name = String.IsNullOrEmpty(value) ? "空" : value;

                }

            }

    再举例说明下:

        假设类是一银行,既能存钱也能取钱

        Private Money;

        Private class bank()

        {

          get

          {

             return Money;

          }

          Set

          {

             Money=value;

          }

        }

        Money 就像银行里的自动取款机,你看不见里面的Money,但你能用set(存钱),用get(取钱)。Money是一个私有字段,是分装在类中的,类以外的程序不能直接访问的。C#中get、set用法中,类的set和get成员是外部程序访问类内部属性的唯一方法,就像你去银行取钱,你不能直接从银行的保险柜里拿钱,而是银行营业人员把钱取出来给你的。

        属性在调用者看来就像一个普通的变量,但作为类的设计者,你可以利用属性来隐藏你类中的一些字段,使外界只能通过属性来访问你的字段,你可以通过属性来限制外界对你的字段的存取,就利用get、set。如果想让用户随意存取你的字段,那么就实现get、set;如果只想让用户读取字段,就只实现get;若只想让用户写字段就只实现set。同时还可以在set和get中对用户传递的值进行一些验证工作,以确保你的字段将含有正确的值。

        Private int a;

        Public int index

        {

          get

          {

            return a;

          }

          set

          {

             If (value>0)

               a=value;

             else

               a=0;

          }

        }

        可看出,get、set用法中一则是隐藏组件或类内部的真实成员;

        二是用来建立约束的,比如,实现“有我没你”这种约束;

        三是用来响应属性变化事件,当属性变化是做某事,只要写在set方法里就行。

        当你想读出或写入属性的值时,存取标志限定了被实现的语句。用于读出属性的值的存取标志记为关键字get,而要修改属性的值的读写符标志记为set。

     
  • 相关阅读:
    【板+背包】多重背包 HDU Coins
    【板+并查集判断连通性】并查集判断连通性
    【Dijstra堆优化】HDU 3986 Harry Potter and the Final Battle
    【区间筛】2017多校训练四 HDU6069 Counting Divisors
    【构造+DFS】2017多校训练三 HDU 6060 RXD and dividing
    【链表】2017多校训练三 HDU 6058 Kanade's sum
    【带权并查集】HDU 3047 Zjnu Stadium
    【优先级队列】 Holedox Eating
    ajax学习笔记3-jQuery实现ajax(大拇指向上)
    ajax学习笔记2-JSON形式返回(大拇指向上)
  • 原文地址:https://www.cnblogs.com/newcapecjmc/p/7094001.html
Copyright © 2011-2022 走看看