none
关于简单的C#语法问题 基础雄厚的高手指教 RRS feed

  • 问题

  • public class Class1{
       public int Attr1=0;
    }
    
    public class Class2{
       private int attr1=0;
       public int attr1{
          get{return attr1;}
          set{attr1=value;}
       }
    }

    以上代码中,Class1 和Class2哪种写法最好?为什么?我知道大家大部分会以Class2的方式去写!但Class1的写法会导致什么不好的情况吗?难道多写代码就是C#的规则吗?知道原因的回答,多谢了!


    由灵

    2012年2月10日 4:33

答案

  • 以下的資訊說的蠻清楚的,請您參考一下,謝謝!

    Properties vs. Public Variables

    想請教使用get;set;來設定property的差別


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年2月10日 5:14
  • property可以用来做业务控制,

    举个例子,如下面的类,

    public sealed class Employee {
    private Int32 m_Age; // Field is now private
      }

    Employee e = new Employee();

    e.m_Age=-70;

    这样明显违反逻辑的,年龄怎么可能<0呢?

    如果改为下面的property的写法,则可以在property中做业务相关的控制,从而避免这种错误。

    public sealed class Employee {
    private Int32 m_Age; // Field is now private
     public Int32 GetAge() {
    return(m_Age);
    }
    public void SetAge(Int32 value) {
    if (value < 0)
         throw new ArgumentOutOfRangeException("value",value.ToString(),“The value must be greater than or equal to 0");
    m_Age = value;
    }
    }


    2012年2月10日 5:16

全部回复

  • 以下的資訊說的蠻清楚的,請您參考一下,謝謝!

    Properties vs. Public Variables

    想請教使用get;set;來設定property的差別


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年2月10日 5:14
  • property可以用来做业务控制,

    举个例子,如下面的类,

    public sealed class Employee {
    private Int32 m_Age; // Field is now private
      }

    Employee e = new Employee();

    e.m_Age=-70;

    这样明显违反逻辑的,年龄怎么可能<0呢?

    如果改为下面的property的写法,则可以在property中做业务相关的控制,从而避免这种错误。

    public sealed class Employee {
    private Int32 m_Age; // Field is now private
     public Int32 GetAge() {
    return(m_Age);
    }
    public void SetAge(Int32 value) {
    if (value < 0)
         throw new ArgumentOutOfRangeException("value",value.ToString(),“The value must be greater than or equal to 0");
    m_Age = value;
    }
    }


    2012年2月10日 5:16
  • public class Class1{
       public int Attr1=0;
    }
    
    public class Class2{
       private int attr1=0;
       public int attr1{
          get{return attr1;}
          set{attr1=value;}
       }
    }

    以上代码中,Class1 和Class2哪种写法最好?为什么?我知道大家大部分会以Class2的方式去写!但Class1的写法会导致什么不好的情况吗?难道多写代码就是C#的规则吗?知道原因的回答,多谢了!


    由灵

    写法1语法和逻辑上是正确的。但是因为他们可以被直接访问,容易造成上下文中不对称情况产生。

    比如,小学生年龄规定7~10岁,你突然赋值20岁给这个变量也可以,但是不合逻辑;

    因此,属性的作用是代替了直接给变量赋值的危险,它暴露了私有变量,同时,你可以在set的时候提供if的验证功能,从而尽可能避免直接赋值带来的不安全。

    【你可以】

    public int attr1{
          get{return attr1;}
          set{if (value<=xxx) {attr1=value;}else {throw new Exception("Age is invalid!");}
       }



       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处


    2012年2月10日 5:19
    版主