值类型:int double char decimal bool enum struct --->存储在栈中
(值类型在复制的时候传递的是这个值得本身)
字符串string 有不可变性,每次变化都在内存中开辟一个新的空间。
static void Main(string[] args)
{
string s1 = "张三";
string s2 = s1;
s2 = "李四";
Console.WriteLine(s1);
Console.WriteLine(s2);
Console.ReadKey();
}
引用类型:string 数组 自定义类 集合 object 接口--->存储在堆中
(引用类型在复制的时候,传递的是对这个对象的引用)
ref:能够把一个变量以参数的形式带到一个方法中进行改变,再将改变的值返回
class Program
{
static void Main(string[] args)
{
int n = 10;
Test(ref n);
Console.WriteLine(n);
Console.ReadKey();
}
public static void Test(ref int number)
{
number += 10;
}
}
方法中本来是没有返回值的,加了ref后number和n变成同一块内存空间(值传递改变为引用传递)
序列化:就是将对象转换为二进制
反序列化:就是将二进制转换为对象
作用:传输数据。
序列化步骤
1)、将这个类标记为可以被序列化的。在类的前面加上 [Serializable] --->指示一个类可以被序列化
例:将一个对象传递给对方的电脑(序列化) 对方电脑读取传递过来的对象(反序列化)
第一步:写一个类 在类的前面加上 [Serializable] 表示可以被序列化
//先写一个类,在类的前面加上一个 [Serializable]
[Serializable]
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
}
第二步:创建对象,序列化对象
static void Main(string[] args)
{
Person p = new Person();
p.Age = 20;
p.Name = "张三";
p.Gender = '男';
using (FileStream fsWrite = new FileStream(@"C:\Users\pzy\Desktop\123.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fsWrite, p);//序列化对象P 并写入 123.txt 文档中
}
Console.WriteLine("OK了");
Console.ReadKey();
}
第三步:将123.txt 中的内容进行反序列化,还原对象 p
static void Main(string[] args)
{
Person p;
using (FileStream fsRead = new FileStream(@"C:\Users\pzy\Desktop\123.txt", FileMode.OpenOrCreate, FileAccess.Read))
{
BinaryFormatter bf = new BinaryFormatter();
p=(Person)bf.Deserialize(fsRead);
}
Console.WriteLine(p.Age);
Console.WriteLine(p.Name);
Console.WriteLine(p.Gender);
Console.ReadKey();
}