面向对象:封装、继承、多态。
类有:属性+方法
# 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)
- 帮助文档 microsoft helo viewer
- c#开发环境及visual studio安装注意事项
- c#程序基本结构-基本语法
- Q1: public static void main(String[] args) 是什么意思
- Q2: c#命名空间+Main方法
- Q3:注释+命名规则+代码规则
- Q4: c#语句 system => console
- Q5: 数据类型 .net
- Q5: 常用名字、变量、运算符
- Q6: 对话窗输入-属性
- Q7: 递归
- Q8:决策分支、条件判断语句 if 语句
- Q9:数组
- Q10:字符串
- Q11:对象、类、访问权限、静态动态函数
- Q12:方法及参数——继承于类
- Q13:构造函数
- Q14:继承——base 关键字
- Q15:多态、虚方法、接口
- Q16:创建窗体应用、控件
- Q17:Ado数据访问、连接 sqlserver 数据库
- Q18: 读取数据command + DataRead( )、DataSet + DateAdapter
- Q19: Entity Framwork、entity 与 ADO.net的区别
- Q20: 对话框、文件、文件夹
- Q21: 导入excel数据、更新到 dbo 数据库中
- Q26: 获取 excel 中每个 sheet 的表名
- Q22: 两个窗体之间数据+方法传递
- Q23: 数学对象
- Q24: c#网站编写
- Q25: visual studio2017如何查看帮助
- Q27: c# dictionary 字典对象
- Q28: 数组与dataTable互相转化