[菜鸟原创] 值类型-引用类型-string
大狗狗 2008-11-20 10:08:05 本人系C#初学者,贴上个人学习所思,与大家共享。欢迎批抨指正!
作者:win32fan(QQ184263203)
值类型与引用类型的本质区别是什么?
值类型是基本的数据类型,包括简单数据类型如int 、char等,或是由它们组合起来的结构。
引用类型在数据结构上包含值类型及其它引用类型。但引用类型的本质不是用来描述数据,而是用来描述操作数据的方法。我认为这才是值类型和引用类型的本质所在:
值类型用来描述数据,引用类型用来描述操作数据的方法。
有了这个理论前题,就不难理解:
int i=8;
int j=i;
i和j表示不同的两个数据.
class A;
A a=new A();
A b=a;
a和b所指同一个"方法"
怪物: string
C#声明string是引用类型,但有菜鸟却不能理解下面代码:
class Program
{
static void StringCon(string str)
{
str="New String";
}
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
// TODO: Implement Functionality Here
string oldstr ="str";
Console.WriteLine("before:{0}",oldstr );
StringCon(oldstr );
Console.WriteLine("after:{0}",oldstr );
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
输出:before:str
after:str
也就是"没有引用类型的应该有的表现"。这是为什么了?
其实,这是菜鸟对程序阅读理解有误(当然也和string的特殊性有关)。引用类型本应都使用new操作符来创建新的实例。但考虑到 string类型 的使用较频繁,为了简化代码书写,C#特许string使用"="来创建实例。因此:
str="New String";
其实是:str=new string("New String");
菜鸟们看到了"="号,误将其当作值类型的赋值操作符,其实这个"="是用来创建新实例的。
最后,为什么C#要将string划作引用类型呢?我想这是因为string具有length属性、具有CopyTo、InDexOf等一系列需要用到的方法。虽然它具有值类型一些特点,但根据前面所讲值类型及引用类型本质区别,C#还是将其放入了引用类型中。与之相反的是结构,结构也可以包含方法,但本质上结构主要是用来描述数据的,因而被放到了值类型中。