(c#) 嵌套(内部)class 是限制 class 访问一个 class 的唯一方法吗?
(c#) Are nested (inner) classes the only way to restrict class access to one class?
为了存储我从 XML 文件中读取的数据,我创建了一个如上图所示的数据结构。所有编号为 1 到 n 的框都是 class.
的实例
第一个问题:
每个 class 可以容纳其他 classes 的多个实例使用列表元素来实现,例如FundamentalNamingConvention 在
中存储了许多 UnitType
List<UnitType>
这是正确的做法吗?
第二个问题:
所有 classes(FundamentalNamingConvention、UnitType、UnitName)只能由 NameGenerator class 访问。为确保这一点,我可以简单地将所有这些 classes 设为 NameGenerator 的内部 classes,但该文件将有数百行代码长。
有没有办法将 classes 存储在它们单独的文件中(例如 UnitType.cs)但仍然只能由 NameGenerator 访问?
Each class that can hold multiple instances of other classes does so with a list element (e.g. FundamentalNamingConvention stores many UnitTypes in a List). Is this a proper way of doing it?
是的 - 很好。很可能任何 ICollection
、IList
或 IEnumerable
都可以。但是 List
没问题。请注意:List
也允许您添加元素。这有时是不希望的。
All classes (FundamentalNamingConvention, UnitType, UnitName) are only to be accessed by the NameGenerator class. To ensure this, I could simply make all these classes be inner classes of the NameGenerator but then that file would be several hundred lines of code long.
有没有办法将 classes 存储在它们单独的文件中(例如 UnitType.cs),但仍然只能由 NameGenerator 访问?
是的,您可以使用部分 class 来拆分文件。例如:
//file1.cs
public partial class Foo
{
//normal definition
}
//file1.cs
public partial class Foo
{
private class InnerBar
{
//private inner class definition
}
}
C# 允许您使用 partial
keyword:
将 class 定义拆分为多个部分
// 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
另一种控制对 类 的访问的方法是使用项目。使用所有 类、make NameGenerator
public 和所有其他 类 internal
.
创建一个新项目
像这样使用细粒度的项目有很多优点和缺点。许多项目可能会以各种方式降低性能,并且依赖项管理起来会更加麻烦。另一方面,它可以提高代码重用,因为用户可以只依赖于他们需要的东西。
为了存储我从 XML 文件中读取的数据,我创建了一个如上图所示的数据结构。所有编号为 1 到 n 的框都是 class.
的实例第一个问题:
每个 class 可以容纳其他 classes 的多个实例使用列表元素来实现,例如FundamentalNamingConvention 在
中存储了许多 UnitTypeList<UnitType>
这是正确的做法吗?
第二个问题:
所有 classes(FundamentalNamingConvention、UnitType、UnitName)只能由 NameGenerator class 访问。为确保这一点,我可以简单地将所有这些 classes 设为 NameGenerator 的内部 classes,但该文件将有数百行代码长。
有没有办法将 classes 存储在它们单独的文件中(例如 UnitType.cs)但仍然只能由 NameGenerator 访问?
Each class that can hold multiple instances of other classes does so with a list element (e.g. FundamentalNamingConvention stores many UnitTypes in a List). Is this a proper way of doing it?
是的 - 很好。很可能任何 ICollection
、IList
或 IEnumerable
都可以。但是 List
没问题。请注意:List
也允许您添加元素。这有时是不希望的。
All classes (FundamentalNamingConvention, UnitType, UnitName) are only to be accessed by the NameGenerator class. To ensure this, I could simply make all these classes be inner classes of the NameGenerator but then that file would be several hundred lines of code long.
有没有办法将 classes 存储在它们单独的文件中(例如 UnitType.cs),但仍然只能由 NameGenerator 访问?
是的,您可以使用部分 class 来拆分文件。例如:
//file1.cs
public partial class Foo
{
//normal definition
}
//file1.cs
public partial class Foo
{
private class InnerBar
{
//private inner class definition
}
}
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
另一种控制对 类 的访问的方法是使用项目。使用所有 类、make NameGenerator
public 和所有其他 类 internal
.
像这样使用细粒度的项目有很多优点和缺点。许多项目可能会以各种方式降低性能,并且依赖项管理起来会更加麻烦。另一方面,它可以提高代码重用,因为用户可以只依赖于他们需要的东西。