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

时间:2016-07-17 04:35:04

标签: c# .net oop access-modifiers

我一直在尝试了解internal关键字以及何时需要使用它。幸运的是,今天,正如我正在阅读Jon Skeet的书 C#In Depth,3rd Edition 关于如何实现迭代器一样,在第161-162页上有internal的用法: / p>

代码清单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而导致的问题。

2 个答案:

答案 0 :(得分:3)

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

当我们希望仅在assembly (mostly dll)内访问时,我们仍然会在内部创建内容。它似乎与public类似,但使用情况完全不同,因为对于public,它可以从任何地方对所有呼叫者进行开放访问。

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

对于程序集之外的所有用户,他们只能调用Current之类的属性或MoveNextReset之类的方法来处理内部实现,而不是直接访问该对象。

通常情况下,在程序集内部存在某些内部使用的类,从而暴露包装的功能。我认为System.IO是暴露这些类的程序集之一,可以在程序集边界内使用

答案 1 :(得分:2)

不是public可能导致问题通过将public替换为internal来解决。这不是解决问题。这是关于项目或图书馆的设计。

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

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