为什么在这个例子中使用内部关键字来自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来解决的问题。

为什么在这个例子中使用内部关键字来自Jon Skeet的书

在深入了解发布的代码之前,可以查看有关 .Net C# 中访问修饰符的 MSDN 链接。

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

在代码示例中,内部的用法有不同的视角,这更多的是通过使构造函数internal来控制IterationSampleIterator类的对象,所以这个类只能从它自己的程序集内的调用方实例化,而任何其他来自外部的调用者都做不到。

对于程序集外部的所有用户,他们只能调用诸如属性(如Current(或方法(如MoveNext(的方法,Reset使用内部实现,则无法直接访问对象。

通常情况下,在

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

这与" 无关 public 可能会导致通过将public替换为internal来解决的问题。这不是为了解决问题。这是关于您的项目或库的设计。

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

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