我应该默认使用内部或公共可见性吗?

时间:2008-09-20 03:21:56

标签: c# .net public internal

我是一个非常新的C#和.Net开发人员。我最近使用C#创建了一个MMC管理单元,并对它的执行起来感到满意,特别是在听到组织中其他一些开发人员讲述C ++中有多么难以做到的恐怖故事之后。

我几乎完成了整个项目,并将“public”关键字的每个实例都设置为“internal”,除非运行时需要运行snapin。如果您通常将课程和方法公开或内部制作,您对此有何感受?

14 个答案:

答案 0 :(得分:35)

我尽可能地相信黑盒子。作为一名程序员,我想要一个定义明确的黑盒子,我可以轻松地将其放入我的系统中,并让它工作。我给它赋值,调用适当的方法,然后从中取出我的结果。

为此,请仅向我提供该类需要公开工作的功能。

考虑一部电梯。为了让它去一个地板,我按下一个按钮。这是黑匣子的公共接口,可以激活将电梯送到所需楼层所需的所有功能。

答案 1 :(得分:11)

你所做的正是你应该做的;为您的课程提供最小的可见性。哎呀,如果你想真正全力以赴,你可以一切 internal(最多)并使用InternalsVisibleTo attribute,这样你就可以分开你的功能但仍然没有将它暴露给未知的外部世界。

将事情公之于众的唯一理由是,您将项目打包在多个DLL和/或EXE中,并且(无论出于何种原因)您不关心使用InternalsVisibleTo,或者您正在创建一个图书馆供第三方使用。但即使在第三方使用的图书馆中,您也应该尽可能地减少“表面积”;你可用的课程越多,你的图书馆就会越混乱。

在C#中,确保您使用最低可见度的一个好方法是在您需要之前不要使用可见性修改器。 C#中的所有内容都默认为可见度最低:类的内部,类成员和内部类的私有。

答案 2 :(得分:7)

我认为你应该在内部课程和成员方面犯错。您可以随时增加项目的可见性,但减少它可能会导致问题。如果您正在为其他人构建框架,则尤其如此。

您确实需要小心,但不要隐藏用户的有用功能。 .NET BCL中有许多有用的方法,如果不使用反射就无法使用。然而,通过隐藏这些方法,可以减少必须测试和维护的表面积。

答案 3 :(得分:4)

我更愿意避免将类标记为public,除非我明确要求我的客户使用它们,并且我准备支持它们。

我将可访问性留空,而不是将类标记为internal。这样,public就会引人注目。 (当然,例外是嵌套类,如果它们即使在同一个程序集中也可见,则必须进行标记。)

答案 4 :(得分:2)

大多数课程应为internal,但大多数非私人会员应为public

你应该问一个成员的问题是“如果上课public,我是否希望成员被曝光?”。答案通常是“是(所以public)”因为没有任何可访问成员的类没有多大用处! internal成员确实有作用;它们是“后门访问”,仅适用于居住在同一组件中的近亲。

即使您的班级仍然是内部的,也很高兴看到哪些是前门成员,哪些是后门成员。如果你把它改为公开,你就不必回去思考哪个是哪个。

答案 5 :(得分:1)

你应该倾向于尽可能少地暴露于其他课程,并仔细考虑你所做的事情及其原因。

答案 6 :(得分:1)

你有什么理由需要使用Internal而不是Private?您确实意识到Internal具有汇编级别范围。换句话说,多类程序集中的所有类都可以访问内部类/成员。

正如其他一些答案所说,一般情况下,尽可能采用最高级别的封装(即私有),除非您确实需要内部/受保护/公开。

答案 7 :(得分:1)

我发现尽可能使用内部类的问题。您不能让该类型(或参数类型或返回类型)的方法,属性,字段等比内部更明显。这导致具有内部的构造函数以及属性。这应该不是问题,但事实上,当使用Visual Studio和xaml设计器时,存在问题。 设计人员检测到误报错误,因为这些方法不公开,用户控件属性似乎对设计人员不可见。我不知道其他人是否已经陷入这样的问题......

答案 8 :(得分:1)

您应该尝试使它们尽可能可见,但正如Mike上面所述,这会导致UserControls出现问题,并将VS Designer与表单或其他UserControl上的控件一起使用。

因此,作为一般规则,请保持您未使用Designer添加的所有类和UserControl仅在需要时可见。如果您正在创建要在Designer中使用的UserControl(即使在同一个程序集中也是如此),您需要确保UserControl类,其默认构造函数以及任何Properties和Events都为设计者公开使用它。

我最近遇到了一个问题,设计人员会从InitializeComponent()方法中删除this.myControl = new MyControl()行,因为UserControl MyControl与其构造函数一起被标记为内部。

我认为它真的是一个错误,因为即使它们被标记为内部,它们仍然显示在工具箱中以便在Designer中添加,要么Microsoft只需要使用公共构造函数显示公共控件,要么需要使它与内部控制也是如此。

答案 9 :(得分:0)

这取决于您对使用它的代码的控制程度。在我的Java开发中,默认情况下,我将所有的东西都公开为final,因为getter很烦人。但是,我也可以随时随地更改代码库中的任何内容。在过去,当我不得不向消费者发布代码时,我总是使用私有变量和getter。

答案 10 :(得分:0)

不要选择最适合该特定类的可见性需求的“默认”选择。在Visual Studio中选择新类时,模板将创建为:

class Class1
{
}

哪个是私有的(因为没有指定范围)。由您指定类的范围(或保留为私有)。应该有理由揭露课程。

答案 11 :(得分:0)

我喜欢尽可能少地揭露事物。私有,受保护,内部,公共:为类,变量,属性和函数提供所需的最低可见性,以便仍能正常工作。

只有在有充分理由的情况下,我才会向公众提出一些可见性。

答案 12 :(得分:0)

到目前为止,我完全不同意这些答案。我觉得内部是一个可怕的想法,阻止另一个程序集继承你的类型,甚至在需要解决方法时使用你的内部类型。

今天,我必须使用反射才能到达System.Data.DataTable的内部(我必须快速构建一个数据表闪电,没有所有的检查),我不得不使用反射,因为不是我可以使用单一类型;他们都被标记为内部。

答案 13 :(得分:0)

默认情况下,类在c#中创建为internal:  内部意味着:访问仅限于当前程序集。

http://msdn.microsoft.com/en-us/library/0b0thckt.aspx

好文章默认范围是内部的: http://www.c-sharpcorner.com/UploadFile/84c85b/default-scope-of-a-C-Sharp-class/