多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
面向对象:封装、继承、多态。 类有:属性+方法 # 1、字段 ## 变量、常量 # 2、类 类中有属性、对象以及方法。 > 如下,在类中创建了属性以后比如 enum 属性GG(属性的识别符号是get、set),需要再创建一个对象Program pro = new Program(); 然后对象就可以直接pro.GG 直接调用其中的值。 > c#会将类中的变量初始化值,默认为0,但不会自动将main()方法(或其他方法)局部变量初始化值: ``` class Program { static int i; //这里的static 必须写 static void Main() { console.writeline(i); // 输出的结果为0 console.readline(); } } ``` ![](https://ws4.sinaimg.cn/large/006tKfTcly1frhvkqruf8j30aa05lglu.jpg) 但下述代码则会提示错误: ``` class Program { static void Main() { int i; console.writeline(i); // 提示错误 } } ``` CS0165 C# Use of unassigned local variable 'i' ![](https://ws2.sinaimg.cn/large/006tKfTcly1frhvluxv4vj30gg0akt9t.jpg) ## 枚举 限定用户权限的时候一般可以用枚举。 `enum` [enum 参考](https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/keywords/enum) 它用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。??? 有点类似于数据验证,防止我们在写代码的时候输入错误。 ``` public enum MM { cs = 1, //用逗号,不是分号 c = 2, java = 3 //最后一个不用加分号 } ``` 则我们在写后续的定义的时候,会自动跳出让我们输入相关项,以防输入错误。 ![](https://ws3.sinaimg.cn/large/006tKfTcgy1frhvyw1bbpj30dm093t96.jpg) 此时输出的是字段名。如果要输出值,则可以在前面加(int)强制类型转换。 ![](https://ws4.sinaimg.cn/large/006tKfTcgy1frhw1gqobwj309i089jrn.jpg) ``` public enum MM { cs = 1, //用逗号隔开 c = 2, java = 3 } static void Main() { console.writeline((int)MM.c); } ``` > 如果不对cs c java这三个变量赋初始值,则默认从0开始递增1。也就是,如果我们输入public enum MM{c, cs, java} 那么consolewriteline(MM.java)的时候,将输出2。 # 2、属性——可用于控制非法数据的输入 ## 基本用法 有时候需要对数据进行保护,则需要用到属性。 用 get+set 实现逻辑验证。 比如如果定义public int age, 用户在其他 class 中调用 age 并赋值为-2,是没问题的,但与我们的设想不同,因为年龄无负数。这时候用类的属性来。 **等于说,是在私有的 对象age 跟实际对象 stu中,用一个 Age 属性过渡,stu先调用的是 Age 属性,再通过 Age 对 age 进行最终赋值。所以应该写为stu.Age,而不是stu.age** 一般写法 ``` get { return age;} set { age = value;} ``` ``` class Student() private int age; //先私有化,以防止被变更。 public int Age //再公开,与上面相同类型,可对其进行调用。 { get { return age; } set { if (value > 0 && value <100) //value 为隐含变量,意思就是用户输入的这个数 { age = value; } else { age = 18; } } } class Program() static void Main() { stu.Age = -2; //注意这里是大写的属性。此时如果再写-2,那么会显示18。 console.writeline(stu.age); } ``` ![](https://ws3.sinaimg.cn/large/006tKfTcgy1frhx9tho4nj30gp080t9h.jpg) ## 属性特点 - 封装字段,将类中的字段与属性绑定; - 避免非法数据的访问,如年龄age = -2; - 保证数据完整性。 ![](https://ws3.sinaimg.cn/large/006tKfTcgy1frhx9ymjr9j30hc06zgm3.jpg) ### 属性常用错误 1. 与枚举结合:需要写成枚举的形式,而不能直接写成字符串形式。 ![](https://ws1.sinaimg.cn/large/006tKfTcgy1frhxqmldxoj30dz06o0tm.jpg) ![](https://ws2.sinaimg.cn/large/006tKfTcgy1frhxy3bmjbj30g206xt9j.jpg) # 3、构造函数 默认与类名相同的名称 ## 有参构造函数 可以初始化变量值。需要先定义相关的属性以后,再定义有参构造函数。 ``` class student { //对属性进行初始化(get; set) private name; public Name { get { return name; } set { name = value; } } private age; public Age { get { return age; } set { age = value; } } //构造函数对变量值进行初始化(构造函数名称默认与类名相同) public Student(string name, int age) { Name = name; Age = age; } } Student st1 = new Student("old wang", 21); //这时候就可以直接用有参构造函数来对其进行初始化。 console.writeline(st1.Name); ``` > 注意,如果上述已经使用了有参构造函数,则Student st1 = new Student(); 会提示错误,因为需要在括号里面直接初始化。 > CS7036 C# There is no argument given that corresponds to the required formal parameter 'name' of 或者也可以写成: ``` string name, int age; public Student(string name, int age) { this.name = name; //因为事先定义了 name 和 age 两个变量,所以这里直接用 this 来调用类中的变量即可 this.age = age; } ``` ![](https://ws3.sinaimg.cn/large/006tKfTcgy1frhz6a6hixj30h00c0myk.jpg) 此时可以在有参构造函数前面多写一句 public student(){} 即可。 ![](https://ws3.sinaimg.cn/large/006tKfTcgy1frhz8sdebij30fh04djrp.jpg) ## 私有构造函数 ![](https://ws2.sinaimg.cn/large/006tKfTcgy1frhzegtoj4j30io0910tu.jpg) ``` private Student(){} //静态方法 public static Student Create() //公共静态方法:student下面的create方法 { return new Student(); } public Student(string name, int age) //上一个例子 { Name = name; Age = age; } //在其他class中调用时: Student st 2 = Student.Create; //就可以直接调用了。 ``` ## 静态构造函数 加static即可。 - 静态构造函数只执行一次;避免重复执行。 - 前面不能加public 之类的访问修饰符; - 不能带任何参数,一个类只能有一个静态构造函数,只能访问类的静态成员(加static的成员),不能访问实例成员(不加static的成员)。 比如:要判断今天是星期几,如果是工作日,则控制台背景色为红色,如果是周末,则控制台背景色为绿色:只在引用类之前执行一次,不需要再多执行。 ``` class UI { static UI() { DateTime date = DateTime.Now;//先获取当前星期 if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday) { Console.BackgroundColor = ConsoleColor.Green; } else { Console.BackgroundColor = ConsoleColor.Red; } } } class Program { static void Main() { UI ui = new UI(); Console.ReadLine(); } } ``` 输入时就显示背景为绿色。 ![](https://ws4.sinaimg.cn/large/006tKfTcgy1frhzyd8cq4j308605ogls.jpg) ## 析构函数 ![](https://ws1.sinaimg.cn/large/006tKfTcgy1fri0c0yxddj30fo06mq3d.jpg) # 4、访问权限 public; private; protected; internal # 5、类的静态成员 不同类中对同一个变量进行操作 c#(二)课时 12 如果是 Student中的 static 静态变量 Name,则在其他类中,直接用`Student.Name`调用即可。 > 静态类或者静态变量可以理解为全局变量,也就是所有其他类可以直接共用的变量,就把它设置为静态变量。 ![](https://box.kancloud.cn/d18c983e06ab290c7fbda05224eaf577_709x381.png)