C# 如何在没有初始化为null或0的对象的情况下创建数组?

C# 如何在没有初始化为null或0的对象的情况下创建数组?,c#,.net,C#,.net,用0值初始化缓冲区。因为它是一个缓冲区,我不需要任何初始化,在C中是否可能像在C中一样 我认为这是不可能的。。。即使不运行构造函数: 由于该对象的新实例被初始化为零,并且没有运行任何构造函数,因此该对象可能不表示该对象认为有效的状态 请注意,如果您想要非托管(从非GC管理的操作系统中获取的内存),可以在不将其归零的情况下进行分配,但它不会是一个字节[]用随机数填充它,或者使用Win32 API中的DllImport和VirtualAlloc C中的一种方法是在unsafe上下文中使用marsha

用0值初始化缓冲区。因为它是一个缓冲区,我不需要任何初始化,在C中是否可能像在C中一样

我认为这是不可能的。。。即使不运行构造函数:

由于该对象的新实例被初始化为零,并且没有运行任何构造函数,因此该对象可能不表示该对象认为有效的状态


请注意,如果您想要非托管(从非GC管理的操作系统中获取的内存),可以在不将其归零的情况下进行分配,但它不会是一个
字节[]

用随机数填充它,或者使用Win32 API中的
DllImport
VirtualAlloc

C中的一种方法是在
unsafe
上下文中使用
marshall.AllocHGlobal

byte[] buffer = new byte[500000];
不安全
{
var ptr=Marshal.AllocHGlobal(50000*sizeof(int));
int*值=(int*)ptr;
//列出未初始化的整数
对于(int i=0;i<50000;i++)
Console.WriteLine(值[i]);
弗里赫全球元帅(ptr);
}

我不需要任何初始化这意味着什么,您希望
缓冲区
null
0
byte
的默认值,您实际希望发生什么情况?@YuvalItzchakov他想要一个未初始化的数组。。。因此,一个数组填充了内存区域中存在的任何东西。。。(就像C
malloc
)我认为这是不可能的。只是好奇为什么它很重要?如果缓冲区中还没有有意义的数据,那么它是全零还是随机字节又有什么区别呢?我发现:IntPtr buffer=Marshal.AllocHGlobal(500000);在.NET中初始化2D数组时,我发现了一个问题,指出了“保留”内存和“提交”内存之间的一些差异,而不是避免初始化,也许您应该看看如何使用“我刚才发现的问题”重用缓冲区。看见你认为这会扩展到常规的一维阵列吗?@Asad是的,刚刚检查过。。。但是,如果您想在初始化内存之前使用不安全的代码来访问它,我认为它不起作用:-)我认为是操作系统在被请求时分配内存(并清理内存),而不是.NET.Right,因此这意味着OP不必担心用大数组支付初始化成本(至少在Windows.NET虚拟机上)。这是我能想到的OP想要这样做的唯一原因。@Asad我不确定这一点…有可能GC不会将不再使用的内存块返回给操作系统…它可能会保留它们,因此第一个初始化是基于操作系统的,而下一个初始化是CLR完成的。From:在指定进程的虚拟地址空间。除非使用MEM_RESET,否则该函数将其分配的内存初始化为零。对于MEM_RESET:表示lpAddress和dwSize指定的内存范围内的数据不再受关注。因此不能在第一次调用时使用它。好的,alloc unini有
GlobalAlloc+GlobalLock
tialized内存。它可以用作“随机”的源内存。我怀疑作者想从其他进程捕获RAM中的值……甚至还有
HeapAlloc
来做这件事。注意方法页面中的警告:它公开了应用程序不应该使用的LocalAlloc。它也比堆分配方法慢。事实上,OP可能应该使用它来分配可重用的缓冲区rom是一个初始内存块,而不是分配新的缓冲区,即使它们没有初始化
unsafe
{
    var ptr = Marshal.AllocHGlobal(50000 * sizeof(int));
    int* values = (int*)ptr;

    // lists uninitialized ints
    for (int i = 0; i < 50000; i++)
        Console.WriteLine(values[i]);

    Marshal.FreeHGlobal(ptr);
}