c#面向?qū)ο?1--值類型和引用類型/序列化和反序列化

值類型和引用類型

值類型: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改變;


這樣可以看到內(nèi)存里面的東西

1.棧中地址 2.堆中地址(棧中地址不同,堆中地址相同)
注意!這里的輸出是“張三 李四”--面試官必問系列

原因:字符串具有不可變性(每次重新賦值都會(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; }

    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容