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

标签 c# namespaces private-members

我有一个 Shunting-Yard 算法的实现,我正试图将其清楚地集成到我们的框架中。目前,我已将所有内容打包到一个具有简单公共(public)接口(interface)的类中。

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

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

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

如何在 C# 中最好地完成此操作,internal 关键字仅适用于程序集,而 private 不能用于命名空间。

最佳答案

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

公共(public)类.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 私有(private)的。

关于c# - 如何使基础架构代码仅在命名空间中可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11540441/

相关文章:

javascript通过继承实现私有(private)变量

c# - 在 C# 中拖放?

c# - Kendo 网格导出到 Excel 货币格式

c# - TextBox 的文本属性是否有可能为空?

c++ - 模拟模板参数的参数相关查找

c# - Visual Studio 2010 看不到命名空间,但它存在

c# - 如何使用 WPF 中的 MVVM 设计模式以编程方式选择和设置焦点数据网格行

php - Unirest POST 请求不会在 PHP 中运行

c++ - 派生类如何使用基类的 protected 成员?

c++ - 我应该通过引用、值或 ptr 存储完全封装的成员吗?