欢迎来到Cefler的博客😁
🕌博客主页:那个传说中的man的主页
🏠个人专栏:题目解析
🌎推荐文章:题目大解析2
目录
- 👉🏻类、对象、类成员简介
- 👉🏻语句详解
- foreach语句
- checked和unchecked语句
- 👉🏻字段、属性、索引器、常量
- ⭐️字段
- 只读字段(readonly)
- ⭐️ 属性
- 属性声明
- 实时动态计算
- 静态属性和实例属性
- 属性与字段的关系
👉🏻类、对象、类成员简介
对象
也叫实例,是类经过实例化后得到的内存中的实体
依照类,我们可以创建对象,这就是实例化
而使用new操作符
我们就可以创建类的实例
类的三大成员🚗
1.属性:存储数据,组合起来表示类或对象当前的状态
2.方法:由C语言中的函数进化而来,表示类或对象能做什么
3.事件:类或对象通知其它类或对象的机制,为c#所持有
重在属性的类:Entity Framework
重在方法的类:Math,Console
重在事件的类:Timer
静态成员和实例成员🚗
1.静态成员:在语义上表示它是类的成员
2.实例成员(非静态):语义上表示它是对象的成员
通俗来说,实例成员必须new出一个实例才存在,而静态成员无需new即可访问
c# 派生谱系
👉🏻语句详解
foreach语句
语法:
foreach(数据类型 变量名 in 数组名)
{
//语句块;
}
foreach 循环用于列举出集合中所有的元素,foreach 语句中的表达式由关键字 in 隔开的两个项组成。
in 右边的项是集合名,in 左边的项是变量名,用来存放该集合中的每个元素。
该循环的运行过程如下:每一次循环时,从集合中取出一个新的元素值。放到只读变量中去,如果括号中的整个表达式返回值为 true,foreach 块中的语句就能够执行。
一旦集合中的元素都已经被访问到,整个表达式的值为 false,控制流程就转入到 foreach 块后面的执行语句。
这里变量名的数据类型必须与数组的数据类型相兼容。
在 foreach 循环中,如果要输出数组中的元素,不需要使用数组中的下标,直接输出变量名即可。
foreach 语句仅能用于数组、字符串或集合类数据类型。
static void Main(){int[] arr = new int[5] { 1, 2, 3, 4, 5 };foreach(int input in arr){Console.WriteLine(input);}}
checked和unchecked语句
checked 和 unchecked 语句指定整型类型算术运算和转换的溢出检查上下文。 当发生整数算术溢出时,溢出检查上下文将定义发生的情况。 在已检查的上下文中,引发 System.OverflowException;如果在常数表达式中发生溢出,则会发生编译时错误。 在未检查的上下文中,会通过丢弃任何不适应目标类型的高序位来将操作结果截断。 例如,在加法示例中,它将从最大值包装到最小值。
详见:checked 和 unchecked 语句
👉🏻字段、属性、索引器、常量
⭐️字段
什么是字段?
- 字段(field)是一种表示与对象或类型(结构体与类)关联的变量
- 字段是类型的成员,旧称“成员变量”
- 与对象相关联的叫“实例字段”
- 与类型关联的字段称为“静态字段”,被static修饰
字段属于类,写在类里,语句写在函数里
class Fun{public int a;public static int b;//静态成员}
字段的声明
- 尽管字段声明带有封号,但它不是语句
- 字段的名字一定是名词
字段的初始值
- 无显示初始化时,字段获得其类型的默认值,所以字段“永远都不会被未初始化”
- 实例字段初始化时的时机——对象创建时
- 静态字段初始化的时机——类型被加载时
只读字段
- 实例只读字段
- 静态只读字段
静态字段/函数(被static修饰),实例对象无法访问到,要想访问到,只能通过类名.字段名/函数名才行
非静态字段/函数,实例对象可以访问到
📗在构造函数或非静态函数中引用当前类的非静态字段要用this
关键字,若是静态则就是类名.静态字段名
public int score;//非静态字段public static int amount;//静态字段public Student()//创建一个构造函数{Student.amount++;this.score++;}
这里总而言之:
类名能够访问的:静态字段/函数
实例对象能够访问的:非静态字段/函数
✏️用静态字段打印0~10
class Class1{static void Main(){for (int i = 0; i < 10; i++){Student stu = new Student();//实例化对象,每次实例化都会调用Student中的构造函数}Student.PrintAmount();}}class Student{public static int amount;public Student()//创建一个构造函数{Student.amount++;}public static void PrintAmount(){Console.WriteLine(Student.amount);}}
实例构造和静态构造的区别
无非就是构造函数的public和static的区别,但主要区别在于,实例构造每次调用类该构造函数都会被调用一次,但静态构造只被调用一次后就不会再被调用了,所以静态构造适合初始化一些数据,并且希望后期不会修改。
只读字段(readonly)
修饰词readonly
:当被其修饰后,字段只能被修改一次(即初始化),且只能在类中或构造函数中初始化
若在外界中初始化会报错。
⭐️ 属性
什么是属性?
- 属性(propety):是一种用于访问对象或类型的特征的成员,特征反映了状态
- 属性是字段的自然扩展
- 从命名上看,field更偏向于实例对象在内存当中的布局,而propety偏向于反映现实世界对象的特征
- 对外:暴露数据,数据可以是存储在字段里的,也可以是动态计算出来的
- 对内:保护字段不被非法值"污染"
- 属性是由Get/Set方法对进化而来
- 属性也是个语法糖:只是隐藏在背后
MyGet/Set👇🏻
class Class1{static void Main(){Student stu1 = new Student();stu1.SetAge(95);int s1 = stu1.GetAge();stu1.SetAge(98);int s2 = stu1.GetAge();stu1.SetAge(200);//这里肯定会异常int s3 = stu1.GetAge();Console.WriteLine("{0},{1},{2}", s1, s2, s3);}class Student{private int age;//private即私有化,只能在当前类中使用public int GetAge(){return this.age;}public void SetAge(int val){if(val>0&&val<124){this.age = val;}else{throw new Exception("GetAge fail,val err");//抛出异常}}}}
尝试用异常捕获优化上述代码
try{Student stu1 = new Student();stu1.SetAge(95);int s1 = stu1.GetAge();stu1.SetAge(98);int s2 = stu1.GetAge();stu1.SetAge(200);//这里肯定会异常int s3 = stu1.GetAge();Console.WriteLine("{0},{1},{2}", s1, s2, s3);}catch(Exception e){Console.WriteLine(e.Message);}
使用private修饰时,命名的规范一般是首写字母为小写。
官方的Get/Set👇🏻
class Class1{static void Main(){try{Student stu = new Student();stu.nald = 85;int s1 = stu.nald;Console.WriteLine(s1);}catch(Exception e){Console.WriteLine(e.Message);}}class Student{private int age;//private即私有化,只能在当前类中使用public int nald//属性,属性名随便改{get{return this.age;}set{if(value>=0&&value<=124)//value为特定的上下文关键字{this.age = value;}else{throw new Exception("age err");}}}}}
属性声明
权限 特性 数据类型 属性名
{get;set;
}
如果没有set,该属性就只能读不能改
属性快速声明:
1.vs软件内输 prop 连按2下tab键
public int MyProperty { get; set; }
- propfull 连按2下tab键
private int myVar;public int MyProperty{get { return myVar; }set { myVar = value; }}
3.ctrl+r+e:自动封装字段
实时动态计算
class Class1{static void Main(){Student stu = new Student();stu.Age = 24;Console.WriteLine(stu.CanWork);}class Student{private int age;public int Age{get { return age; }set { age = value; }}private bool canwork;public bool CanWork//实时动态计算{ //get { return canwork; }get{ if(this.age>=0&&this.age<=124){return true;}else{return false;}}}}}
静态属性和实例属性
也就是public和static的区别,静态属性反映当前类的状态,实例属性反映创建的实例对象的状态
属性与字段的关系
- 一般来说,它们都用于表示实体(对象或类)的状态
- 属性大多数情况下是字段的包装器(wrapper)
- 建议:永远使用属性(而不是字段)来暴露数据。即字段永远private或protected