C#class / namespace Access

时间:2009-08-24 20:40:09

标签: asp.net class namespaces

我向多个人提出这个问题,直到现在我还没有答案。

ASP.NET C#

项目树(文件和文件夹):

> (ROOT) 
>
> Class MyAccess (namespace myproject.core)
> 
> (Directory John)
------> Class MyJohn          (namespace myproject.core.John)
------> Class JohnSecret      (namespace myproject.core.John)
------> Class OtherJohnSecret (namespace myproject.core.John)
> 
> (Directory Paul)
------> Class MyPaul          (namespace myproject.core.Paul)
------> Class PaulSecret      (namespace myproject.core.Paul)

我如何使用(公共,私人,受保护,内部)?????有这种行为:

  • 类MyJohn看到并且可以从John文件夹中的所有类创建对象(他所有的秘密)
  • 类MyPaul具有相同的行为,但在Paul文件夹
  • 所有这些秘密都不能在这个文件夹外使用。

示例:

  • MyPaul可以使用他所有的秘密,他可以与MyAccess和MyJohn这两个班级进行交流。
  • MyPaul,MyJohn,MyAccess将公开或内部
  • MyAccess无法使用PaulSecret。

我不喜欢的解决方案:

  • BAD Solution 1

让约翰的秘密成为受保护和遗产的MyJohn

示例:

> protected JohnSecret
> internal MyJohn:JohnSecret

糟糕,因为如果我有100个级别的秘密,我需要有类似的东西:

> internal MyJohn:JohnSecret1, JohnSecret2,....,JohnSecret100
  • BAD Solution 2

在课程中有课程:

> internal class MyJohn {
> 
>        internal string DoSomething(){}
>        
>        private class JohnSecret{}
>        private class JohnSecret2{}
>        private class JohnSecret3{}
>
> }

这不好,因为如果我有100个秘密,我将拥有一个巨大的文件,我无法将该代码拆分为不同的源代码文件。


任何人都可以提供一个好的解决方案吗?

我很感激:)。

非常感谢。

2 个答案:

答案 0 :(得分:3)

你应该选择你提出的第二个解决方案。对于您拥有的可见性要求,最适合JohnSecretOtherJohnSecret等。人。在MyJohn类中定义。

如果您希望将类文件拆分为多个文件,则可以使用partial classes来实现该目标,并仍然保持您的可见性要求。

例如:

> (Directory John)
> File "MyJohn.cs"
public partial class MyJohn
{
}

> File "JohnSecret.cs"
public partial class MyJohn
{
    private class JohnSecret
    {
    }
}

> File "OtherJohnSecret.cs"
public partial class MyJohn
{
    private class OtherJohnSecret
    {
    }
}

答案 1 :(得分:1)

C#具有以下访问权限。

  • public - 每个人都可以看到它
  • private - 只有课堂内的东西才能看到它
  • protected - 只有类中的内容或派生类内的内容才能看到它
  • internal - 只有程序集内的内容(dll或exe)可以看到它
  • protected internal - 只有类或派生类中的内容才能看到它,并且只有它们位于同一个程序集中

您只有两个选项:

  • 作为Neil mentioned,您可以使用internal,并将您的代码拆分为2个程序集 - 一个用于John,一个用于Paul。
  • 正如您已经提到的,您可以使用private,并将所有JohnSecret类嵌套在外部John类中。 paracycle's tip of using partial classes使这个相当不错。

注意:要制作多个程序集,必须在visual studio中创建多个项目。


从务实的角度来看,目录是否像这样被隔离在一起真的很重要吗?使用访问修饰符没有任何安全优势,因为任何人总是可以使用反射来轻松调用您的私有/内部方法。

它给你的主要好处是在编码时保持杂乱,但你已经将它们放在不同的命名空间中,这无论如何都应该有助于混乱。