初学C#,大家多多帮助,谢谢!
一段代码:
//cards为一个Card类型的数组。
cards = new Card[52];
            for (int suitVal = 0; suitVal < 4; ++suitVal)
            {
                for (int rankVal = 1; rankVal < 14; ++rankVal)
                {
                    cards[suitVal * 13 + rankVal - 1] = new Card((Suit)suitVal ,
 (Rank)rankVal);
                }
            }
请问cards = new Card[52],这句会为这个数组分配内存吗?另外,cards[suitVal]
= new Card(),这句又会吗?我觉得两者都会,但是如果两者都会,是不是就意味
着开辟了两份内存?有没有什么办法尽开辟一份?谢谢!

解决方案 »

  1.   

    1声明一个数组并不代表已经建立了它.在C#中,所有的数组元素都是对象,这就是为什么每元素要NEW的原因
      

  2.   

    cards = new Card[52],这句会为这个数组分配内存
    用new就会分配内存
      

  3.   

    也就是说:Card[] newDeck = new Card[52] 不会分配内存?仅仅是一个声明?
    如果是:Card[] newDeck = new Card[52] {  } ;这样才会分配内存?谢谢!
      

  4.   

    cards = new Card[52];
    这句是根据Card是class或struct分配52*4或52*sizeof(Card)的内存(不分栈还是堆)
    实际在.Net中,一个class对象的引用和一个struct对象占多少内存,鬼才知道(肯定一个指针不是4,而且"特性"会把这个数值搞得乱七八糟)
    cards[suitVal * 13 + rankVal - 1] = new Card((Suit)suitVal ,
     (Rank)rankVal);
    不会分配内存(不过不是绝对,如果用抬杠的方式去谈论的话,那个所谓的Runtime不可能不存在不在堆中分配的可能)
    struct的new和class的new有一个区别,就是,class的new会为这个obj分配一段内存空间,然后初始化这个类中的字段,但struct只是初始化这个类中的字段
    比如,如果一个class重载了new,并用malloc后调用初始化函数,class是这样运行的,但struct不是,它是在栈上分配了他未被重载的sizeof的空间,然后直接调用初始化函数
    对于C#中的struct的new,微软说的很明确了,这个语法只是初始化struct,(联机说明中有,原文是什么我记不清了);