2011-11-21 26 views
3

我有点不明白这一点,并想知道如果有人可以请帮我理解这一点。将数据公开为C#属性 - 好还是坏?

因此,这里的问题,我在其中没有必需的参数类。如果用户没有设置字段,我可以采取默认值并继续。以前,我设计了与Joshua Bloch的Builder Pattern(Effective Java)(不可变对象)相同的类。我没有任何理由让这个类不可改变,除非我不想要伸缩构造函数,并且我不想暴露这个类的数据。

但现在,一个老乡程序员朋友试图说服我,也没关系揭露使用C#的属性从类的数据。我不确定这一点,我仍然认为我不应该让用户弄糟数据。

也许我完全错了我的理解。是否有人能够澄清我对此的怀疑,揭露班级数据的好坏?

如果它是好的那么在什么情况下它是好的?否则,如果有人可以请点我的文章/书澄清这一点,我会很感激它。

谢谢!

+0

如果您想知道属性或字段,请查看Jon Skeet的[this](http://csharpindepth.com/articles/chapter8/propertiesmatter.aspx)文章。 – Otiel

回答

4

公开数据中的类如果需要的话还是在类外的兴趣,并没有这样做,如果事实并非如此。如果它只需要在外部读取,则将其展示为只读;如果应该可以更改,则将其展示为完整的读/写属性。否则,请将其保存在私人领域。

+1

感谢您的回复安德鲁。如果我最终暴露数据,那么它会不会违反封装?这是我感到困惑的地方。 – test123

+2

这是一种违反*如果没有好的建筑理由来暴露它。通过使用属性而不是公共字段,您也可以维护封装的各个方面。 –

0

这主要取决于什么是你的类在应用程序上下文的目的(你可以给我们更多的细节?)。 反正估计,你可以做一个酒店需要从外部变化的安全通过声明是二传手私人: http://msdn.microsoft.com/en-us/library/bb384054.aspx

public string UserName { get; private set; } 
+0

非常感谢mamoo的回复。该类是一个构建器类,它首先在数据库中创建所有适当的条目,然后将其加载到类对象中。要公开的数据是为这些数据库表项设置一些值。请让我知道是否需要更多信息。谢谢! – test123

0

当类的消费者所需要的数据很“好”。你有两种可能性来提供属性。 如果你只想提供信息的目的属性,然后选择只读这样的特性:

public string MyInformation { get; private set; } 

如果你有需要让消费者改变属性,然后进行二传手市民一样, :

public string MyChangeableInformation { get; set; } 

但是,如果消费者没有必要获取信息,那么将其隐藏在您的课堂!

0

但是现在,一位程序员朋友正试图说服我说它是 没关系使用C#属性公开类的数据。我不是 肯定这一点,我仍然觉得我不应该让用户 与数据混杂。

作为一个经验法则,方法应该表示动作,而属性表示数据。你的朋友可能试图告诉你的是,你可以将你的班级的数据暴露给外部世界,并仍然完全控制其他班级访问数据的方式。就你的情况而言,正如其他人所说的那样,你可以使用私有setter的属性,这样调用者就不应该能够修改数据。

+0

这就是问题所在。我希望用户可以选择设置数据。例如,如果他们没有设置它,我会采用默认值。使用我之前设计的不可变类使用户只能设置一次数据。 – test123

+0

如果您想要实现不可变的功能,那么您将不得不使用“只读”关键字。在这种情况下,您必须在声明时或在构造函数中初始化该值。然后你可以通过getter属性公开这些属性。 –

2

不可变类更容易推理,尤其是在多任务应用程序中,但它们通常会在性能上付出代价(因为当需要更改字段的值时,需要使用新值再次构建整个类)。 所以,你可以确定或(取决于你正在编码的)甚至更好的属性,但像往常一样,没有银弹。

可设置属性也是为某些特定框架或库(例如NHibernate等ORM)编写对象的唯一方法,因为您无法控制库/框架如何初始化对象。

关于构造函数,C#4有optional parameters,它可以帮助您避免构造函数的长链,并且更清楚地传递参数是可选参数的事实。

但是,我不能想到很多情况下,你最终会得到一个长长的可选参数列表。如果你发现你经常编写这样的类(特别是对于构建器模式,这种模式在类的消费者侧非常优雅,但是类本身的代码复杂化),你可能会使用错误的设计。你确定你没有要求你的班级承担太多的责任吗?

+0

哇,不知道C#中的可选参数。感谢那。在我的情况下,你不会工作,因为类有很多领域,除了一个以外,他们都是可选的。 :-( – test123

+0

如果您不知道它们,C#也有[对象初始化程序](http://msdn.microsoft.com/zh-cn/library/bb397680.aspx)在初始化时使用可设置的属性非常轻巧的语法。 –