# C#
###### tags : `暑假`
## 環境建置
- Visual Studio 2022
- .NET桌面開發
--------
## code
### 輸入
- ```System.Console.ReadLine();``` :
- int : ```int num = System.Convert.ToInt32(System.Console.ReadLine());``` (超麻煩)
- char : ```char x = (char)Console.Read();```
- string : ```string name = System.Console.ReadLine();```
### 輸出
- ```System.Console.WriteLine``` : (輸出且換行)
```System.Console.Write``` : (輸出但不換行)
- int : ```System.Console.WriteLine(123);```
- char : ```System.Console.WriteLine('a');```
- string : ```System.Console.WriteLine("Hello World");```
### string
- string 函式(string x = "riku", string y = "weized")
- ```x.Length``` : 輸出字串長度
- ```x.ToUpper()``` : 轉大寫
- ```x.ToLower()``` : 轉小寫
- ```x.Contains(y)``` : 判斷x裡有沒有y,會回傳bool值
- ```x[0]``` : 回傳x第0位置字元(即r)
- ```x.IndexOf('char'/"string")``` : 尋找char/string在x的第幾位,若找不到則回傳-1
- ```x.Substring(0, 2)``` : 將x第0個字元前(包含)的字元刪除,保留第0個字元後的2個字元(即ik)
### num
- num運算
- ```System.Console.WriteLine(5 +-*/ 2)``` : 四則運算
- ```System.Math.Abs(-10)``` : 絕對值
- ```System.Math.Pow(2, 2)``` : 次方
- ```System.Math.Sqrt(36)``` : 開根號
- ```System.Math.Max(36, 2)``` : 找最大
- ```System.Math.Min(36, 2)``` : 找最小
- ```System.Math.Round(36.3)``` : 四捨五入
### Array
- array宣告
- ```int[] scores = {50, 60, 70, 30, 20, 90};```
- ```string[] name = new string[10];```(10為陣列大小)
-
```
///二維陣列
int[,] nums =
{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};///nums[0,0] == 1
int[,] num = new int[3,4](3, 4為陣列大小)
```
### if判斷式
```
if(condition)
{
....
}
else if(condition)
{
....
}
else
{
....
}
```
### while
```
while(condition)
{
...
}
```
### for
```
for(int i = 0; i < 10; i++)
{
...
}
```
### class
- 創建class

(さかまた:))

```
class Person
{
public double height;
public int age;
public string name;
}
```
```
Person person1 = new Person(); ///person1是一個object
person1.height = 170.5;
preson1.age = 44;
```
- namespace(class 空間)
- 可以將class分類整理好
```
///class.cs
namespace Animal
{
class Ant
{
public double height;
public int age;
public string name;
}
class Elephant
{
...
}
...
}
```
```
///main.cs
using Animal; ///不加分號的話,必須在class名稱前加上namespace的名稱
///例えば : Animal.Ant.ant1 = new Animal.Ant();
Ant ant1 = new Ant();
ant1.height = 178.6;
ant1.age = 20;
```
:::info
System.Console.WriteLine 也可以忽略System,但要加上using System
(自己試過好像不用加using System也行)
:::
- class 函式
```
/// class.cs
class Ant
{
public double height;
public int age;
public string name;
public void sayname()
{
Console.WriteLine("I'm " + name);
}
}
```
```
///main.cs
Ant ant1 = new Ant();
ant1.name = "riku";
ant1.height = 178.6;
ant1.age = 20;
ant1.sayname(); /// output : I'm riku
```
- constructor(可將多個同類型的彙整起來, main看起來比較乾淨)
```
/// class.cs
class Person
{
public double height;
public int age;
public string name;
public Person(double height, int age, string name)
{
this.height = height;
this.age = age;
this.name = name;
}
}
```
```
///main.cs
Person person1 = new Person(178.6, 20, "riku");
Person person2 = new Person(5, 3, "fff");
Console.WriteLine(person1.height);
...
```
- getter setter
```
///class.cs
class Video
{
public string title;
public string author;
private string type;
public Video(string title, string author, string type)
{
this.title = title;
this.author = author;
Type = type;
}
public string Type
{
get { return type; }
set
{
if (value == "教育" || value == "娛樂" || value == "音樂")
type = value;
else
type = "其他";
}
}
}
```
```
///main.cs
Video video1 = new Video("他", "我", "2");
Console.WriteLine(video1.Type);
///output : 其他
```
這裡是將class裡的type設為private,限制獲取type的地方,若要在class以外的地方獲取type則需要使用get(所以main裡只能呼叫viedo1.Type)
若沒有get函式,則無法獲取type,且這個狀態下的type是only write
```
///main.cs
Video video1 = new Video("他", "我", "教育");
video1.Type = "5";
Console.WriteLine(video1.Type);
///output : 其他
```
若沒有set函式,則無法再額外賦值,也就是這個狀態下的type是only read,
而set也可以將值限制在自己需要的範圍內