set 和 get 方式 有啥好处?

色郎中 2014-01-13 01:38:58
例如一个成员变量:
public string abc;

为什么要定义成
private string _abc;
public string abc{
get{ return _abc;}
set{_abc = valve;}
}


这样的封装有什么好处呢? 通常什么情况下,采用这样的方式声明?

...全文
2200 36 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
by_封爱 版主 2014-01-14
  • 打赏
  • 举报
回复
一样的 就是可以设置默认值或者验证等等...
卧_槽 2014-01-14
  • 打赏
  • 举报
回复
少写两行代码。 属性的所有功能都可以通过方法实现。硬要说不能做的,就是绑定,当然你也可以自己实现一套绑定机制绕过去。
emailtome 2014-01-14
  • 打赏
  • 举报
回复
引用 15 楼 wjfwd2010 的回复:
[quote=引用 12 楼 caozhy 的回复:] (1)只有属性才可以数据绑定,字段不可以 (2)可以添加日志、校验等逻辑,可以拦截字段的修改 (3)可以实现懒惰数据加载提高性能 (4)可以通过多个属性修改一个字段,或者将一个字段的数据通过几个属性表现出来(比如位置是一个Point对象,但是你可以将它拆成x y两个属性,比如字体是一个字段,你可以拆出字体、字号等属性,再比如用二进制掩码表示一系列bool值,等等) (5)可以代替方法。比如说Timer的Start Stop两个方法,被封装成Enabled属性 (6)可以为读写设置不同的访问级别,可以创建只读的属性
get { return _A+_B; } 是在返回的时候做数据的运算和读取?[/quote] 因为是约定函数名字方便注入拦截器
拉文麦克 2014-01-14
  • 打赏
  • 举报
回复
好处是数据对象化,实体化
雨生双木 2014-01-14
  • 打赏
  • 举报
回复
不要使用是 public 或 protected 的实例字段。如果避免将字段直接公开给开发人员,可以更轻松地对类进行版本控制,原因是在维护二进制兼容性时字段不能被更改为属性。考虑为字段提供 get 和set 属性访问器,而不是使它们成为公共的。 get 和 set 属性访问器中可执行代码的存在使得可以进行后续改进,如在使用属性或者得到属性更改通知时根据需要创建对象。这是我正在看的微软编程规范
风吹腚腚凉 2014-01-14
  • 打赏
  • 举报
回复
引用 21 楼 KarasCanvas 的回复:
[quote=引用 14 楼 wjfwd2010 的回复:] (3)可以实现懒惰数据加载提高性能 求个例子啊不理解啊。
各种orm的导航属性都是,呵呵[/quote] 哦N年没做orm了,原理是啥?就是get的时候再加载数据?
pzsm123 2014-01-14
  • 打赏
  • 举报
回复
有两个方面的好处: 1.在赋值或获取前可以进行判断和处理 2.可以做成单向只有GET或SET,这样可以防止误用
  • 打赏
  • 举报
回复
这就是一个协议,告诉你的队友,这个只要读或者只要写就行了。
  • 打赏
  • 举报
回复
引用 16 楼 wanyeye 的回复:
也经常用C# 写点DEMO ,从没有深入的学习过,谢谢各位大侠,收获颇多 我们写的DEMO 没有用过这些玩意,今天看客户这样用的,所以就请教了一下 谢谢
如果不写成属性而写成字段也可以,那么就不用非得写成属性。 当需要写成属性时,调用它的客户程序不需要修改,仅需要重新编译就行了。因此这是属性语法对字段语法最好的可扩展的特性。由于方便了你在有必要时随时重构,因此不必纠结。
白牛C啊 2014-01-14
  • 打赏
  • 举报
回复
一个是只读,一个是只写 能保证类的安全性,举例 interface A { object _a{get} object _b{get;set;} } class Test:A //实现A后就能控制变量_a只能返回数据而不能修改数据,像数组对象的Count这种变量控制其只读,对于程序的安全性就很重要
NotNull 2014-01-14
  • 打赏
  • 举报
回复
引用 30 楼 sevenyfourLove74 的回复:
[quote=引用 8 楼 bjf814 的回复:] 写了个简单的例子,平常写实体,经常用到!

    //汉字自动转拼音
    class MyClass1
    {
        private string _Chinese;//汉字

        public string Chinese
        {
            get { return _Chinese; }
            set
            {
                _Chinese = value;
                _Spell = CVS(_Chinese);//转换的方法
            }
        }

        private string _Spell;//拼音

        public string Spell
        {
            get { return _Spell; }
            set { _Spell = value; }
        }
    }
    //自动求和
    class MyClass2
    {
        private int _A;

        public int A
        {
            get { return _A; }
            set { _A = value; }
        }

        private int _B;

        public int B
        {
            get { return _B; }
            set { _B = value; }
        }

        private int _result;

        public int Result
        {
            get { return _A * _B; }
            set { _result = value; }
        }
    }

    public class Main
    {
        private void chibaolemeishigan()
        {
            MyClass1 m1 = new MyClass1();
            m1.Chinese = "张三";
            string a= m1.Spell;//自动得到拼音了

            MyClass2 m2 = new MyClass2();
            m2.A = 2;
            m2.B = 4;
            int b = m2.Result;//得到值8,这只是简单的算法!
            //经常在DataGridView中使用,可以自动转换!不用多写代码!
            
        }
    }
楼主,这种写法我首先不推荐,代码没有优雅性,而且耦合读非常高,如果是用做数据库的增删,那更没必要这么写[/quote] 首先我不明白,你的优雅性什么意思!耦合度高,我承认!一般我使用时,Dev中的GridView中使用绑定实体,当我在GridView录入改变一个值的时候,其他值要自动跟着变化!如果不这么写的话,需要写事件!那是非常麻烦的! 如果是你不写事件,不在实体里处理,还有更简单的方法吗?
sevenyfourLove74 2014-01-14
  • 打赏
  • 举报
回复
引用 8 楼 bjf814 的回复:
写了个简单的例子,平常写实体,经常用到!

    //汉字自动转拼音
    class MyClass1
    {
        private string _Chinese;//汉字

        public string Chinese
        {
            get { return _Chinese; }
            set
            {
                _Chinese = value;
                _Spell = CVS(_Chinese);//转换的方法
            }
        }

        private string _Spell;//拼音

        public string Spell
        {
            get { return _Spell; }
            set { _Spell = value; }
        }
    }
    //自动求和
    class MyClass2
    {
        private int _A;

        public int A
        {
            get { return _A; }
            set { _A = value; }
        }

        private int _B;

        public int B
        {
            get { return _B; }
            set { _B = value; }
        }

        private int _result;

        public int Result
        {
            get { return _A * _B; }
            set { _result = value; }
        }
    }

    public class Main
    {
        private void chibaolemeishigan()
        {
            MyClass1 m1 = new MyClass1();
            m1.Chinese = "张三";
            string a= m1.Spell;//自动得到拼音了

            MyClass2 m2 = new MyClass2();
            m2.A = 2;
            m2.B = 4;
            int b = m2.Result;//得到值8,这只是简单的算法!
            //经常在DataGridView中使用,可以自动转换!不用多写代码!
            
        }
    }
楼主,这种写法我首先不推荐,代码没有优雅性,而且耦合读非常高,如果是用做数据库的增删,那更没必要这么写
sevenyfourLove74 2014-01-14
  • 打赏
  • 举报
回复
只能说不用也没关系,看自己设计类的需要,还有属性可以添加索引
乌英达姆 2014-01-14
  • 打赏
  • 举报
回复
get和set是两个访问器。 get访问器用来得到字段的值,set访问器用来设置字段的值。 如果你不准备给字段设置值,就不用set访问器;反之,则使用set访问器尚佳。因为可以控制赋值时的一些条件啊等等的。 打个比方,你在用一个类中定义了一个静态字段,并给它赋一个初始值。在外部访问这个字段并且赋新值。你会发现,类中使用静态字段的地方的值还是原值,并不是新值。 例如: public class Demo1 { public static string strName = "xxx"; //这是一个测试方法,方法中使用了参数xxx public static void Test(string strParam) { ... } } public class Demo2 { Demo1.strName = "yyy"; Demo1.Test(Demo1.strName); } 用get和set访问器可以实现随时更改字段,如果不想让其更改可以只设get访问器,这样可以在外部控制 对该字段的赋值。。。。
种草德鲁伊 2014-01-13
  • 打赏
  • 举报
回复
引用 14 楼 wjfwd2010 的回复:
(3)可以实现懒惰数据加载提高性能 求个例子啊不理解啊。
各种orm的导航属性都是,呵呵
  • 打赏
  • 举报
回复
1可以在赋值的时候做判断 判断值是否符合
小猪八Q 2014-01-13
  • 打赏
  • 举报
回复
引用 12 楼 caozhy 的回复:
(1)只有属性才可以数据绑定,字段不可以 (2)可以添加日志、校验等逻辑,可以拦截字段的修改 (3)可以实现懒惰数据加载提高性能 (4)可以通过多个属性修改一个字段,或者将一个字段的数据通过几个属性表现出来(比如位置是一个Point对象,但是你可以将它拆成x y两个属性,比如字体是一个字段,你可以拆出字体、字号等属性,再比如用二进制掩码表示一系列bool值,等等) (5)可以代替方法。比如说Timer的Start Stop两个方法,被封装成Enabled属性 (6)可以为读写设置不同的访问级别,可以创建只读的属性
Wang-Yucai 2014-01-13
  • 打赏
  • 举报
回复
属性有读写、只读、只写; 如果是公共变量的话,那就只有读写状态了。不利于安全控制。
色郎中 2014-01-13
  • 打赏
  • 举报
回复
也经常用C# 写点DEMO ,从没有深入的学习过,谢谢各位大侠,收获颇多 我们写的DEMO 没有用过这些玩意,今天看客户这样用的,所以就请教了一下 谢谢
风吹腚腚凉 2014-01-13
  • 打赏
  • 举报
回复
引用 12 楼 caozhy 的回复:
(1)只有属性才可以数据绑定,字段不可以 (2)可以添加日志、校验等逻辑,可以拦截字段的修改 (3)可以实现懒惰数据加载提高性能 (4)可以通过多个属性修改一个字段,或者将一个字段的数据通过几个属性表现出来(比如位置是一个Point对象,但是你可以将它拆成x y两个属性,比如字体是一个字段,你可以拆出字体、字号等属性,再比如用二进制掩码表示一系列bool值,等等) (5)可以代替方法。比如说Timer的Start Stop两个方法,被封装成Enabled属性 (6)可以为读写设置不同的访问级别,可以创建只读的属性
get { return _A+_B; } 是在返回的时候做数据的运算和读取?
加载更多回复(14)

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧