值類型和引用類型
值類型:int double char enum bool decimal struct
引用類型:string 數(shù)組 自定義類 集合 object 接口
存儲(chǔ)特點(diǎn):
值類型在棧上,引用類型在堆上
ref本質(zhì):將值傳遞改為引用傳遞
int n1 = 10;
int n2 =n1;
n2 =20
Console.WriteLine(n1);
Console.WriteLine(n2);
輸出結(jié)果:n1=10,n2=20
值類型在復(fù)制的時(shí)候,傳遞的是這個(gè)值的本身。
Person p1 = new Person(); //此處的Person是自定義類
p1.Name = "張三";
Person p2 =p1;
p2.Name = "李四";
Console.WriteLine(p1);
輸出結(jié)果:李四
Person p1 = new Person();
p1.Name = "zhangsan";
Person p2 = new Person();
p2.Name = "lisi";
p2 = p1;
Console.WriteLine(p1.Name);
輸出結(jié)果:zhangsan
(注意區(qū)分兩圖結(jié)果)
引用類型在復(fù)制的時(shí)候,傳遞的是對這個(gè)對象的引用,如下圖:
引用傳遞
1.new Person();這里會(huì)執(zhí)行在堆里面新開辟一塊區(qū)域;
2.Person p1 這里會(huì)執(zhí)行在棧里面開辟一塊區(qū)域p1;
3.Person p1 = new Person();這里的=會(huì)讓棧里p1新開的區(qū)域指向堆里面的 new Person();這里
4.Person p2 這里會(huì)執(zhí)行在棧里面開辟一塊區(qū)域p2;
5.Person p2 =p1;這里的=會(huì)讓棧里p2新開的區(qū)域指向堆里面的p1指向的new Person();這里
這里只是new Person();了一遍,因此
綜上所述,p1改變則p2改變,p2改變則p1改變;



原因:字符串具有不可變性(每次重新賦值都會(huì)開辟一塊新的空間)
輸出結(jié)果為10 原因:TestTwo方法沒有返回值
輸出結(jié)果為20 原因:ref可將number帶入并帶出
序列化和反序列化
序列化:將對象轉(zhuǎn)換為二進(jìn)制
反序列化:將二進(jìn)制轉(zhuǎn)換為對象
作用:傳輸數(shù)據(jù)
序列化注意一定要,將這個(gè)類標(biāo)記為可以被序列化的,即在類前面標(biāo)注[Serializable]
namespace 序列化和反序列化
{
class Program
{
static void Main(string[] args)
{
////將p這個(gè)對象傳輸給對方電腦
//Person p = new Person();
//p.Name = "張三";
//p.Sex = '男';
//p.Age = 18;
//using (FileStream fsWrite = new FileStream(@"C:\Users\songmin\Desktop\test.txt", FileMode.OpenOrCreate, FileAccess.Write))
//{
// //開始序列化對象
// BinaryFormatter bf = new BinaryFormatter();
// bf.Serialize(fsWrite, p);//2.Serialize會(huì)自動(dòng)把p寫回test.txt文檔中
//}
Person p;
using (FileStream fsRead = new FileStream(@"C:\Users\songmin\Desktop\test.txt", FileMode.Open, FileAccess.Read))
{
//接收對方發(fā)送過來的二進(jìn)制,反序列化成對象
BinaryFormatter bf = new BinaryFormatter();
p=(Person)bf.Deserialize(fsRead);
Console.WriteLine(p.Name);
Console.WriteLine(p.Sex);
Console.WriteLine(p.Age);
Console.ReadKey();
}
}
}
[Serializable] public class Person //1.這里要用Serializable標(biāo)記Person類,之后才可以對Person類序列化
{
private string _name;
public string Name { get => _name; set => _name = value; }
private char _sex;
public char Sex { get => _sex; set => _sex = value; }
private int age;
public int Age { get => age; set => age = value; }
}
}


