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

时间:2012-07-18 11:37:28

标签: c# namespaces private-members

我有一个Shunting-Yard算法的实现,我试图将其清楚地集成到我们的框架中。目前我把它全部打包成一个带有简单公共接口的类。

namespace MathematicalParser {
  public class ExpressionParser {
    public ExpressionParser(string expression, List<string> variables);
    public double GetNumericValue(Dictionary<string,double> variableValues);
  }
}

在这个类中,有很多辅助类,辅助枚举,静态变量等将不同的名称映射到函数。所有这些都是私有的,因此图书馆的用户无需担心。

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

如何在c#中最好地完成此任务,内部关键字仅适用于程序集,而private不能用于名称空间。

3 个答案:

答案 0 :(得分:1)

您是否尝试过使用私有嵌套类? 请看这里:Private inner classes in C# - why aren't they used more often?

答案 1 :(得分:1)

如果您真的非常渴望这样做(根据我对原始问题的评论),您可以将所有帮助程序类放入单个程序集中并使其成为内部程序,因此它们可以有效地关闭使用。然后进行第二次装配,即让人们使用的装配,并将“公共”类和方法放在第二个装配中。然后使用InternalsVisibleTo允许“公共”程序集使用其他“私有”程序集的帮助程序类和方法。

http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

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

如果你采用双装配路线并且如果你的同事正在使用相同的装配,那么至少在引用另一个可能阻止他们使用它的装配中有额外的“步骤”。

如果 还不够......我不知道,写一个WCF网络服务并完成*。

*这是讽刺

答案 2 :(得分:1)

我不会这样做(与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();
        }
    }
}

PrivateClass1.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的私有。