【问题标题】:How to define "anonymous namespace" in C#?如何在 C# 中定义“匿名命名空间”?
【发布时间】:2014-04-22 06:05:39
【问题描述】:

在 C++ 中,为了定义一个只能在同一个文件中访问的符号,我们说

namespace 
{
    class my_private_class
    { ... }
}

但是我可以在 C# 中做同样的事情吗?还是我不得不说

namespace __DO_NOT_USE_OUT_OF_.xxx.cs__ 
{       
  public MyPrivateClass 
  { ... }
}

using __DO_NOT_USE_OUT_OF_.xxx.cs__;

(假设这是在一个名为 xxx.cs 的文件中)? 当然,后者将取决于其他程序员是否考虑。

【问题讨论】:

  • 不,但您可以考虑将MyPrivateClass 范围限定在另一个类中,如果它只会被该类使用。
  • 注意:匿名命名空间不应与未命名命名空间 (here's a question on that) 混淆。如果您完全省略文件中的namespace 规范,则文件中的类被称为未命名命名空间(see MSDN) 的一部分,它们将进入global 命名空间。这不等同于 C++ 匿名命名空间。

标签: c# namespaces


【解决方案1】:

C# 中没有这样的东西,我们有一个叫做 access modifiers 的东西来管理类型的可见性。

用法是针对某个类或方法的,如:

internal class MyType 
{

}

或者

protected void MyMethod() 
{

}

您必须选择适用于您的场景的一个,以下是详细信息:

公开

同一程序集或引用它的其他程序集中的任何其他代码都可以访问该类型或成员。

私人

类型或成员只能被同一类或结构中的代码访问。

受保护

只能通过同一类或结构中的代码或从该类派生的类中的代码访问该类型或成员。

内部

同一程序集中的任何代码都可以访问类型或成员,但不能从另一个程序集中访问。

受保护的内部

类型或成员可以被声明它的程序集中的任何代码访问,也可以从另一个程序集中的派生类中访问。来自另一个程序集的访问必须在从声明受保护内部元素的类派生的类声明中进行,并且必须通过派生类类型的实例进行。

【讨论】:

    【解决方案2】:

    C# 中没有匿名命名空间,但您可以利用静态类

    namespace MyNamespace // <- Just a namespace
    {
        // Anonymous Namespace emulation:
        //   static class can't have instances and can't be inherited, 
        //   it's abstract and sealed
        internal static class InternalClass // or public static class
        {
            // private class, it's visible within InternalClass only  
            class my_private_class 
            { ... }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 2011-12-18
      • 2010-11-23
      • 2019-10-29
      相关资源
      最近更新 更多