值类型
int salaryliuhuan = 7000;
//文杰
int salarywenjie = salaryliuhuan;
Console.WriteLine("去年刘欢的薪资:{0}\t文杰的薪资{1}",salaryliuhuan,salarywenjie);
//文杰的薪资改变了
Console.WriteLine("========我是高贵的分割线,谁敢搞我?????===========================");
salarywenjie = 7001;
Console.WriteLine("今年刘欢的薪资:{0}\t文杰的薪资{1}", salaryliuhuan, salarywenjie);
//z所有的值类型的值都保存在栈中,栈是:先进后出 按顺序排列
//新创建一个值类型会重新创建一个栈,当salarywenjie的栈改变时,并不会影响salaryliuhuan的栈
//所以改变salarywenjie的值,salaryliuhuan的值并不会改变
应用类型
//薪资 奖金
int[] moneyliuhuan = {7000,5000 };
//文杰
int[] moneywenjie = moneyliuhuan;
Console.WriteLine("去年刘欢的薪资:{0}\t文杰的薪资{1}", moneyliuhuan[0], moneywenjie[0]); //7000 7000
//文杰的薪资改变了
Console.WriteLine("========我是高贵的分割线,谁敢搞我?????===========================");
//moneywenjie=new int[]{7001,5001};重新创建的一个堆.改变的只是moneywenjie的堆,而moneyliuhuan的堆没有改变,重新new所以不会传递
moneywenjie[0] = 7001;//二者共用一个堆,所以改变moneywenjie的堆,两者的实际值都会改变
moneywenjie[1] = 5001;
Console.WriteLine("今年刘欢的薪资:{0}\t文杰的薪资{1}", moneyliuhuan[0], moneywenjie[0]);//7000 7001
//引用类型的值保存在堆中,堆是无序排列的,当新建一个堆,会有一个存储地址保存在栈中,如果又创建一个应用类型,如果将前者赋值给后者
//那么,将会把前者的存储位置付给后者,两者用的是同一个堆,当改变前者的值后者也会改变
//如果想要正确的把前者的赋值需要利用循环对数组进行复制
//首先,创建两个数组,前者先给上初始值,后者只给长度
//然后用for循环复制
/*
for(int i=0;i<后者.length;i++)
{
前者[i]=后者[i]
}
*/
结构体
//1.结构体是值类型
//2.结构体可以不new直接使用,但是是有条件的
//3.不能对结构体中的成员变量赋初值
//4.声明结构的对象后,必须对结构的成员赋初值
public struct Student
{
public int age;
public void Say()
{
Console.WriteLine("Say");
}
static void Main(string[] args)
{
//设置控制台字体颜色 前景色
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.Yellow;
//不new 就能用是有条件的, 必须是公有的成员变量,不能是私有再封装的
Student stu;
stu.age = 20;
stu.Say();
Console.ReadKey();
}
构造函数
public class Employee
{
//类中有构造吗?
//解析:只有定义了一个类,默认系统自动在底层补全一个无参构造
//1.名称和类名相同 2 。没有返回值类型,甚至连void都不能
public Employee(string name)
{
}
public Employee()
{
}
}
class Program
{
static void Main(string[] args)
{
//Cat cat = new Cat(2, "皮皮");
//Cat cat2 = new Cat();
//cat2.Age = 2;
//cat2.Name = "皮皮";
}
}