首页 新闻 会员 周边

关于属性为什么要加一个私有的?

0
悬赏园豆:10 [已解决问题] 解决于 2013-07-31 16:24
 class Order
{
private
List<Item> items = new List<Item>(); public IEnumerable<Item> Items { get { return items; } }
}
这里作为Order类的属性为不写成
class Order
{ public IEnumerable<Item> Items { get ; }
}
或者
 class Order
{ public List<Item> Items { get ; }
}
有什么区别吗
 
牧马的主页 牧马 | 初学一级 | 园豆:63
提问于:2013-07-31 15:09
< >
分享
最佳答案
1

class Order 一般这样的类应该都是java bean吧,java bean设计原则就是要求封装性(实际所有类最好封装)

封装属性即私有化,提供get、set方法(根据需要)共外部调用,防止用户直接修改类属性;

另外,如果用在struts、spring的java bean就必须封装,否则无法自动注入;

收获园豆:10
嗨,你的益达~~~ | 菜鸟二级 |园豆:221 | 2013-07-31 15:20

这个类不用管,就是一个类有个属性,然后这个属性要不要添加个对应的私有属性,按照你说的是不是因为根据设计原则才这样写的,有没有其它的好处或者是原因?

牧马 | 园豆:63 (初学一级) | 2013-07-31 15:23

@牧马: 是的,按照设计原则,主要目的就是封装。当然你不用private也是可以的,作为普通类。

嗨,你的益达~~~ | 园豆:221 (菜鸟二级) | 2013-07-31 15:44
其他回答(2)
0

C#的语法糖而已,你下面的两种写法在C#编译器编译之后还是会添加私有变量,变成和你最开始写的差不多

NET_zhaoqiang | 园豆:296 (菜鸟二级) | 2013-07-31 15:16

也就是添加个私有变量是多余的吗?

支持(0) 反对(0) 牧马 | 园豆:63 (初学一级) | 2013-07-31 15:18

@牧马: 你下面的两种写法是C#3.0以后的语法才加上的,术语好像是叫自动属性,语法有一点错误,那几位给你指出来了。这样的目的其实是为了开发起来更自然一点。如果想验证是不是真的添加了私有变量,你用ILDasm反编译以下程序及就能够看到。所以,它仅仅是C#语法糖而已。

支持(0) 反对(0) NET_zhaoqiang | 园豆:296 (菜鸟二级) | 2013-07-31 16:14
1

C#约定,变量尽量私有,字段公开;

你下面的两种写法应该是通不过编译的!get,set不能独立存在。为了让属性只读,可以采用以下写法:

 public IEnumerable<Item> Items
        {
            get;
            private set;
        }

否则,就需要按照你的第一种写法,先定义私有变量的方式写。

幻天芒 | 园豆:37175 (高人七级) | 2013-07-31 15:33

果然不能通过编译..学到了。那这个公开的字段对应一个私有的变量也只是约定才这样做的吗?为什么这么约定呢?

支持(0) 反对(0) 牧马 | 园豆:63 (初学一级) | 2013-07-31 15:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册