转换-值类型-引用类型-预定义分类表
转换
C#里,兼容的实例间可以进行相互转换
转换总是从一个值转换成一个新的值
隐式转换:隐式转换是自动发生的
显式转换:显式转换是手动操作的
长整型转换成整型的时候可能会导致数据丢失,所以要用显示转换
如果编译器断定转换不能成功的化两种转换都是会被禁止的
static void Main(string[] args)
{
int i = 3;
long a = i;//因为int是整型,long是长整型,已经包括了int的情况下直接隐式转换
short b = (short)i;//由于short比long的范围小,所以i前面需要指定short,显示转换
}
值类型和引用类型
值类型包含了所有的内置类型:数值,字符,bool,自定义的结构体struct,枚举neum
引用类型包括所有的class,数组,委托delegate,接口interface,string字符串。
两种的根本区别在于处理内存的方式
这个是值类型的结构图
用public struct 创建一个自定义的值类型,类型名point
创一个新的p1点,赋值,赋值又赋值给p2,在这个内存里发生了复制,此时打印都是7
再重新赋值给p1,赋值的地址与复制的内存地址不同了,所以p2也不会再发生变化了
引用类型赋值:给引用类型的变量赋值,复制引用,而不是复制实例
所以这种情况下允许多个变量引用同一个对象,值类型就不行。
static void Main()
{
Ask p1 = new Ask();
p1.x = 9;
Ask p2 = p1;//p2=9,复制了p1的引用,
p1.x = 10;//此时改变了p1对象的值,然后p2也是同一个对象
System.Console.WriteLine(p2.x);//所以这里p2也等于10
}
public class Ask
{
public int x;
public int y;
}
这个是引用类型的结构图
null
可以把null赋值给引用,表示引用不指向任何一个对象
Ask p = null;
System.Console.WriteLine(p == null);
普通的值类型不可以为null,编译不通过
值类型:
意思就是用的类型最大存储为多少,它占用的就为多少
引用类型:
内置类型分类
特殊例子:
string虽然是引用类型,但是string具有不可变性
例子:
string s1 = "张三"; string s2 = s1; s2 = "李四"; Console.WriteLine(s1) Console.WriteLine(s2);
结果:s1=张三 s2=李四 string虽然为引用类型,但是string具有不可变性