string a="abc" 和  string a = new string("abc") 什么关系?
string a="abc" a是引用类型? "abc" 又是什么类型?  "abc" 存放在哪里? 呵呵 请各位大神 指教了  

解决方案 »

  1.   

    "abc"本身就是一个String类型的对象,string a="abc",a是一个引用,因为"abc"是对象所以可以用a来引用,
      

  2.   

    C#中  string类型 是引用类型
      

  3.   

    string是一个类,所以该类任何对象均为引用类型;
    1、string a="abc"与string a("abc")是等价的,会导致a调用string的构造函数建立对象。
       string a = new string("abc"),意思是先构造一个对象,然后创建一个string的引用,再把引用初始化。
    从用法上来讲是一样的,没区别。2“abc” 是一个常量,编译后放在程序的常量存储区里面,
    string a="abc"; 即采用这个常量作为参数,构造一个string对象,由a引用
      

  4.   

    不完全是 .net fw中 string 是个比较特殊的引用类型 关于介绍很多 你可以 google下.
    参考:
    A Reference Type always goes on the Heap .
    Value Types and Pointers always go where they were declared.(stack--->pointer-->heap)http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx
      

  5.   

     好像有点感觉了~ a 放在那里 a里存放的是什么  abc” 是一个常量,编译后放在程序的常量存储区里面, 常量存储区时在栈中吗? string a="abc"; 是在声明变量时 就已经实例化的a 即执行了 new string
      

  6.   


     汗! 上一个引用错了
     好像有点感觉了~ a 放在那里 a里存放的是什么 abc” 是一个常量,编译后放在程序的常量存储区里面, 常量存储区时在栈中吗? string a="abc"; 是在声明变量时 就已经实例化的a 即执行了 new string
      

  7.   

    程序存储区分为好几个:栈区、堆区、常量区、...
    自己找找资料吧
    new 关键字产生的对象放在堆区,如string a = "abc" 中的a;"abc"存入常量区
    a里面存放什么需要看系统中string类的实现
    string a = "abc";
    执行顺序如下:
    1、从常量存储区提取字符串“abc”
    2、使用string的构造函数,以“abc”为参数实例化对象;
    3、定义一个引用a
    4、a引用初始化,指向新生成的对象
      

  8.   

    忘记了一个重要区别:
    string a="abc" string对象存在栈区  自动释放内存
    string a = new string("abc") 对象存在堆区,需要托管代码帮助释放内存
      

  9.   

    string a = new string("abc") 错误,没有此构造函数"abc"就是string的一个实例就像
    1就是int的一个实例一样
      

  10.   

    "abc"是一个常量,分配在堆里的字符池里
    左边的a是一个变量,分配在栈上
    string a="abc" 将堆里的abc对象的引用赋给a,如果abc已在字符池中分配过,则不重新分配
    string a = new string("abc") 也是将a指向abc,不同的是,总是重新分配新的字符串abcString.IsInterned
      

  11.   

    C#中 string类型 是引用类型
      

  12.   

    唉。其实楼主疑惑是正常,因为这个string本来就是特殊的玩意,.net做了特殊处理。
    1 首先它是引用类型,为啥呢,因为他可以 == null
    2 其次它是“基本数据类型中唯一的引用类型”;
    3 当你声明了一个strings = "abc";它实际在堆里。而且似乎,你根本不可能改变这个
       字符串。 
       string s = "abc";
       s += "def";
       其实"abc"也在;"abcdef"也在。s其实变换了指引的内存地址。
    4 我觉得可以这样理解,为了更好地说清楚,我用C++语言描述。
       string s = "abc";等价于:
       static WCHAR temp_s[] = L"abc";
       WCHAR  * pS = &temp_s[0];
       
       s  += "def";等价于
       static WCHAR temp_s2[] = L"abcdef";
      pS = &temp_s2[0];
       所以,pS还是那个pS,但已经指到另一个地方了。而且是一个全局的地址。
    5 由于.net偷偷摸摸地处理。string的优点和缺点如下:
       (1)多个string时,内存利用率很高。因为如果字符串相同:string s = "abc"; string s2 = "abc";............
             其实只占用一个内存块。
       (2)stirng == 运算符效率非常高。可以看出里,人家不会象c++那样一个一个的比较。直接看下2个
            是不是指同一个地址就OK了。这个性能可不是盖的。
       (3)字符串连接性能差。你s += "def";等于重新开了存储区。就是这样。才有个StringBuilder 的SB
             提供给你。用来给你做高效的字符拼接处理。
    6 综上所述
       不要一句引用类型值类型就放过string,它还是很知道大家研究的。而且了解以上,你就知道程序中
       要如何处理string。至少我不会搞什么: string s; s+="def";搞个没完。