面向對象:封裝、繼承、多態。
類有:屬性+方法
# 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();
}
}
```

但下述代碼則會提示錯誤:
```
class Program
{
static void Main()
{
int i;
console.writeline(i); // 提示錯誤
}
}
```
CS0165 C# Use of unassigned local variable 'i'

## 枚舉
限定用戶權限的時候一般可以用枚舉。
`enum`
[enum 參考](https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/keywords/enum)
它用于聲明一組命名的常數,當一個變量有幾種可能的取值時,可以將它定義為枚舉類型。???
有點類似于數據驗證,防止我們在寫代碼的時候輸入錯誤。
```
public enum MM
{
cs = 1, //用逗號,不是分號
c = 2,
java = 3 //最后一個不用加分號
}
```
則我們在寫后續的定義的時候,會自動跳出讓我們輸入相關項,以防輸入錯誤。

此時輸出的是字段名。如果要輸出值,則可以在前面加(int)強制類型轉換。

```
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);
}
```

##
屬性特點
- 封裝字段,將類中的字段與屬性綁定;
- 避免非法數據的訪問,如年齡age = -2;
- 保證數據完整性。

### 屬性常用錯誤
1. 與枚舉結合:需要寫成枚舉的形式,而不能直接寫成字符串形式。


# 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;
}
```

此時可以在有參構造函數前面多寫一句 public student(){} 即可。

## 私有構造函數

```
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();
}
}
```
輸入時就顯示背景為綠色。

## 析構函數

# 4、訪問權限
public; private; protected; internal
# 5、類的靜態成員
不同類中對同一個變量進行操作
c#(二)課時 12
如果是 Student中的 static 靜態變量 Name,則在其他類中,直接用`Student.Name`調用即可。
> 靜態類或者靜態變量可以理解為全局變量,也就是所有其他類可以直接共用的變量,就把它設置為靜態變量。

- 幫助文檔 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互相轉化