代码改变世界

关于get和set访问器以及属性和字段变量的区别问题

2008-04-26 11:57  Leason Li  阅读(1570)  评论(1编辑  收藏  举报
       属性是对一个或者多个字段的封装.
      类里面为什么要用一个共有的属性来封装其中的字段,也可以这样说用共有属性来封装私有变量,其中的好处应该大家都说的出来,就是为了实现数据的封装和保证了数据的安全,保护类里面的成员不被任意改动.例如下面的例子:
class myclass 

    
private int age;//私有的字段 
    public  int Age //属性 
    
        
get 
        

            
return this.age; 
        }
 
        
set 
        

            
this.age=value; 
        }
 
    }
 
}
 
仅仅从这里我想看不出到底把私有字段age封装在Age属性里面的好处在哪里?因为我们直接操作Age属性也可以达到对age字段的任意赋值和修改嘛.这段代码其实和下面这段代码没有区别.
class myclass 

    
public int age; 
}
 

就是把age字段变量直接共有.
  但是如果涉及到对这个字段进行一些逻辑控制的时候,属性中能实现各种复杂的逻辑,而这些都不是直接把一个字段共有所能实现的.从这里就能体现出get和set访问器带来的好处了.下面具体讲讲.
1、属性可以只读或只写,比如下面代码,共有字段变量一定是可读写的。
2、属性可附带错误检查或额外的的代码,共有字段变量的读写不能。
3、虽然这些都是编译器给带来的好处,但封装有很多好处,像细节隐藏,实现隐藏等。比如说有一天人可以活到200岁,更改if(value > 200)不会影响其他调用Age的函数。

class myclass 

    
private int age;//私有的字段 
    public int Age //属性 
    
        
set 
        
{
            
if(value < 0 || value > 200)
            
{
               
throw new Exception("");    // checking
            }
 
            
if(this.age != value)
            
{
               
this.ageChanged = true;        // extra routine
            }

            
this.age=value; 
        }
 
    }
 
}


总结:属性除了公布字段外,还可以在属性上添加对字段的约束规则,比如只读,只写,读写规则,还可以对属性的值进行逻辑验证等等.另外从软件设计的角度来看,属性是方法,应该被 公开,而字段是数据 ,应该被封装.
   希望以上的讲解能帮到跟我一起在路上的软件开发者们,在此向园子的的软件大牛 级专家致敬,自己需要学习的东西太多太多.