数据类型的区别
值类型: byte,short,int,long,float,double,decimal(小数),char,bool和struct(结构体)
引用类型:string(特殊的引用类型),数组和对象(类)
声明后的区别
值类型:变量声明后,不管是否已经赋值,编译器为其分配内存,这个内存空间对应着该值类型变量,空间里存储的就是该变量的值。
引用类型:变量声明后,并没有为其分配内存空间。
赋值时的区别
值类型:赋值时,传递副本(给备份)
引用类型:赋值时,传递地址(给地址)
文字概念的理解
好比“值类型是现金,引用类型是存折”
就是说:值类型就是要用直接用;引用类型是要用还得先去银行取现。
代码执行时 两者的区别
值类型[以int数值调换举例]:
-
效果图片
值类型传递的是副本,调换时 换的是副本,所以再输出的值就还是一样的数 -
代码
static void Main(string[] args)
{
//值类型int的调换 → 调用方法
int num1 = 50, num2 = 20;
Console.WriteLine("两数分别为:{0} {1}",num1 , num2);
Console.Write("调换后的数字分别为:");
change_int(num1, num2);
Console.WriteLine("再次输出:{0} {1}", num1, num2);
}
//方法
public static void change_int(int a, int b)
{
int empty = a;
a = b;
b = empty;
Console.WriteLine("{0} {1}", a, b);
}
引用类型[以数组值翻倍举例]:
-
运行效果图片
引用类型传递的是地址,翻倍时改变了原本的值,所以再输次出时数值就发生了改变 -
代码
static void Main(string[] args)
{
//引用类型数组的翻倍 → 调用方法
int[] n = {1,2,3,4,5};
Console.WriteLine("数组值分别为:");
for (int i = 0; i < n.Length; i++)
{
Console.Write(n[i] + " ");
}
Double(n);
Console.WriteLine("\n再次输出:");
for (int i = 0; i < n.Length;i++ )
{
Console.Write(n[i]+" ");
}
Console.WriteLine();
}
//方法
public static void Double(string a, string b)
{
for (int i = 0; i < n.Length; i++)
{
n[i] *= 2;
}
Console.WriteLine("\n调用方法翻倍输出:");
for (int i = 0; i < n.Length; i++)
{
Console.Write(n[i] + " ");
}
}
特殊引用类型[String]:
-
运行效果图片
特殊的点在于,当把string变量传给一个方法,在方法中改变string的值,却不会影响外面的string的值; 但对于一般的引用类型,其值会变化;string 类型的用法比较像值类型
[至于为什么会这样子,emmm我也不太清楚,懂的小伙伴可以在评论区留言噢~] -
代码
static void Main(string[] args)
{
//特殊引用类型String的调换 → 调用方法
String stra = "灰碟碟",strb = "佳碟碟";
Console.WriteLine("两字符串分别为:{0} {1}", stra, strb);
Console.Write("调换后的字符分别为:");
change_str(stra, strb);
Console.WriteLine("再次输出:{0} {1}", stra, strb);
}
//方法
public static void change_str(string a, string b)
{
string empty = a;
a = b;
b = empty;
Console.WriteLine("{0} {1}", a, b);
}
总结 [值类型与引用类型的区别]:
- 值类型传递副本,引用类型传递地址;
- 值类型声明后会分配内存空间,而引用类型的不会分配内存空间;
- String是特殊的引用类型,用法有点像值类型,但它是引用类型。
温馨提示:
喜欢灰碟分享的小伙伴不要忘记关注噢~这样子,想找我时就不会迷路啦*
联系方式:
Vx+:LHD7575