3

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

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

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

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

如何在 C# 中最好地实现这一点,internal 关键字仅适用于程序集,而 private 不能在命名空间中使用。

4

3 回答 3

1

您是否尝试过使用私有嵌套类?
看看这里:C# 中的私有内部类 - 为什么不经常使用它们?

于 2012-07-18T11:40:25.140 回答
1

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

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

这确实意味着您必须强制使用您的库的人在与包含“公共”库代码的程序集不同的程序集中工作。我认为根据您的问题,您是说他们在同一个程序集中工作,在这种情况下,您必须将“公共”库分离到不同的程序集中。如果您确实这样做了,那么只需将方法设置为内部并将它们放在同一个程序集中就可以完成这项工作。

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

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

*这是讽刺

于 2012-07-18T13:20:24.060 回答
1

我不会这样做(与乔的意见相同),但这是从 Lopina 的答案中得出的另一个解决方案:嵌套类 + 部分类

公共类.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;
            }
        }
    }
}

程序.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

于 2012-07-18T13:54:45.410 回答