C# 如何使基础结构代码仅在命名空间中可见?

C# 如何使基础结构代码仅在命名空间中可见?,c#,namespaces,private-members,C#,Namespaces,Private Members,我有一个调车场算法的实现,我正试图将其清晰地集成到我们的框架中。目前,我已经将其打包到一个带有简单公共接口的类中 namespace MathematicalParser { public class ExpressionParser { public ExpressionParser(string expression, List<string> variables); public double GetNumericValue(Dictionary<st

我有一个调车场算法的实现,我正试图将其清晰地集成到我们的框架中。目前,我已经将其打包到一个带有简单公共接口的类中

namespace MathematicalParser {
  public class ExpressionParser {
    public ExpressionParser(string expression, List<string> variables);
    public double GetNumericValue(Dictionary<string,double> variableValues);
  }
}
namespace MathematicalParser{
公共类表达式解析器{
公共表达式解析器(字符串表达式、列表变量);
公共双GetNumericValue(字典变量值);
}
}
在这个类中,有许多帮助器类、帮助器枚举、静态变量等,可以将不同的名称映射到函数。所有这些都是私有的,因此图书馆用户不必担心

为了提高代码的可维护性,我尝试将逻辑上不相关的代码分离到它们自己的类中,但是这些类在ExpressionParser之外没有任何意义,因此我想将它们的可见性限制在名称空间MathematicalParser(它只包含ExpressionParser)中


在c#中,internal关键字只对程序集有效,private不能在名称空间中使用。

您尝试过使用私有嵌套类吗?

看看这里:

如果你真的非常想这样做(根据我对原始问题的评论),你可以把所有的助手类放在一个程序集中,使它们成为内部的,这样它们就可以有效地停止使用。然后制作第二个程序集,让人们使用,并将“public”类和方法放入第二个程序集中。然后使用
InternalsVisibleTo
允许您的“公共”程序集使用其他“私有”程序集的帮助器类和方法

这意味着您必须强制使用您的库的用户在与包含“公共”库代码的程序集中不同的程序集中工作。我想从你的问题你是说他们在同一个程序集中工作,在这种情况下,你必须将“公共”库分离到不同的程序集中。如果您这样做了,那么简单地将方法内部化并将它们放在同一个程序集中就可以了

如果您使用两个程序集路线,并且您的同事正在使用同一个程序集,那么至少在引用另一个程序集时有一个额外的“步骤”,可能会阻止他们使用它

如果这还不够的话。。。我不知道,写一个WCF Web服务,然后通过它来工作*

*这是讽刺

我不会这么做(与Joe的观点相同),但从Lopina的回答中得出了另一个解决方案:嵌套类+部分类

PublicClass.cs:

namespace MyNamespace
{
    public partial class PublicClass
    {
        public int ReturnSomeStuff()
        {
            MyHelperClass1 tmp = new MyHelperClass1();
            MyHelperClass2 tmp2 = new MyHelperClass2();

            return tmp.GetValue1() + tmp2.GetValue2();
        }
    }
}
PrivateClass.cs:

namespace MyNamespace
{
    public partial class PublicClass
    {
        private class MyHelperClass1
        {
            public int GetValue1()
            {
                return 5;
            }
        }
    }
}
PrivateClass2.cs:

namespace MyNamespace
{
    public partial class PublicClass
    {
        private class MyHelperClass2
        {
            public int GetValue2()
            {
                return 10;
            }
        }
    }
}
Program.cs:

public class Program
{
    private static void Main(string[] args)
    {
        PublicClass tmp = new PublicClass();

        MyHelperClass2 zz;  // Can't access MyHelperClass2 here cause it's private

        Console.WriteLine(tmp.ReturnSomeStuff());
        Console.ReadLine();
    }
}

正如您所看到的,您的不同助手类在不同的文件中物理上是分开的(也许这会帮助您维护代码)。您不能直接访问它们,它们是
PublicClass的私有类

内部有什么问题?您的程序集是否如此庞大,以至于您无法相信其他开发人员不会尝试使用它们?名称空间的全部意义在于将类型分组在一起,这样就不会混淆助手类的用途。@Joe Trust和Trust,我不希望在尝试使用ExpressionParser时将它们暴露于不需要的类中。正如我现在写的,公共接口很棒,所有的基础设施都隐藏在类中。我只是希望在不改变界面的情况下将代码分成逻辑上连贯的可维护块。在这种情况下,我已经发布了一个可能有用的答案,这是我唯一能想到的。可能的重复我可能误解了你,但我相信这就是现在的编写方式。我希望维护私有内部类(即非公共基础设施代码)的功能,同时将代码拆分为可维护的块。这些类中的一些相当大,如果实现中有bug,它们本身可能需要更新。啊,我明白了。您想声明并使用一个作为独立编译单元的私有类吗?这是一个非常有用的答案。它允许我拆分代码并从每个逻辑单元访问解析器定义的静态变量,而不会污染名称空间。