Should I use public properties and private fields or public fields for data?
在我看到的大部分代码中(在deproject.com上,我倾向于在自己的代码中这样做),我看到了为类包含的每个单独的私有字段创建的公共属性,即使它们是
1 2 3 4 5 6 | private int myInt; public int MyInt { get { return myInt; } set { myInt = value } } |
我的问题是:这与:
1 | public int MyInt; |
如果我们应该使用属性而不是公共字段,为什么要在这个特定的情况下使用它们?(我不是在讨论更复杂的例子,getter和setter实际上做了一些特殊的事情,或者只有一个get或set(只读/写),而不仅仅是返回/设置私有字段的值)。它似乎没有添加任何额外的封装,只提供了一个很好的IntelliSense图标,并被放置在类图中的一个特殊部分中!
湖的文章blog.codinghorror.com http:/ /属性/ VS公共变量
特别
- 她的作品在不同的变量和属性,如果你依赖上的反射,它更容易使用的所有属性。
- 你不能对一databind变量。
- 改变一个变量的变化是一个重大的物业。
三原因:
我相信有更多的,我只是需要时间思考。
在。NET中,你可以使用自动属性到样本:
1 | public int Age { get; set; } |
"旧学院有自己的私人领域declaring单样本:
1 2 3 4 5 6 7 | private int age; public int Age { get { return age; } set { age = value; } } |
这使得它简单的创建一个场,但没有重大变化的问题(在其他的东西)。
当你创建一个简单的私人和公共财产的字段名称的名字,名字是获取和设置的场值
1 2 3 4 | public string Name { get { return name; } } |
你使用这类物业是有一天你和你的感觉是,这个类的名称是指物业想靠近lastname场(或你想返回a串"我的名字:"+姓名),你可以改变的代码:在物业
1 2 3 4 | public string Name { get { return lastName; //return"My name:"+name; } } |
如果你是使用公共字段名称代码是外面然后你会更改名字lastname你到处使用它。
因为它不会有所作为。公共数据可以改变的对象实例没有知道它。使用吸气和制定的对象是不断变化的意识到已经制造。
记住,这是唯一的encapsulating数据第一步迈向更好的结构设计,它不向最终目标本身。
在下列情况下必须使用属性:
它……的依赖?
我总是使用吸气&;制定的,因为他们创造了这个快捷方式:
公共int foo {获得};集合;
翻译为它是在编译时。现在你可以得到它的幻想,但它是在那里,如果你需要把它之后,你只是喜欢的拼写。
然而,公共,私人,保护……它的所有的一物(来吧,可以调整的位置数据。我们使用的焊料和继承,这是一个美国的普通法,因此你一定chidren CAN编辑只读属性。
1 2 3 4 5 | protected _foo; public Foo { get { return _foo; } } //lack of set intentional. |
简单来说,您的问题的答案是访问修饰符,即public和private。
如果使用:
1 2 3 4 5 6 | public int myInt; public int MyInt { get { return myInt; } set { myInt = value } } |
然后,myint属性和myint变量都可以在要修改的项目中使用。意思是,如果你的类假设A是由类假设B继承的,然后myint和myint都可以修改,不能应用任何检查。假设您希望在派生类中设置myint值(如果某个特定条件通过)。
这只能通过使田地私有化和财产公开来实现。所以只有属性可用,并且可以基于该属性设置条件。
设置一个私人场A值是只读的变化,但他们在现场制作,你可以把一个物业。例如,您可以设置呼叫后A A值法
1 2 3 4 5 6 7 8 9 10 11 12 13 | private string _email; public string Email { get { return this._email; } set { this._email = value; ReplaceList(); //** } } |
一个是你不小心/ unintentionally改变价值的A级私人场外面。当你使用get和set,你是那类变化的均值和knowingly私人场故意。
实际上,如果你使用Silverlight,你会意识到这是一场不能集和静态资源,因此你必须使用(A)A物业
我意识到,当我试图federate I区名称使用在复合制导(棱镜)。
然而,这只是一个新的语言除了
点是如果你想继续下来的线,确保每一次
有许多原因为什么。
问题:
- 你可以做一些其他的函数当变量是集
- 你可以设置为只读,防止和get
- 我们只有一些属性(数据绑定的工作,例如)
- 你可以隐藏外部物业(也许这是一个ASP.NET ViewState的变量)。
我不敢相信,有了11个答案,就没有人说过:
并非所有私有字段都应公开为公共属性。当然,对于任何需要非私有的东西,都应该使用属性,但是您应该尽可能地保持类的私有性。