【问题标题】:(c#) Are nested (inner) classes the only way to restrict class access to one class?(c#) 嵌套(内部)类是限制类访问一个类的唯一方法吗?
【发布时间】:2021-06-01 11:52:25
【问题描述】:

为了存储我从 XML 文件中读取的数据,我创建了一个如上图所示的数据结构。所有编号为 1 到 n 的框都是类的实例。

第一个问题:

每个可以包含其他类的多个实例的类都使用列表元素,例如FundamentalNamingConvention 将许多 UnitType 存储在一个

List<UnitType>

这是正确的做法吗?

第二个问题:

所有类(FundamentalNamingConvention、UnitType、UnitName)只能由 NameGenerator 类访问。为确保这一点,我可以简单地将所有这些类设为 NameGenerator 的内部类,但该文件将有数百行代码。

有没有办法将类存储在它们单独的文件中(例如 UnitType.cs),但仍然只能由 NameGenerator 访问?

【问题讨论】:

  • Re q 2:您可以将所有类放在它们自己的程序集中,并将内部类标记为 internal。然后就无法从程序集外部访问它们。

标签: c# class nested inner-classes


【解决方案1】:

每个可以包含其他类的多个实例的类都使用一个列表元素来实现(例如,FundamentalNamingConvention 将许多 UnitType 存储在一个列表中)。这是正确的做法吗?

是的 - 很好。很可能任何ICollectionIListIEnumerable 都可以使用。但是List 很好。请注意:List 也允许您添加元素。这有时是不受欢迎的。

所有类(FundamentalNamingConvention、UnitType、UnitName)只能由 NameGenerator 类访问。为确保这一点,我可以简单地将所有这些类设为 NameGenerator 的内部类,但该文件将有数百行代码。

有没有办法将类存储在它们单独的文件中(例如 UnitType.cs),但仍然只能由 NameGenerator 访问?

是的,您可以使用分部类来拆分文件。例如:

//file1.cs
public partial class Foo
{
   //normal definition

}
//file1.cs
public partial class Foo
{
   private class InnerBar
   {
      //private inner class definition
   }
}

【讨论】:

    【解决方案2】:

    C# 允许您使用 partial keyword 将类定义拆分为多个部分:

    // Parent.cs
    using System;
    
    public partial class Parent
    {
        public static void WriteLine()
        {
            Console.WriteLine(Nested.Value);
        }
    }
    
    // Nested.cs
    using System;
    
    public partial class Parent
    {
        private class Nested
        {
            public static int Value { get => 123; }
        }
    }
    

    您会发现Parent.WriteLine() 正确打印了值123

    【讨论】:

      【解决方案3】:

      控制对类的访问的另一种方法是使用项目。创建一个包含所有类的新项目,将 NameGenerator 设为 public,将所有其他类设为 internal

      使用这样的细粒度项目有各种优点和缺点。许多项目可能会以各种方式降低性能,并且依赖项可能更难以管理。另一方面,它可以提高代码重用性,因为用户可以只依赖他们需要的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 2014-02-11
        • 1970-01-01
        相关资源
        最近更新 更多