为什么在 Jon Skeet 的书中的这个例子中使用了 internal 关键字?

Why is the internal keyword used in this example from Jon Skeet's book?

我一直在努力理解 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 会导致问题,这些问题可以通过将 public 替换为 internal 来解决。

这与 "public 无关,可以通过将 public 替换为 internal" 来解决问题。这不是为了解决问题。它与您的项目或库的设计有关。

如果您对 class(或其成员)使用 internal 修饰符,则该 class(或成员)将只能在同一程序集中访问,而不能来自其他集会。

假设您正在设计一个 dll 库,并且您有一个 class 想要在您的 dll 的其他 class 中使用,但您不想公开这个 class 给你的 dll 的用户。如果您使用 public,则用户将能够看到和使用 class。但是,如果您使用 internal,那么用户将无法看到或使用 class,但您所有其他 class 仍然可以使用它。

在深入研究发布的代码之前,您可以查看 MSDN Link 关于 .Net C# 中的访问修饰符。

想法仍然是,当我们希望仅在 assembly (mostly dll) 内访问时,我们会在内部制作一些东西。它可能看起来与 public 相似,但用法却大不相同,因为对于 public 它是对来自任何地方的所有调用者的开放访问。

代码示例中internal的用法有不同的看法,更多的是通过构造函数internal来控制IterationSampleIteratorclass的对象,所以这个class 只能从它自己的程序集中的调用者实例化,但来自外部的任何其他调用者都不能这样做。

对于程序集之外的所有用户,他们只能调用 属性 之类的方法 CurrentMoveNextReset 之类的方法来使用内部实现无法直接访问对象。

通常情况下,在程序集中有某些 class 内部使用并因此公开包装的功能。我认为 System.IO 是公开此类 classes 的程序集之一,可以在程序集边界内使用