为什么不公开所有字段/属性/方法?

时间:2011-03-06 12:44:36

标签: c# oop access-modifiers information-hiding public-members

我知道这可能听起来很愚蠢,但我真的很想知道:) 即时学习c#,

如您所知,您需要将“对象”(按钮,标签,文本,变量等)设置为公共或任何您喜欢的内容。

但是,您仍然需要编写如下代码:

// my point is you cant just type label1.text you need to type class.label1.text
// so there is no chance of getting bugged
//because there is label1 in each of forms/classes
 class Classlol = new class();
 classlol.label1.blabla

那么以其他形式让它无法到达有什么意义呢?为什么每件事都不公开或默认不公开?

感谢。

4 个答案:

答案 0 :(得分:7)

简单来说,就像你穿衣服的原因一样。并非所有东西都应该随时向公众展示。选定的事物需要是公开的,以便其他人可以与他们互动,但其他事情是私人的,应该保持在该类的内部。

虽然,我可能不应该在最后一句话中使用内部词,因为还有第三种选择:internal访问修饰符。 VB.NET(Friend)中使用的名称可能更清晰。这表示一个数据应该对单个程序集中的所有其他类可见,但是从外部隐藏。类似的类比也适用:有些事情可能与你最亲密的朋友分享,但仍然不想公开。

还有其他更复杂的原因,例如启用信息隐藏,最大化特定类与应用程序其余部分之间的分离,并维护一致的公共接口,即使版本之间的实现细节可能已更改,所有其中有助于良好的面向对象设计。如果你真的想了解这个细节,我建议你找一本关于面向对象编程的好书。如果不是不可能的话,掌握像C#这样的面向对象语言是非常困难的,而不是对基础知识有充分的理解。

默认情况下,这些内容不公开,因为它们可能包含敏感信息,或者至少是您不希望作为类的公共接口的一部分公开的信息。将事物公之于众是一个更大的决定,风险更大,而不仅仅是将其设为私有,因此您必须明确地做出决定

答案 1 :(得分:6)

使用类的关键是能够将代码分成逻辑相关的部分。这使您的代码更易于理解和维护。

例如,如果您需要修改类中的代码,则可以更多地关注类的运行方式,而不是项目的其他部分。但是,您的类的公共成员会稍微限制这种分离,因为如果您修改公共成员,那么可以影响项目的其他部分。

保持尽可能多的私有(尽管仍然可以从您的应用程序中使用)最大化它与应用程序其余部分之间的分离。它使您更容易只考虑您正在处理的类中的逻辑,并且它允许您修改这些私有成员,而无需考虑应用程序的其他部分可能会受到影响。

答案 2 :(得分:3)

我建议你阅读更多关于面向对象编程中的抽象。也许Wikipedia article on abstraction是一个很好的起点。

编辑: Konrad是绝对正确的,抽象并不会自动暗示“隐藏”信息。你可以说它是encapsulation在面向对象编程中的作用。

我想我想说的是这个问题并不是特定于C#,而是需要对一般面向对象的编程原则进行一些阅读。

答案 3 :(得分:0)

默认访问修饰符为internal,这意味着它在同一个程序集中是公共的,在程序集外是私有的。

如果要将某些数据公开为公共数据,例如某些标签的文本,最佳做法是创建公共只读属性,如下所示:

public string LabelText
{
   get { return MyLabel.Text; }
}

要访问它,您必须使用此类代码:

string text = classInstance.LabelText;

这样,Label本身不公开,但每个人都可以阅读其文本。