gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:51:38 25 4
gpt4 key购买 nike

我一直在努力理解 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com