首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#类/命名空间访问

C#类/命名空间访问
EN

Stack Overflow用户
提问于 2009-08-24 20:40:09
回答 2查看 3.2K关注 0票数 1

我问了很多人这个问题,直到现在我还没有答案。

ASP.NET C#

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

代码语言:javascript
复制
> (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)

如何使用(public,private,protected,internal)要有这样的行为:

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

示例:

  • MyPaul可以使用他的所有秘密,并且他可以与类MyAccess和MyAccess进行通信,
  • MyAccess将不能使用PaulSecret。

我不喜欢的解决方案:

  • BAD解决方案1

将约翰的秘密设置为受保护的,并继承一个MyJohn

示例:

代码语言:javascript
复制
> protected JohnSecret
> internal MyJohn:JohnSecret

这很糟糕,因为如果我有100个类秘密,我需要有这样的东西:

代码语言:javascript
复制
> internal MyJohn:JohnSecret1, JohnSecret2,....,JohnSecret100

  • BAD解决方案2

在类中包含类:

代码语言:javascript
复制
> internal class MyJohn {
> 
>        internal string DoSomething(){}
>        
>        private class JohnSecret{}
>        private class JohnSecret2{}
>        private class JohnSecret3{}
>
> }

这并不好,因为再一次,如果我有100个秘密,我会有一个巨大的文件,我不能将代码拆分到不同的源代码文件中。

有人能给出一个好的解决方案吗?

我很感谢:)

非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-24 20:48:20

您应该采用您提出的第二个解决方案。对于您拥有的可见性需求,它最适合于JohnSecretOtherJohnSecret等。阿尔。将在MyJohn类中定义。

如果您希望将类文件拆分到多个文件中,则可以使用partial classes来实现,同时仍然保持现有的可见性要求。

例如:

代码语言:javascript
复制
> (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
    {
    }
}
票数 3
EN

Stack Overflow用户

发布于 2009-08-24 20:52:03

C#具有以下访问权限。

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

您只有两个选项:

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

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

从实用的角度来看,如果目录像那样彼此隔开,这真的很重要吗?使用访问修饰符没有任何安全好处,因为任何人都可以使用反射来轻松地调用您的私有/内部方法。

它给您的主要好处是在编码时避免杂乱,但您已经将它们放在不同的名称空间中,这应该有助于处理杂乱。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1324629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档