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

标签 c# .net oop access-modifiers

我一直在努力理解 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 之类的属性方法或诸如 MoveNextReset 之类的方法来使用内部实现没有直接访问对象。

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

关于c# - 为什么在 Jon Skeet 的书中的这个例子中使用了 internal 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38417942/

相关文章:

c# - 如果发生硬件故障 : ( int i = 0; i ! = n;++i ) 或 ( int i = 0; i < n;++i ),哪个更有可能失败?

c# - 如何在 C# 中通过 ref 传递它?

python - python中的类继承

python - 使用 Python 装饰器为方法添加方法

oop - Matlab 代理类问题。 (关于 : dependent properties)

c# - 如何在 C# 中将实例变量视为另一种类型的实例

c# - 如何使用 UserManager 在 IdentityUser 上加载导航属性

c# - 使用套接字时发送当前值的 Unity 延迟

.net - MSMQ中是否有类似JMS Topic的等效功能?

c# - 如何使用反射在运行时构建此 c# "Expression"?