【问题标题】:Why aren't all fields/properties/methods public?为什么不是所有的字段/属性/方法都是公开的?
【发布时间】:2011-07-09 19:02:42
【问题描述】:

我知道这听起来可能很愚蠢,但我真的很想知道 :) 我正在学习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

那么以其他形式使其无法访问有什么意义呢?为什么每件事都不公开或默认不公开?

谢谢。

【问题讨论】:

  • 当您说object 时,您是指member 还是class
  • “我的意思是你不能只输入 label1.text,你需要输入 class.label1.text,这样就不会被窃听,因为每个表单/类中都有 label1”。什么?

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


【解决方案1】:

我建议您阅读更多有关面向对象编程中的抽象的内容。也许Wikipedia article on abstraction 是一个不错的起点。

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

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

【讨论】:

  • 这是误导。抽象并不要求信息隐藏。这只是意味着我们不能很好地利用透露的信息。但原则上,抽象对于仅公开的数据同样适用。事实上,我知道那些这样做的库(出于愚蠢的原因)。
【解决方案2】:

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

例如,如果您需要修改类中的代码,您可以更多地关注类的功能,而不是项目的其他部分。但是,您的类的公共成员会在一定程度上限制这种分离,因为如果您修改公共成员,可能会影响项目的其他部分。

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

【讨论】:

    【解决方案3】:

    简单来说,和你穿衣服的原因差不多。并不是所有的东西都应该在任何时候都暴露在公众面前。选定的东西需要是公开的,以便其他人可以与之交互,但其他东西是私有的,应该保留在该类的内部。

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

    还有其他更复杂的原因,比如启用信息隐藏、最大限度地分离特定类和应用程序的其余部分以及保持一致的公共接口,即使版本之间的实现细节可能已更改,所有这些其中有助于良好的面向对象设计。如果您真的想了解细节,我建议您选择一本关于面向对象编程的好书。如果没有扎实的基础知识,要掌握像 C# 这样的面向对象语言,即使不是不可能,也是非常困难的。

    默认情况下,事物是不公开的,因为它们可能包含敏感信息,或者至少是您不想作为类的公共接口的一部分公开的信息。将某件事公开是一个更大的决定,其风险比简单的私有化要大,因此您必须明确地做出该决定。

    【讨论】:

    • 为什么我不想将这些信息暴露给其他表单/类文件?
    • @user:因为那些其他类不需要知道这些信息。它是该特定类的实现细节,保持私有有几个优点。首先,它简化了您呈现给其他类的外部接口。这使得针对您的类进行编程变得更加容易。其次,通过减少您公开的内部信息量,您可以更轻松地修改类的实现,而不会破坏使用该类的其他类。因此,您可以在不破坏其他代码的情况下更改内部辅助函数。这促进了代码重用。
    【解决方案4】:

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

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

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

    要访问它,您必须使用这样的代码:

    string text = classInstance.LabelText;
    

    这样Label本身是不公开的,但它的文字可以被所有人阅读。

    【讨论】:

      猜你喜欢
      • 2011-10-06
      • 1970-01-01
      • 2018-11-12
      • 2013-09-17
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多