【问题标题】:C# class/namespace AccessC# 类/命名空间访问
【发布时间】:2010-11-22 10:00:16
【问题描述】:

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

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)

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

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

例子:

  • MyPaul 可以使用他的所有秘密,并且可以与 MyAccess 和 MyJohn 类进行通信。
  • MyPaul、MyJohn、MyAccess 将是公开的或内部的
  • MyAccess 无法使用 PaulSecret。

我不喜欢的解决方案:

  • 糟糕的解决方案 1

让约翰的秘密成为受保护和继承的 MyJohn

例子:

> protected JohnSecret
> internal MyJohn:JohnSecret

不好,因为如果我有 100 个班级机密,我需要有类似的东西:

> internal MyJohn:JohnSecret1, JohnSecret2,....,JohnSecret100
  • 糟糕的解决方案 2

类中有类:

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

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


谁能给出一个好的解决方案?

我很感激:)

非常感谢。

【问题讨论】:

  • 为什么需要这么多秘密课程?
  • 如果你有如此复杂的访问修饰符的情况,我想你的情况一定有其他问题。
  • 当我们的代码将由一个团队(多人编码 -> CVS 控件)开发时出现这个问题,有时使用 Visual Studio 的 IntelliSense,我们可以访问一个类(在其他一些代码目录中) 不应该直接使用。这就是为什么我问我们如何才能避免这种情况。

标签: asp.net class namespaces


【解决方案1】:

您应该采用您提出的第二种解决方案。对于您的可见性要求,它最适合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
    {
    }
}

【讨论】:

    【解决方案2】:

    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 中制作多个项目。


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

    它为您带来的主要好处是在编码时避免杂乱,但您已经将它们放在不同的命名空间中,无论如何这应该有助于消除杂乱。

    【讨论】:

    • 我按照“paracycle”所说的方式测试了部分类,它工作正常。关于您谈到的反射方面:我使用了“Red Gate 的 .NET Reflector”工具,是的,我可以看到我所有的私有类和核心。我也可以拆机。我可以看到代码.... :S 这告诉我没有办法保护我们的代码?我怎样才能销售程序并且不允许聪明人克隆我的代码?
    • 实际上,protected internalprotected internal,所以它对同一个程序集中的任何东西,类本身及其派生类都是可见的,无论他们在哪个程序集中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    相关资源
    最近更新 更多