本帖最后由 fatjay2046 于 2013-08-08 02:08:14 编辑

解决方案 »

  1.   

    很快你就习惯了,这还不算什么,如果你看到struct的话你更吐血,struct即使是new出来的也是分配在栈里,
      

  2.   

    不就是多写一个new吗?还要纠缠什么内存分配?那纯粹是c++程序员“没事找事”的习惯。对于c#来说,不用纠缠底层。对象的实现方式可能会发生变化,例如.net1.0跟.net2.0就不一样,同样是基于.net4.0的程序在不同体系结构的机器上编译出来的就不一样。同一个类库源代码,你既可能用在windows 8里边,也可能用在Android里边,重新编译出来的结果就不一样(例如后者可能其实是跨进程地与对等创建的java对象互操作)。经常纠缠什么内存分配,貌似你好像是编译器设计者似地,其实是长年累月只会死抠几行代码而缺乏大系统设计经验的表现。
      

  3.   


    你说的struct new我没有什么不理解的啊。struct是值语义啊。 
    但是对于对象 ,
    我可不可以不管地址,堆啊,堆栈什么的。我可否假定对象变量本身保存的就是一个对象了。
    如果有=我就认为这个对象值被几个对象变量共享了。这样可以吗?如果是string的值语义的对象。
    我就认为是和基本变量一样 有了一份完整的拷贝。
    如果涉及多态 我就认为 基类对象变量和子类对象变量共享一个对象值,但是他们的方法会不同。
    基类对象会调用子类的一些重载的方法。
    总之我不想内存图。直接(故意误认为)对象变量就是保存对象的东西这样到底可以吗?
      

  4.   

    string[] strs =new str[2];跟 string str[2];只是语法规定上的区别,你应该习惯于别的语言语法规定,就好像一个男人应该习惯于别人比自己长得白净一些。你竟然一下子画蛇添足地去杜撰出什么“内存分配”上的区别,这样的c++程序员怎么能不让人怜悯?
      

  5.   

    我十分同意你的看法,事实上我现在的情况是无法找到一个模型来达到你说的这种不纠缠底层的效果。我现在是这样想的 
      不知你是否同意不?  对于对象 ,
     我可不可以不管地址,堆啊,堆栈什么的。我可否假定对象变量本身保存的就是一个对象了。
     如果有=我就认为这个对象值被几个对象变量共享了。这样可以吗?如果是string的值语义的对象。
     我就认为是和基本变量一样 有了一份完整的拷贝。
     如果涉及多态 我就认为 基类对象变量和子类对象变量共享一个对象值,但是他们的方法会不同。
     基类对象会调用子类的一些重载的方法。
     总之我不想内存图。直接(故意误认为)对象变量就是保存对象的东西这样到底可以吗? 
      

  6.   

    实际上string的内存分配比你想象的还复杂一点,CLR只为相同值的string存储唯一的拷贝。CLR via C#写的很清楚。没什么不好理解的,反观C++,你觉得它简单是因为你根本没有掌握它,C++的内存分配是多种多样极其复杂的。
      

  7.   

    在C#中所有的对象与结构都要使用 new 进行内存分配。在C#中 string[] strs =new str[2] 完全等效于 string str[2];如果C#中定义:string[] strs,意味着只定义了一个名称为 strs 的空指针,它不指向任何的实体,更没有为之分配内存。这个是C#语法定义的,记牢所有实体对象,包括结构,都需要使用 new 进行实体内存分配。
      

  8.   

    写法不同怎么会乱?不会的,就像中国人说同一件事可以用不同文字表达一样,意思没什么区别。
    看VB和C#等一样读得顺畅,因为了解缘故。
      

  9.   

    参考:http://www.cnblogs.com/zhili/archive/2013/06/11/ParameterPass.html
      

  10.   

    lz只是比较适合学c++而已,c++这类语言才会把机器的需求当做自己的需求
    而后面的语言更愿意贴近人而非靠近机器。如果在这里久了你就知道,这边的人喜欢自然语言,喜欢哲学,喜欢抽象,喜欢策略...这类靠近人这边的东西而c++版滴才喜欢去讲内存,指针,位操作,高低字节这类和机器相关的东西
      

  11.   

    确实是同一个拷贝,这和string的深比较行为是一致的吧
      

  12.   

    其实你那些代码中c++版本的机理更复杂,在c++中,"12345"只是一个const char *的指针,而str[0] = "12345";这句其实是调用了string::operator=的方法,把"12345"这些数据复制了一遍,c#应该简单一些,"12345"本身就是一个string对象,str[0] = "12345";只是个简单的指针赋值,
      

  13.   

    你的确是想多了,了解C#的基本内存分配就可以了,你要要是纠结每个变量的内存分配,自找烦恼~~C#里面注意变量的生存周期就可以了~~CG会自动释放不用的资源~~就是你赋了null值,也要等CG来释放内存。
      

  14.   

    str[0]不是简单的指针赋值。str[0]会自己分配第二个"12345".
      

  15.   

    请问那该如何理解了?
    你这是瞎显摆你知道内存如何分配的,这里很多人都不知道,你说他们是不是准备抽你。我相信凡是学过c++的都会比我更懂内存分配。我只是很迷茫。
    BaseClass obj = new DerivedClass();...
    如果理解obj就是一个对象。那现在这个时候怎么理解?
      

  16.   

    请问那该如何理解了?
    你这是瞎显摆你知道内存如何分配的,这里很多人都不知道,你说他们是不是准备抽你。我相信凡是学过c++的都会比我更懂内存分配。我只是很迷茫。
    BaseClass obj = new DerivedClass();...
    如果理解obj就是一个对象。那现在这个时候怎么理解?
    我现在倒是怀疑你是不是学过C++了,难道C++里没有类似这样的语法么?子类是父类,这难道还要理解么?
      

  17.   

    好吧,说到怪,我反倒觉得 C++ 是 OO 中的奇葩,C++ 还可以多继承呢,照你这么说,那其他语言的程序员岂不是更要纠结了?
    C++ 中的 new 是专门为指针设计的,也就是说,你在 C++ 中看到 new,那一定是指针。有指针那就意味着“自己申请的内存自己管”,C# 的内存管理是 .NET 框架帮你维护的。C# 中的 new 也是开辟一块空间,也有指针,但是这个指针你看不见,也摸不着,对你来说是透明的,你只要知道指向这块内存块的一个变量就行了,所以本质上没啥区别,只是 C# 操作起来更方便了。让你不用管那些‘擦屁股’的事情。
      

  18.   

    http://www.cnblogs.com/zhili/archive/2013/06/11/ParameterPass.html