我用get.set方法也有一段时间了,可以我对它们还是很困惑,其实将类字段设置成public也是可以的啊?有人说这样对类不安全,破坏了面向对象的意思,我是比较笨的那种,哪位可以帮我详细的解释一下吗?先谢谢了!

解决方案 »

  1.   

    举个小例子:
    使用set时可以使用IF语句对外部赋值数据进行限定,如果数据不合法、就可以禁止外部数据对变量进行赋值。
    用的手机,篇幅有限就这些吧,嘿嘿…
      

  2.   

    举个简单的例子
    你全部设为public意味着你房子里藏着的东西谁都可以进来拿
    我想这不是你所希望的吧?封装的目的之一就是相当于只有和你有关系(有钥匙的人)才能进来拿你房间的东西。
    这应该符合你日常的生活逻辑吧?竟然生活是这样,那么程序这样做你有啥不好理解的呢?
      

  3.   

    ZaiDuXinLing 说的这点我到是知道,但是微软推荐类数据字段要设置为私有,用属性来对外暴露,说直接访问影响类的封装性,是真的懂也
      

  4.   

    @快乐老妖,那属性也是public啊。这不等于这个大门关好了,另外开一个门让人随便拿,不知我的理解是不是有误///
      

  5.   

    我写的类,很少所有的字段同时拥有get和set方法。一般只有get的情形比较多。
    还有,外界看到一个类有一个名字叫“AAA”的属性,根本不能推断出这个类肯定有一个名叫aaa的变量。不一定的。
      

  6.   

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

  7.   


    属性我可以只有Get()方法,没有set()方法啊,这样门不就关上了嘛
      

  8.   

    如果一个类有一个属性AAA,而且:
    (1)AAA既实现了get,又实现了set;
    (2)类中还有一个与AAA对应的同类型字段aaa;
    (3)AAA的get就是简单的return aaa;没有其它代码;
    (4)AAA的set就是简单的aaa = value;也没有其它代码;
    ——那你就当这是一种巧合算了。
      

  9.   


    不清楚你是指安全性还是指你的属性只存在GET或者SET二者中的任意一个。
    不是属性里面必须要同时有取值和赋值的功能,有其一即可。它仅仅只是一扇小窗口,怎么用由你约定法则来控制。有些人只需从窗口取东西,有些人只需要往窗口里扔东西。
    但属性也不是绝对的安全的,计算机中的安全永远是相对的。另外,属性的使用比对字段的使用可能更加耗费系统资源,但就其带来的好处来说这点资源损耗几乎可以忽略不计。
      

  10.   

    写个例子:
    private string userName = string.Empty;
    public string UserName
            {
                set { 
                       this.userName = "".Equals(value) ? "我是空的" : value; 
                    }
            }
    那么这个属性就为只写。。如果写入为""的话。那么属性的值就为“我是空的”
    private string userName = string.Empty;
    public string UserName
            {
                get { 
                      return "".Equals(value) ? "我是空的" : value; 
                    }
            }
    那么这个属性为只读。。如果写入为“”的话。那么返回的值就为“我是空的”。。不知道这样解释  和不合适
      

  11.   


    class A
    {
      private Int32 va;
       ...
      public int VA
      {
        set
         {va=value;}
        get
         {return va;}
       }
    假如原先的实现如上,然后我修改了实现:class A
    {
      private Int64 va;
       ...
      public int VA
      {
        set
         {if(va=value;}
        get
         {return (int)va;}
       }
       public Int64 VA64
       {
         ...
        }内部的实现细节被隐藏了,相关的变化对原来的代码不会产生太大的影响,至多是重新编译的问题。