C#基础复习笔记 目录一、第一天1、访问修饰符2、类3、命名规则4、变量在内存中的分布1、值类型2、引用类型二、第二天1、结构体2、枚举3、常用数据类型转换三、第三天一、第一天1、访问修饰符publicinternalprotectedprivatepublic:公开的所有都可以访问internal:内部的当前项目内可以访问protected:受保护的只在类的内部及该类的子类可以访问private:私有的只在类的内部可以访问2、类类的成员包含字段(静态、非静态)、属性(静态、非静态)、方法(静态、非静态)、常量等internal class People { public string sex;//字段 public int age;//字段 public int Height { get; set; }//属性 public string Name { get; set; }//属性 private int weight; public int Weight //属性 { get { return weight; } set { weight value; } } public void Study() //方法 { MessageBox.Show(正在学习中...); } public static void Meth2() //静态方法 { } public readonly string position 地球; //只读字段 public static bool alive true;//静态字段 public const int VALUE 1; //常量 public static int Value2 { get; set; } //静态属性 }3、命名规则字段Camel骆驼命名法首单词小写其余每个单词首字母大写属性、方法Pascal命名法每个单词首字母都要大写常量每个字母大写4、变量在内存中的分布C#中的变量分为两类1、值类型值类型变量内存分布在栈上存储的是值注意并不是所有值类型都存储在栈上当在方法内部定义的局部变量才存在栈上当作为类的字段存在的值类型跟着类的实例对象一起存在堆上People people1 new People(); people1.Name 张三; people1.age 18; people1.sex 男;这些对象的属性,虽然是值类型但跟着对象存储在堆上2、引用类型引用类型的对象分配上堆上引用类型变量本身分配在栈上存储的是对象在堆内存上的地址People people1 new People(); people1.Name 张三; people1.age 18; people1.sex 男; People people2 new People(); people2.Name 李四; people2 people1; MessageBox.Show(people2.Name);people2 people1; 这句代码会把people1存储的堆内存地址复制给people2效果如下此时people2与people1指向的是堆上的同一块内存因此people2.Name 是张三二、第二天1、结构体结构体是值类型内部可以有字段、属性、方法等与类相似但也有区别// summary /// 结构体是值类型存储一般都是一些简单的数据类型当我们想做一些轻量化的运算操作 /// /summary struct Teacher { int age; string name; public int MyProperty { get; set; } public void Meth() { } }与类的区别1类要使用必须通过new关键字实例化结构体可new也可直接使用2类是引用类型存储在堆上结构体是值类型存储在栈上对结构体中的数据赋值就理解成对普通数据类型的赋值操作都是在栈内存中3类的赋值是把堆内存地址复制过去结构体只是把值内容复制过去Teacher teacher1 new Teacher(); teacher1.age 20; teacher1.name 李四; Teacher teacher2; teacher2 teacher1; teacher1.name 赵六; MessageBox.Show(teacher2.name);teacher2 teacher1 ;这句代码会把teacher1在栈上的值复制给teacher2,然后再改变teacher1在栈上的值与teacher2无关4类中可以有构造器结构体中不能有构造器(5)类可以继承类结构体不允许继承类但可实现接口struct Teacher:ISleep { public int age; public string name; public int MyProperty { get; set; } public void Meth() { } } interface ISleep { }2、枚举与类、结构体、接口等是同一级别1枚举的定义namespace ClassLearn { internal enum MyDirection { Left 2, Top 4, Right 8, Bottom 100 } }2枚举的使用internal class People { public MyDirection Dir { get; set; } }People people1 new People(); people1.Dir MyDirection.Left; MessageBox.Show(people1.Dir.ToString()); int a (int)people1.Dir;//把枚举类型转换成对应的值 MessageBox.Show(a.ToString()); Type t typeof(MyDirection);//获取类型方法1 Type t2 Type.GetType(ClassLearn.MyDirection);//获取类型方法2 Type t3 people1.Dir.GetType();//获取类型方法3 string s Enum.GetName(t3, 100);//通过值拿到枚举对应的字符串 MessageBox.Show(s); MyDirection b (MyDirection)Enum.Parse(t3, Left);//通过字符串拿到对应的枚举类型 if(b MyDirection.Left) MessageBox.Show(true);运行结果3、常用数据类型转换4、图片资源的运用1本地导入图片缺点图片会嵌入exe文件中Debug中的.exe文件会随着图片越多越来越大当0张图片时当1张图片时当2张图片时2后端加载图片//方式1绝对路径 pictureBox1.Image Image.FromFile(D:\\Projects\\Python学习\\CSharpLearn\\ClassLearn\\bin\\Debug\\beautiful.jpg); //方式2 string imagePath AppDomain.CurrentDomain.BaseDirectory beautiful.jpg; string path Path.Combine(AppDomain.CurrentDomain.BaseDirectory, beautiful.jpg); pictureBox1.Image Image.FromFile(path); pictureBox1.SizeMode PictureBoxSizeMode.StretchImage;3从资源中加载图片三、第三天1、委托2、事件3、泛型