如果在写一个类的时候,将某一属性指定为private,再为此属性写public的getter和setter方法,那么此时的写getter和setter方法是不是多此一举?
既然最终此属性写public的getter和setter方法了,那么干嘛当初不直接指定该属性为public呢?

解决方案 »

  1.   

    建议LZ去看这个帖子,看完就应该知道了
    http://kb.cnblogs.com/page/50502/
      

  2.   

    如果对属性的操作只是直接地进行读和写,在读写之前不作任何操作,那对属性直接指定为public不就行了吗?干嘛又特意去写一个getter和setter呢
      

  3.   

    “直接指定为public”就不叫属性了,叫做字段...问题是,谁都可以改你这个字段,改成什么你都无法预知,你的程序谈什么健壮性谈什么安全性...
      

  4.   

    楼主,我同意你的观点
    "如果在写一个类的时候,将某一属性指定为private,再为此属性写public的getter和setter方法"
    这种东西确实是多此一举,毫无疑问的多此一举,而且还会有性能损失就直接搞成public field就可以了不过在复杂程序架构里有一点是很有用处的:
    属性可以被声明为virtual,abstract,而且可以在接口中定义。让什么狗屁的教条去见鬼去吧!不要被限制了自己的想象力
      

  5.   

    getter和setter 跟public与否没有必然的关系
      

  6.   

     设置字段 getter 和 setter 主要是 规定字段属性的访问名称,另外可以控制设置值和读取值的时候加入一些条件.
    private int _iNum;
    public int Num
    {
      get { if(_iNum 满足某条件 ) { } return _iNum; }
      set { (value 判断相对应值) _iNum = value; }
    }
    另外设置getter 和 setter 访问字段的好处是,可以设置该字段是只读还是只写.
      

  7.   

    首先,楼主的说法有错误。getter和setter是在JAVA中的说法。
    而在C#中,我们说属性。
    假如说一个类Student,其中有两个字段,姓名(Name) 年龄(Age)
    public Class Student
    {
       public string Name;
       public int Age;
    }
    那么我们实例化一个该类的对象,并且初始化。
    Student student = new Student();
    student.Name = "remember_me";
    student.Age = 1000;     //注意这里,我们赋值了1000
    以上代码中,我们可以看出,我们给Age字段赋值了1000,稍有常识就应该知道,这是不切实际的。
    为了避免这种情况的发生,我们需要在对类中某些敏感字段赋值的时候,稍加给予业务逻辑判断。
    属性就是实现这个功能的。
    属性的书写方法:
    1、把敏感字段私有化
    2、提供公共属性
    3、编写业务逻辑判断
    public Class Student
    {
       public string Name;
       private int age;     //将敏感字段私有化
        
        //提供属性   注意:属性类型与绑定字段一致,一般情况字段名字小写,而属性首字母大写
        public int Age
       {
           get{return age;}     //get访问器,返回敏感字段的值
             set                  //set访问器,对铭感字段赋值
           {
               if(value < 100 && value > 0)        //value为一个属性,代码穿进来的值,我们要对这个值进行判断是否符合。
                {
                      age = value;
                 }
                 else
               {
                   age = 20;        //不符合的话,我们指定一个值。
               }
           }
       }
    }以上代码中,我们就为敏感字段封装了属性Age
    我们可以测试一下
    实例化一个对象
    Student student = new Student();
    student.Name = "remember_me";
    student.Age = 1000; //因为类中字段age已经为私有的了,不可以访问,所以我们要调用属性对其赋值。
    看一下结果,因为1000不符合要求,所以赋值了我们给定的值  20。这种类写法是一中比较老的写法,在C#3.0中,出现了一个新特性,叫做自动属性。
    写法如下:
    public class Student
    {
        public string Name{get;set;}
        public string Hobby{get;set;}
    }
    这种写法是对于没有业务逻辑要求的字段,我们可以这样些,这种类写法省略了私有字段的声明。这种类写法比前种写法省去了2/3的代码量。
    那么少去的代码哪去了呢?
    其实一点也没少,也可以说是个语法糖罢了。
    在程序由C#编译器编译为MSIL(微软中间代码)的时候,会由编译器自动生成的。可以使用反编译工具查看一下。
      

  8.   

    我觉得LZ可以简单理解成MS为了代码的简洁、好看,提供了另一种函数的写法-属性,而通常程序员将这种函数用于对类内私有变量的访问与改写。实际上,你使用属性却不更改任何私有变量,这样是可能的。