我一直在尝试了解internal
关键字以及何时需要使用它。幸运的是,今天,当我在乔恩·斯基特(Jon Skeet)的书《C#In Depth,第三版》中介绍如何实现迭代器时,在第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
会引起问题,而替换public
为可以解决问题internal
。
在深入探讨发布的代码之前,您可以查看.Net C#中有关访问修饰符的MSDN链接。
想法仍然是,当我们希望仅在内部访问某些内容时,我们会将其内部化assembly (mostly dll)
。它似乎与相似public
,但是用法却有很大不同,因为public
它可以从任何地方对所有调用者进行开放访问。
在代码示例中,internal的用法具有不同的观点,这更多是IterationSampleIterator
通过构造构造函数来控制类的对象internal
,因此只能从自己的程序集中的调用者实例化此类,而从外部的任何其他调用者均可实例化此类。无法做到。
对于程序集之外的所有用户,他们只能调用诸如like之类的方法Current
或诸如like之类的方法,MoveNext
并且Reset
要与内部实现一起使用,不能直接访问该对象。
通常,在组装中有某些类在内部使用并因此公开包装功能的情况下就是这种情况。我认为System.IO
是公开此类的程序集之一,可以在程序集边界内使用
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句