Array.Initialize - 为什么这个方法存在?

Mat*_*ero 24 .net c# arrays

我今天偶然发现了一种方法.我在谈论:Array.Initialize().

根据文件:

此方法旨在帮助编译器支持值类型数组; 大多数用户不需要这种方法.

该方法如何负责使编译器支持值类型?至于我关心这个方法只是:

通过调用值类型的默认构造函数来初始化value-type Array的每个元素.

另外,为什么公开?我不认为自己需要调用此方法,编译器在创建时已经初始化了数组,因此手动调用此方法将是多余的,无用的.

即使我的意图是重置数组的值,我仍然不会调用它,我会创建一个新的.array = new int[].

因此,似乎这种方法仅仅是为了编译器而存在.为什么是这样?谁能给我一些更多细节?

Jon*_*nna 12

值得注意的是,.NET的规则与C#的规则不同.

我们可以在.NET中做一些我们在C#中无法做到的事情,通常是因为代码不可验证(ref例如返回类型),或者因为它们可能引入一些混淆.

在C#struct中,不能有一个已定义的无参数构造函数,并且调用new SomeValueType()通过创建零填充的内存部分来工作(所有字段因此0用于数字类型,null用于引用类型,并且对于其他值类型再次使用相同规则的结果).

在.NET中,您可以在值类型上使用无参数构造函数.

这样做可能是一个坏主意.一方面,当它被称为关于刚刚的规则,只是当值的内存是零填充,并在不同的情况下,在分配会发生什么并不完全简单的(如new SomeValueType()将其称之为但new T()在一个通用的方法,其中TSomeValueType意志不!).如果结果new SomeValueType()总是零填充,则生活更简单.这无疑影响了C#的设计,即使.NET确实如此.

出于这个原因,Array.Initialize()对于用C#编写的任何类型的新数组都没有意义,因为调用构造函数和零填充是一回事.

但是出于同样的原因,一个类型可能用另一种.NET语言编写(至少,你可以在CIL中编写),它确实有一个实际上有效的无参数构造函数.由于这个原因,这种语言的编译器可能希望它等效new SomeValueType[3]于在数组中的所有类型上调用该构造函数.因此,在框架中使用允许完成此类填充的方法是明智的,以便这种语言的编译器可以使用它.

另外,为什么公开?

因此,即使在安全限制阻止它调用另一个程序集的私有方法的上下文中,也可以通过这种假设构造函数生成的代码调用它.