我一直在尝试了解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
而导致的问题。
答案 0 :(得分:3)
在深入了解发布的代码之前,您可以查看.Net C#中访问修饰符的MSDN Link。
当我们希望仅在assembly (mostly dll)
内访问时,我们仍然会在内部创建内容。它似乎与public
类似,但使用情况完全不同,因为对于public
,它可以从任何地方对所有呼叫者进行开放访问。
在代码示例中,internal的用法有不同的透视图,这更多是通过构造函数IterationSampleIterator
来控制internal
类的对象,所以这个类只能从中实例化在自己的程序集中的调用者,但来自外部的任何其他调用者都无法做到。
对于程序集之外的所有用户,他们只能调用Current
之类的属性或MoveNext
和Reset
之类的方法来处理内部实现,而不是直接访问该对象。
通常情况下,在程序集内部存在某些内部使用的类,从而暴露包装的功能。我认为System.IO
是暴露这些类的程序集之一,可以在程序集边界内使用
答案 1 :(得分:2)
不是“public
可能导致问题通过将public
替换为internal
”来解决。这不是解决问题。这是关于项目或图书馆的设计。
如果对类(或其成员)使用internal
修饰符,则该类(或成员)只能在同一个程序集中访问,而不能从其他程序集中访问。
假设您正在设计一个dll库,并且您有一个类要在其他类的dll中使用,但是您不希望将此类公开给您的dll用户。如果您使用public
,则用户将能够查看和使用该课程。但是如果您使用internal
,那么用户将无法查看或使用该类,但您的所有其他类仍然可以使用它。