默认情况下,我应该使用内部可见性还是公共可见性?
我是一个非常新的Cand .Net开发人员。我最近使用Cand创建了一个MMC管理单元,它对它的操作如此简单感到满意,尤其是在听到了我组织中其他一些开发人员关于C ++的难易程度的恐怖故事之后。
在某种程度上,我几乎遍历了整个项目,并将" public"关键字的每个实例都设置为" internal",除非运行时要求运行该管理单元。我们对此有何感想,通常应该将类和方法公开或者内部公开吗?
解决方案
我相信在可能的情况下使用黑匣子。作为一名程序员,我想要一个定义明确的黑匣子,我可以轻松地将其放入系统中并使它正常工作。我给它赋值,调用适当的方法,然后再从中获取结果。
为此,请仅给我类需要公开的功能。
考虑一部电梯。要使其滑到地板上,我按下一个按钮。这是黑匣子的公共界面,它激活将电梯提升到所需楼层所需的所有功能。
这取决于我们对使用它的代码有多少控制。在我的Java开发中,由于getter令人讨厌,因此默认情况下,我将所有东西都设为final final。但是,我也很荣幸能够随时更改代码库中的任何内容。过去,当我不得不向消费者发布代码时,我总是使用私有变量和getter。
我们应该倾向于尽可能少地向其他班级公开内容,并仔细考虑我们公开的内容以及原因。
不要选择"默认"选择最适合该特定类别的可见性需求的内容。当我们在Visual Studio中选择一个新类时,该模板将创建为:
class Class1 { }
这是私有的(因为未指定范围)。由我们指定类的范围(或者保留为私有)。应该有公开该类的理由。
我喜欢尽可能少地展示事物。私有的,受保护的,内部的,公共的:为类,变量,属性和函数提供最小的可见性,以使一切正常运行。
只有在有充分理由的情况下,我才会将某些可见性提升到公众的视野中。
我宁愿避免将类标记为"公共",除非我明确希望我的客户使用它们,并且我准备支持它们。
我将可访问性留为空白,而不是将类标记为"内部"。这样," public"就引人注目。 (当然,嵌套类是一个例外,如果它们即使在同一程序集中也是可见的,则必须对其进行标记。)
我认为我们应该在内部类和成员方面犯错。我们始终可以增加项目的可见性,但是降低项目的可见度会导致问题。如果我们正在为其他人构建框架,则尤其如此。
我们确实需要小心,尽管不要向用户隐藏有用的功能。 .NET BCL中有许多有用的方法,必须依靠反射才能使用。但是,通过隐藏这些方法,必须测试和维护的表面积减小了。
我们是否有任何理由需要使用Internal而不是Private?我们确实意识到Internal具有程序集级别的范围。换句话说,内部类/成员可被多类程序集中的所有类访问。
正如其他答案所说的那样,除非我们确实需要内部/受保护/公共的,否则通常会寻求最高级别的封装(即私有)。
我们所做的正是我们应该做的;为班级提供尽可能小的可见度。哎呀,如果我们真的想整顿猪,可以将所有内容(最多)设为"内部",并使用" InternalsVisibleTo"属性,这样就可以分离功能,但仍不能将其暴露给未知的外部世界。
公开的唯一原因是我们将项目打包在多个DLL和/或者EXE中,并且(无论出于何种原因)我们都不希望使用InternalsVisibleTo,或者正在创建供第三者使用的库派对。但是,即使在供第三方使用的库中,我们也应尽可能减小"表面积"。可用的类越多,库就越混乱。
在C#中,确保使用最低可见性的一种好方法是不使用可见性修改器,直到需要它们为止。 Cdefault中的所有内容都尽可能地不可见:对于类来说是内部的,对于类成员和内部类来说是私有的。
我发现尽可能多地使用内部类存在问题。我们不能使该类型(或者参数类型或者返回类型)的方法,属性,字段等比内部可见。这导致内部构造函数以及属性。这应该不成问题,但是事实上,当使用Visual Studio和xaml设计器时,会出现问题。由于方法不是公开的,因此设计人员会检测到误报错误,而用户控件属性对于设计人员而言似乎是不可见的。我不知道其他人是否已经陷入此类问题...
我们应该尝试使它们尽可能地可见,但是正如Mike上文所述,这会导致UserControls以及将VS Designer与窗体或者其他UserControls上的那些控件一起使用时出现问题。
因此,作为一般规则,请仅使使用设计器添加的所有类和UserControl在需要时可见。在创建要在设计器中使用的UserControl之后(即使是在同一程序集中),也需要确保将UserControl类,其默认构造函数以及所有属性和事件对设计器公开与它一起工作。
最近我遇到一个问题,设计人员会继续从InitializeComponent()方法中删除this.myControl = new MyControl()行,因为UserControl MyControl及其构造函数都被标记为内部。
我认为这确实是一个错误,因为即使将它们标记为内部,它们仍会显示在工具箱中以添加到设计器中,或者Microsoft只需要显示带有公共构造函数的公共控件,或者它们需要使其与内部控件一起使用。出色地。