1、数据类型分类:值类型与引用类型
值类型:简单类型(int,short,long,float,byte,double,char,decimal(16字节的小数));结构类型,枚举类型;
引用类型:数组类型,类类型,字符串,接口,指针类型
2、值类型:派生自System.ValueType.在存储在栈上;
引用类型:直接从System.Object继承,被分配在堆上,变量保存的是实例数据的内存地址。
区别:1)、值类型在栈上,引用类型存储在堆上(地址存储在栈上)。
2)、值类型由操作系统管理,引用类型的管理由垃圾回收器管理。
3)、引用类型可以派生出新的类型,而值类型不能。
4)、比较两个值类型时,比较的是内容;比较两个引用类型时,进行的是引用比较(也就是是否指向的同一个空间)。
5)、值类型在内存管理方面具有更好的效率,并且不支持多态,适合用作存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。
6)、引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
3、装箱与拆箱
public static void Main()
{
int i=9;
object o = i;//装箱:值类型 --> 引用类型
Console.WriteLine (o);
int j = (int)o;//拆箱:引用类型 --> 值类型
Console.WriteLine (j);
}
11、string类型
string为引用类型,但是它比较特殊。具有不变性,一旦被赋值,则不可更改。
更改后是直接重新申请一个空间,改变指向。
public static void Main()
{
string oldStr="old string";
ChangeStr (oldStr);
Console.WriteLine ("调用之后的值为:{0}", oldStr);
}
public static void ChangeStr(string newStr)
{
newStr = "new string";
Console.WriteLine ("方法中的值为:{0}", newStr);
}
输出结果:方法中的值为:new string
调用之后的值为:old string
4、ref与out
ref 把值类型按引用类型传递,形参和实参前都需要加ref关键字。
out 把值类型按引用类型传递,形参和实参前都需要加out关键字。
区别:out:(出)实参可以不初始化,但必须在方法内修改形参的值。
ref:(引用)实参必须初始化,但形参可以没有值。
5、引用类型按值传递,通过形参可以改变实参的值 void f(Point p);
引用类型按引用传递,通过形参可以改变实参的值 void f(ref Point p);
值类型按值传递,通过形参不可以改变实参的值 void f(int i);
值类型按引用传递,通过形参可以改变实参的值 void f(ref int i);
值类型:简单类型(int,short,long,float,byte,double,char,decimal(16字节的小数));结构类型,枚举类型;
引用类型:数组类型,类类型,字符串,接口,指针类型
2、值类型:派生自System.ValueType.在存储在栈上;
引用类型:直接从System.Object继承,被分配在堆上,变量保存的是实例数据的内存地址。
区别:1)、值类型在栈上,引用类型存储在堆上(地址存储在栈上)。
2)、值类型由操作系统管理,引用类型的管理由垃圾回收器管理。
3)、引用类型可以派生出新的类型,而值类型不能。
4)、比较两个值类型时,比较的是内容;比较两个引用类型时,进行的是引用比较(也就是是否指向的同一个空间)。
5)、值类型在内存管理方面具有更好的效率,并且不支持多态,适合用作存储数据的载体;引用类型支持多态,适合用于定义应用程序的行为。
6)、引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
3、装箱与拆箱
public static void Main()
{
int i=9;
object o = i;//装箱:值类型 --> 引用类型
Console.WriteLine (o);
int j = (int)o;//拆箱:引用类型 --> 值类型
Console.WriteLine (j);
}
11、string类型
string为引用类型,但是它比较特殊。具有不变性,一旦被赋值,则不可更改。
更改后是直接重新申请一个空间,改变指向。
public static void Main()
{
string oldStr="old string";
ChangeStr (oldStr);
Console.WriteLine ("调用之后的值为:{0}", oldStr);
}
public static void ChangeStr(string newStr)
{
newStr = "new string";
Console.WriteLine ("方法中的值为:{0}", newStr);
}
输出结果:方法中的值为:new string
调用之后的值为:old string
4、ref与out
ref 把值类型按引用类型传递,形参和实参前都需要加ref关键字。
out 把值类型按引用类型传递,形参和实参前都需要加out关键字。
区别:out:(出)实参可以不初始化,但必须在方法内修改形参的值。
ref:(引用)实参必须初始化,但形参可以没有值。
5、引用类型按值传递,通过形参可以改变实参的值 void f(Point p);
引用类型按引用传递,通过形参可以改变实参的值 void f(ref Point p);
值类型按值传递,通过形参不可以改变实参的值 void f(int i);
值类型按引用传递,通过形参可以改变实参的值 void f(ref int i);