为什么在这个例子中使用内部关键字来自Jon Skeet的书
本文关键字:关键字 内部 Jon 的书 Skeet 为什么 | 更新日期: 2023-09-27 17:57:30
我一直在尝试理解internal
关键字以及何时需要使用它。幸运的是,今天,当我在 Jon Skeet 的书 C# In Depth, 3rd Edition 中读到关于如何实现迭代器时,在第 161-162 页,internal
有一个用途:
清单 6.32
using System;
using System.Collections;
public class IterationSample : IEnumerable
{
object[] values;
int startingPoint;
public IterationSample(object[] values, int startingPoint)
{
this.values = values;
this.startingPoint = startingPoint;
}
public IEnumerator GetEnumerator()
{
throw NotImplementedException();
}
}
清单 6.3
class IterationSampleIterator : IEnumerator
{
IterationSample parent;
int position;
internal IterationSampleIterator(IterationSample parent)
{
this.parent = parent;
position = -1;
}
public bool MoveNxt()
{
if (position != parent.values.Length)
{
position++'
}
return position < parent.values.Length;
}
public object Current
{
get
{
if (position == -1 ||
position == parent.values.Length)
{
throw new InvalidOperationException();
}
int index = position + parent.startingPoint;
index = index % parent.values.Length;
return parent.values[index];
}
}
public void Reset()
{
position = -1;
}
}
那么为什么internal IterationSampleIterator
呢?据我了解,internal
通常代替public
;因此,请帮助我了解为什么public IterationSampleIterator
会导致通过用internal
替换public
来解决的问题。
在深入了解发布的代码之前,可以查看有关 .Net C# 中访问修饰符的 MSDN 链接。
想法仍然是,当我们希望仅在assembly (mostly dll)
内访问时,我们会在内部制作一些东西。它可能看起来类似于 public
,但用法完全不同,因为对于public
来说,它是从任何地方对所有调用者的开放访问。
在代码示例中,内部的用法有不同的视角,这更多的是通过使构造函数internal
来控制IterationSampleIterator
类的对象,所以这个类只能从它自己的程序集内的调用方实例化,而任何其他来自外部的调用者都做不到。
对于程序集外部的所有用户,他们只能调用诸如属性(如Current
(或方法(如MoveNext
(的方法,Reset
使用内部实现,则无法直接访问对象。
程序集中存在某些类在内部使用并因此公开包装的功能的情况。我认为System.IO
是公开此类类的程序集之一,可以在程序集边界内使用
这与" 无关 public
可能会导致通过将public
替换为internal
来解决的问题。这不是为了解决问题。这是关于您的项目或库的设计。
如果对类(或其成员(使用 internal
修饰符,则该类(或成员(将只能在同一程序集中访问,而不能从其他程序集访问。
假设您正在设计一个 dll 库,并且您有一个要在 dll 的其他类中使用的类,但您不想向 dll 的用户公开此类。如果使用 public
,则用户将能够查看和使用类。但是,如果您使用internal
则用户将无法查看或使用该类,但所有其他类仍然可以使用它。