c#实例化多个对象

时间:2015-04-15 14:37:23

标签: c# .net arrays

所以我想实例化一大块对象以获得一些速度,而不是使用new关键字创建每个项目。例如。在c ++中,您将使用以下代码:

ListViewItem[] items = new ListViewItem[1000];

但我无法理解如何在c#中做到这一点。如果我执行上面的代码,我只需要1000个指针。(我猜因为它们是空的)

我的目标是避免不得不拨打新的1000次

编辑: 用c ++制作了一个测试程序,试图用c#来展示我想要实现的目标。

#include "stdafx.h"
#include <vector>
#include <string>
#include <time.h>
#include <iostream>
using namespace std;

class A
{
public:
    A()
    {
        m_pVector = NULL;
    }
    void setVector(vector<string>* pVector)
    {
        m_pVector = pVector;
    }
    void deleteVector()
    {
        vector<string>* temp = m_pVector;
        m_pVector = NULL;
        delete temp;
    }
private:
    vector<string>* m_pVector;
};
int _tmain(int argc, _TCHAR* argv[])
{
    int size = 100000;
    A* A1s = new A[size]();
    A* A2s = new A[size]();

    long int start1=0;
    long int diff1=0;
    long int start2=0;
    long int diff2=0;

    vector<string>* mVectors = NULL;

    for(int c1=0;c1<10;c1++)
    {
        if(c1>0)
        {
            vector<string>* temp1 = mVectors;
            mVectors = NULL;
            delete[] temp1;
            for(int i=0;i<size;i++)
            {
                A2s[i].deleteVector();
            }
        }

        start1 = clock();
        mVectors = new vector<string>[size]();
        for(int i=0;i<size;i++)
        {
            A1s[i].setVector(&mVectors[i]);
        }
        diff1 = clock() - start1;

        start2 = clock();
        for(int i=0;i<size;i++)
        {
            A2s[i].setVector(new vector<string>());
        }
        diff2 = clock() - start2;

        cout<<"1:"<<diff1<<" 2:"<<diff2<<" diff:"<<diff2-diff1<<endl;
    }
    cin.get();
}

因此,创建一个数据块比在每个循环中创建新数据更快。 我想在c#中做同样的事情,但我无法弄清楚如何创建数据块。

1 个答案:

答案 0 :(得分:1)

实际上在这个C ++代码中:

ListViewItem[] items = new ListViewItem[1000];

对象构造函数(初始化)将被调用1000次。 就是这样,有一个隐藏的循环。

唯一的优点是内存分配只进行一次。

  • 1分配。
  • n初始化。

C#中没有相同的东西。分配和初始化一起完成,一次完成一个对象,并在您致电new时完成。

你坚持:

  • 1分配。
  • 1初始化。
  • 重复。

所以使用for-loop来实现它,它是实现它的标准方法:

var items = new ListViewItem[1000];
for (var i = 0; i < items.Length; i++)
{
    items[i] = new ListViewItem();
}

您也可以使用linq给您的伴侣留下深刻印象:

var array = new object[1000];
Enumerable.Range(0, array.Length).Select(i => array[i] = new object());