我一直在努力理解 internal
关键字以及何时需要使用它。幸运的是,今天,当我在阅读 Jon Skeet 的书 C# In Depth, 3rd Edition 关于如何实现迭代器时,在第 161-162 页有一个 internal
:
list 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();
}
}
list 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
会导致问题,这些问题可以通过将 public
替换为 internal
来解决。
最佳答案
在深入研究发布的代码之前,您可以查看 MSDN Link关于 .Net C# 中的访问修饰符。
当我们希望仅在程序集(主要是 dll)
中访问某些内容时,我们的想法仍然是在内部制作一些内容。它可能看起来与 public
类似,但用法却大不相同,因为对于 public
来说,它是对来自任何地方的所有调用者的开放访问。
在代码示例中,internal 的用法有不同的观点,这更多是为了控制 IterationSampleIterator
类的对象,通过构造函数 internal
,所以这个类只能从它自己的程序集中的调用者实例化,但来自外部的任何其他调用者都不能这样做。
对于程序集之外的所有用户,他们只能调用诸如 Current
之类的属性方法或诸如 MoveNext
和 Reset
之类的方法来使用内部实现没有直接访问对象。
通常情况下,在程序集中有某些类在内部使用并因此公开包装的功能。我认为 System.IO
是公开此类的程序集之一,可以在程序集边界内使用
关于c# - 为什么在 Jon Skeet 的书中的这个例子中使用了 internal 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38417942/