string 值类型还是引用类型?
2011-03-21 15:42
381 查看
大家先来看一下下面的代码吧!
using System;
using System.Collections.Generic;
public class MyClass
{
{
string s="abc";
string a=s;
s="def";
Console.WriteLine("{0},{1}",a,s);
}
}
输出的是abc,def
我们都知道数组是引用类型的,请看一下段代码:
using System;
class MyClass
{
static void Main()
{
int [] Arr1={1,2,3,4,5};
int [] Arr2=Arr1;
Arr1[1] =200;
foreach (int i in Arr2)
Console.WriteLine(i);
}
}
我们都知道值类型如果附值的时候,是把自己的一个副本附给另一个变量,之后它们互不影响。而引用类型则是把它在堆栈中的地址复制一份给另一个变量,它们的指向仍是一样的,所以当对一个变量进行操作的时候会影响到另外一个变量,所以上例中Arr2[1]=200而不是2。所以我们可以暂且认为string是值类型。
下面的一段代码再一次说明了它具有值类型的特征。
using System;
class MyClass
{
static void M(string s)
{
s="abcd";
}
static void Main()
{
string s="efgh";
M(s);
Console.WriteLine(s);
}
}
但实际上string是引用类型的(sorry,我水平有限,没办法证明),引用一下MSDN上的话:“String 对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。看来似乎修改了 String 对象的方法实际上是返回一个包含修改内容的新 String 对象。”
大家看了这句话是不是有种恍然大悟的感觉了?让我把它说的更通俗点吧“重新赋值,就是在堆中重新分一块内存给它放新的值即重新NEW了一个对象,而不是覆盖原先的值是.而原先的值将等着CG来回收。”
那如果你想定义经常变的字符串,用string类的话,如果CG不能够及时回收,那不是很占用内存吗?
所以MS推荐了另一个类:System.Text.StringBuilder 类.
具有值类型特征的操作
string有两种情况下的操作是具有值类型特征的:
<!--[if !supportLists]-->1) <!--[endif]-->在函数中传递string(比如函数参数是string型)时,传递的是地址,但却不能修改成员变量,原因是它重新又创建了一个全新的对象,和它想修改的那个成员变量非同一地址,所以看上去像是值类型;
<!--[if !supportLists]-->2) <!--[endif]-->str1 == str2 ,仅仅是比较了值,而非地址(是MS重写了==运算符所致).
总结:
string 到底是引用类型还是值类型 答:引用类型 . 只不过它在某此操作上会表现出值类型的特征.
string类型的另外一个特殊性在于它是“不会变”的,每次操作string,都相当于新建了一个string对象.
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
using System;
using System.Collections.Generic;
public class MyClass
{
{
string s="abc";
string a=s;
s="def";
Console.WriteLine("{0},{1}",a,s);
}
}
输出的是abc,def
我们都知道数组是引用类型的,请看一下段代码:
using System;
class MyClass
{
static void Main()
{
int [] Arr1={1,2,3,4,5};
int [] Arr2=Arr1;
Arr1[1] =200;
foreach (int i in Arr2)
Console.WriteLine(i);
}
}
我们都知道值类型如果附值的时候,是把自己的一个副本附给另一个变量,之后它们互不影响。而引用类型则是把它在堆栈中的地址复制一份给另一个变量,它们的指向仍是一样的,所以当对一个变量进行操作的时候会影响到另外一个变量,所以上例中Arr2[1]=200而不是2。所以我们可以暂且认为string是值类型。
下面的一段代码再一次说明了它具有值类型的特征。
using System;
class MyClass
{
static void M(string s)
{
s="abcd";
}
static void Main()
{
string s="efgh";
M(s);
Console.WriteLine(s);
}
}
但实际上string是引用类型的(sorry,我水平有限,没办法证明),引用一下MSDN上的话:“String 对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。看来似乎修改了 String 对象的方法实际上是返回一个包含修改内容的新 String 对象。”
大家看了这句话是不是有种恍然大悟的感觉了?让我把它说的更通俗点吧“重新赋值,就是在堆中重新分一块内存给它放新的值即重新NEW了一个对象,而不是覆盖原先的值是.而原先的值将等着CG来回收。”
那如果你想定义经常变的字符串,用string类的话,如果CG不能够及时回收,那不是很占用内存吗?
所以MS推荐了另一个类:System.Text.StringBuilder 类.
具有值类型特征的操作
string有两种情况下的操作是具有值类型特征的:
<!--[if !supportLists]-->1) <!--[endif]-->在函数中传递string(比如函数参数是string型)时,传递的是地址,但却不能修改成员变量,原因是它重新又创建了一个全新的对象,和它想修改的那个成员变量非同一地址,所以看上去像是值类型;
<!--[if !supportLists]-->2) <!--[endif]-->str1 == str2 ,仅仅是比较了值,而非地址(是MS重写了==运算符所致).
总结:
string 到底是引用类型还是值类型 答:引用类型 . 只不过它在某此操作上会表现出值类型的特征.
string类型的另外一个特殊性在于它是“不会变”的,每次操作string,都相当于新建了一个string对象.
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
相关文章推荐
- string 值类型还是引用类型
- string 值类型还是引用类型?
- 值类型与引用类型(特殊的string) Typeof和GetType() 静态和非静态使用 参数传递 相关知识
- String到底是值类型还是引用类型(C#)
- String是原始数据类型还是引用数据类型
- String为值类型还是引用类型
- net中String是引用类型还是值类型
- string 是值类型,还是引用类型(.net)[转]
- 对于string是值类型还是引用类型的思考
- string 是值类型,还是引用类型(.net)
- 关于string是值类型还是引用类型
- C#(也适用其他)的初学者对string是值类型还是引用类型搞不清楚,还有对参数传递也比较迷糊
- 关于string是值类型还是引用类型- -
- [自学问题总结]net中String是引用类型还是值类型
- String是值类型还是引用类型(C#)
- Net中String是引用类型还是值类型
- String 是值类型还是引用类型
- C#学习第八天 值类型和引用类型、字符串类String
- String是值类型还是引用类型(C#)
- net中String是引用类型还是值类型