string a="abc" 和 string a = new string("abc") 什么关系?
string a="abc" a是引用类型? "abc" 又是什么类型? "abc" 存放在哪里? 呵呵 请各位大神 指教了
string a="abc" a是引用类型? "abc" 又是什么类型? "abc" 存放在哪里? 呵呵 请各位大神 指教了
解决方案 »
- 正则提取网页指定标签内容
- 求助:关于DispatcherTimer停止的同时,触发其他方法的做法
- 大热天,跪谢,急救:C# Scoket文件传输的问题
- 怎样将一个类似10101100这样的字符串转为Color类型
- 在VS2005中,在属性器前加 [DataMember]是什么意思?有什么作用?
- 问一个关于dataset所连接的数据库表的问题,怎么使用数据库表的一个属性ROWS.Count
- .net下泛型 Dao的配置问题
- vb.net 调用C# 类库问题
- CodeGen 代码生成器
- 帮忙看看:IPHostEntry
- .net中当关闭子窗体后怎样关闭父窗体
- c# 传字符串到 标准dll 程序退出时崩溃
1、string a="abc"与string a("abc")是等价的,会导致a调用string的构造函数建立对象。
string a = new string("abc"),意思是先构造一个对象,然后创建一个string的引用,再把引用初始化。
从用法上来讲是一样的,没区别。2“abc” 是一个常量,编译后放在程序的常量存储区里面,
string a="abc"; 即采用这个常量作为参数,构造一个string对象,由a引用
参考:
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
汗! 上一个引用错了
好像有点感觉了~ a 放在那里 a里存放的是什么 abc” 是一个常量,编译后放在程序的常量存储区里面, 常量存储区时在栈中吗? string a="abc"; 是在声明变量时 就已经实例化的a 即执行了 new string
自己找找资料吧
new 关键字产生的对象放在堆区,如string a = "abc" 中的a;"abc"存入常量区
a里面存放什么需要看系统中string类的实现
string a = "abc";
执行顺序如下:
1、从常量存储区提取字符串“abc”
2、使用string的构造函数,以“abc”为参数实例化对象;
3、定义一个引用a
4、a引用初始化,指向新生成的对象
string a="abc" string对象存在栈区 自动释放内存
string a = new string("abc") 对象存在堆区,需要托管代码帮助释放内存
1就是int的一个实例一样
左边的a是一个变量,分配在栈上
string a="abc" 将堆里的abc对象的引用赋给a,如果abc已在字符池中分配过,则不重新分配
string a = new string("abc") 也是将a指向abc,不同的是,总是重新分配新的字符串abcString.IsInterned
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";搞个没完。