iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 2
0
自我挑戰組

C# 從入門到WebApi系列 第 2

[DAY2] 現在讓我們正式進入C#的世界吧

主架構介紹

讓我們打開我們昨天創建的MyFirstProgram
看看裡面的程式碼

using System;

namespace MyFirstProgram
{
    class Program
    {
        static void Main(string[] args){
            Console.WriteLine("Hello World!");
        }
    }
}

現在讓我們一行一行來看吧

using System;

這行所代表的意思是引用命名空間
下面所看見Console.WriteLine();
實際上全名為 System.Console.WriteLine();
由於在這邊引用了System 所以就不用每次調用這個方法的時候都打落落長的一串了

namespace MyFirstProgram
//namespace 命名空間名稱
//{
//    你的程式碼
//}

上方所提的命名空間(預設會跟你的專案名稱一樣),當然你也能改動他。
再來我們要寫的程式碼,都會被包在命名空間的大括弧下。
命名空間裡面可以有其他的命名空間(雖然很少這麼做)
還有一些class,interface,enum等等之後會介紹的結構(之後會介紹)

class Program 
//class 你的類別名稱
//{
//    你的程式碼
//}

這邊宣告一個class
一個class裡面可能會有很多Method,Property,field等等
(後面會深入講解)

static void Main(string[] args){
//   BLABLABLA 
}

這邊算今天的重點之一
static 指的是靜態的物件 他不需要被new 即可實例化
void 指的是不回傳任何值
string[] arg 代表這專案執行所帶的環境參數
(這邊看不懂可以先跳過 後面會介紹)

重點來了

這邊宣告了一個方法名稱Main()

程式的進入點為main

也就是在你按下執行之後你的程式將會從blabla開始執行
本篇文章的程式碼會先打在

Main(){
    //本文程式碼
}
Console.WriteLine(/*你想輸出的東西*/);

這行就是昨天在畫面上看見Hello World的關鍵
在括弧中輸入你想在小黑窗看見的東西
他就會出現


為什麼我在裡面輸入了文字 但是底下卻畫了錯誤
而且也執行不了呢
https://ithelp.ithome.com.tw/upload/images/20200902/20109549ossN5dzFpl.png

這是因為我打的文字屬於字串型態,所以需要用雙引號

" 來包住這串文字

紅色底線所代表的是編譯上的錯誤
也就是語法錯誤,是重大的錯誤
所以編譯器沒辦法讓你執行

我們重新加上雙引號執行
https://ithelp.ithome.com.tw/upload/images/20200902/20109549jUSTkHAWvD.png
就能看見沉重的我了

有關註解

在C#裡面我們用//來表示單行的註解 用/* 要註解的程式碼 */表示多行註解
註解的程式碼不會被執行
例如

    //Console.WriteLine("HelloWorld");
    /*
      Console.WriteLine("HelloWorld");
      Console.ReadLine();
    */

資料型別

在C#的世界裡 資料是有型別的(現實生活也是)
你不會對著一匹馬說他是一隻鹿
所以我們就來認識認識一些常用的資料型別

資料型別|中文|說明
----|----
bool |布林|值為true或是false
int|整數|值從-2147483648~+2147483647(int32)
long|長整數|值從負的2的64次方到正的2的64次方-1(int64)
float|浮點數|就是帶小數點的數字(±1.5 x 10^−45 到 ±3.4 x 10^38)
double|倍精確數|厲害一點的帶小數點的數字(±5.0 × 10^−324 至 ±1.7 × 10^308)
char|字元|Unicode 字元 像是'a','b','@','{','小'等等
string|字串|一串文字 實際上為字元陣列 像是 "小夫我要進來了", "大...大雄"

在知道了資料型別以後我們來宣告一個變數吧

在我們要指鹿為馬之前
要先定義什麼是馬
所以我們來宣告變數吧
語法會像:

資料型別 變數名稱

資料型別 變數名稱1,變數名稱2

int zero;//宣告一個整數 名稱叫做zero
int zero = 0;//宣告一個整數 名稱叫做zero 他的值為0
int zero,one;//宣告2個整數 名稱分別叫做zero,one
int zero=0,one=1;//宣告2個整數 名稱分別叫做zero,one zero的值為0 one的值是1
float f = 1.01;//宣告一個浮點數 名稱叫做f
string me = "帥哥";//宣告一個字串 名稱是me 值是帥哥 注意字串要加上"的符號
char alpha = 'a'; ////宣告一個字元 名稱是alpha 值是a 注意字元要加上'的符號

這邊的=符號跟數學上的=不同
指的是Assign(賦值)
也就是將等號右邊的值賦予給左邊
像是

int a;//宣告整數a
a = 0;//a現在是0
a = 3;//將3指派給a a現在是3

keyword

要注意的是變數名稱不能跟C#保留字相同
見連結 https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/keywords/

來點運算吧

這邊只介紹幾個常用的

算術運算子

加+
減-
乘*
除/
還有比較特殊的取餘數%

int a = 1+2 //3
int b = 2-1 //1
int c = 2*2 //4
int d = 9/3 //3
int e = 9%2 //1

在字串和字串中用+來連接字串(-*/%無法用在字串身上)

string me = "我";
string handsomeboy = "金城武本人"
Console.WriteLine(me + handsomebody);
//我金城武本人

關係運算子

回傳的通常是true 或 false 的bool
有 (==) 相等(1個等號不是等於,兩個總該是了吧)
(>=) 大於等於
(<=) 小於等於
(>) 大於
(<) 小於
(!=) 不等於

int a = 1,b = 1,c = 2
a==b //true
a<=b //true
a>=c //false
a!=c //true

邏輯運算子

符號 意義 用法
&& AND A&&B A跟B都成立時才為true
|| OR A||B A或B有一成立時為true
! NOT A為true 則 !A 為false ,反之亦然

流程控制

if/else

一個ifelse stament長得像
if(條件){
條件成立時執行這裡的程式碼
}else{
執行條件不成立的程式碼
}

int a = 10;
if(a>5)//10>5 true
{
    Console.WriteLine("成立了")
}else{
    Console.WriteLine("不成立")
}
//成立了

有多個條件的情況 使用else if

int a = 10;
if(a>10)
{
    Console.WriteLine("a大於10")
}else if(a<10 && a>5)
{
    Console.WriteLine("a大於5且小於10")
}else if(a>0 && a<=5)
{
    Console.WriteLine("a大於0且小於等於5")
}else
{
    Console.WriteLine("a小於等於0")
}
//a大於0且小於等於5

** 注意 若前面的else if條件成立就不會判斷後面的else if **

for 迴圈

for(初始值;終止條件;增加值){
//程式碼
}
在達成終止條件全會一值重複迴圈

for(int i = 0; i<10; i++)//i++ 就是 i=i+1 也就是把i+1的值賦予給i
{
    Console.WriteLine(i);
}
/*
0
1
2
3
4
5
6
7
8
9
*/

while迴圈

while(條件式){
//條件成立時執行程式碼
}

int a=10;
while(a>5){
    Console.WriteLine(a);
    a--; //跟++差不多意思 只是變成-1
}
//10
//9
//8
//7
//6

除非是有意的,不然我們應該盡量避免無窮迴圈發生

int a= 10;
while(a>5)//沒有對a做控制 a 永遠為10 10>5 為true 會不斷執行{}裡的程式碼
{
    Console.WriteLine(a);
}
/*
10
10
10
10
.
.
.
*/

do while

do{
你的程式碼
}while(條件式)

do while其實跟while迴圈很像
只不過不論條件成不成立 都會先執行一次程式碼

int a = 0;
do{
    Console.WriteLine(a);
    a++
}
while(a>5)//這時候a=1條件不成立 所以不會繼續印數字

//0

我想跳脫迴圈的控制

break; 語法能讓你跳脫當前的迴圈
continue; 能讓你略過這輪迴圈 進行下一輪

for(int i =1;i<=5;i++){
    if(i == 3)
    {
        break;
    }
    Console.WriteLine(i);
}
//1
//2
//i=3成立跳出迴圈 所以3.4.5都不會被印出來
for(int i =1;i<=5;i++){
   if(i == 3)
    {
        continue;
    }
   Console.WriteLine(i);
}
/*
1
2
4
5
*/

switch case

用法跟if else很像
當你的else if 很多的時候
請考慮使用switch case 以增加可讀性
switch(變數){
case 條件1:
do something;
break;
case 條件2:
do something1;
break;
default:
do something2;
break;
}
default 有點像else 條件都不成立的時候執行
其中若是少了break
當條件一成立時 不論條件2是否成立
do something2都會被執行
所以請記得要加

string a = "帥哥";
switch(a){
   case "惡魔貓男":
      Console.WriteLine("我是惡魔貓男");
      break;
   case 帥哥:
      Console.WriteLine("我是帥哥");
      break;
   default:
      Console.WriteLine("Duke 沒有叫你衝");
      break;
}
//我是帥哥

來做個簡易的計算機吧

在開始之前
我們來介紹一下小黑窗輸入的方法

Console.ReadLine();

在程式讀到這行的時候會等待你從鍵盤輸入值
他預設是字串所以我們應該用一個字串的變數去接他

string input = Console.ReadLine();
Console.WriteLine(input);

這樣就能看見你在螢幕打的東西了
https://ithelp.ithome.com.tw/upload/images/20200902/20109549WGvdVz57tP.png
https://ithelp.ithome.com.tw/upload/images/20200902/20109549FjeuULgzOU.png

我的輸入是string 但是我想把他轉成int

這時候能夠使用** int.Parse() **的方法

string a = "123";
int b = int.Parse(b);
//b = 123
int c = int.Parse(Console.ReadLine); // c為使用者輸入的數字

這樣就成功把string轉成int了
** 注意 **
若是b裡面放的不是數字
那麼程式執行的時候就會拋出例外
(後面會介紹如何處裡例外)

string a = "你好";
int b = int.Parse(b);
//轉型失敗 拋出例外

註:
有安全轉型的方法 但本篇不詳談 請參閱TryParse

讓我們正式開始吧

using System;
namespace MyFirstProgram
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("請輸入a");
            int a = int.Parse(Console.ReadLine());
            Console.WriteLine("請輸入b");
            int b = int.Parse(Console.ReadLine());
            Console.WriteLine("請輸入你要進行的運算:(+)(-)(*)(/)");
            string input = Console.ReadLine();
            int c;
            if (input == "+")
            {
                c = a + b;
                Console.WriteLine("a + b =" + c);//這裡的+號是串接
            }
            else if (input == "-")
            {
                c = a - b;
                Console.WriteLine("a - b =" + c);//這裡的+號是串接
            }
            else if (input == "*")
            {
                c = a * b;
                Console.WriteLine("a * b =" + c);//這裡的+號是串接
            }
            else if (input == "/")
            {
                c = a / b;
                Console.WriteLine("a / b =" + c);//這裡的+號是串接
            }
            else
            {
                Console.WriteLine("無效的運算");
            }
        }
    }
}

執行起來
https://ithelp.ithome.com.tw/upload/images/20200902/20109549bZGvb14m4U.png

但是每次跑完一次
就要重開一次
真D麻煩
所以我們調整一下程式碼
在外圈加上while條件

using System;

namespace MyFirstProgram
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)//永遠成立 所以會一直執行
            {
                Console.WriteLine("請輸入a");
                int a = int.Parse(Console.ReadLine());
                Console.WriteLine("請輸入b");
                int b = int.Parse(Console.ReadLine());
                Console.WriteLine("請輸入你要進行的運算:(+)(-)(*)(/)");
                string input = Console.ReadLine();
                int c;
                if (input == "+")
                {
                    c = a + b;
                    Console.WriteLine("a + b =" + c);//這裡的+號是串接
                }
                else if (input == "-")
                {
                    c = a - b;
                    Console.WriteLine("a - b =" + c);//這裡的+號是串接
                }
                else if (input == "*")
                {
                    c = a * b;
                    Console.WriteLine("a * b =" + c);//這裡的+號是串接
                }
                else if (input == "/")
                {
                    c = a / b;
                    Console.WriteLine("a / b =" + c);//這裡的+號是串接
                }
                else
                {
                    Console.WriteLine("無效的運算");
                }
            }
        }
    }
}

執行看看

https://ithelp.ithome.com.tw/upload/images/20200902/20109549wLhP9RbmS1.png

簡易計算機完成拉(灑花)

小結

介紹變數宣告賦值,基礎運算以及流程控制(其實還有switch case沒講到,之後有空會補上)

簡易練習題

印出99乘法表
答案在Program.cs

關於var

如果有一種資料型別 能接所有變數就好了
還真的有!!!
那就是var(雖然他不是資料型別,而且只能在方法內使用)
他是一種隱含轉換
雖然很好用 但是我還是推薦初學者乖乖宣告資料型態
以避免你不知道這個變數是什麼型態
在系列文中我也會盡量避免使用var

var a = "我是帥哥";//a是string
var b = 123;// b是int

碎碎念

雖然才第2天,沒想到寫一些基礎的東西會如此花費時間。
加班回家真的很懶得動筆
總之總之 我會繼續堅持下去的~~~


上一篇
[Day1] 工欲善其事 必先利其器(C# 介紹與安裝IDE)
下一篇
[Day3] 方法,那是什麼能吃嗎
系列文
C# 從入門到WebApi30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
yujoe
iT邦新手 5 級 ‧ 2020-09-02 23:03:06

雖然才第2天,沒想到寫一些基礎的東西會如此花費時間。
加班回家真的很懶得動筆

深有同感!起先以為就打打字應該還好,沒想到式會累的

0
kenyang65
iT邦新手 5 級 ‧ 2023-03-07 08:17:01

大大, 你好

請問
string a = "你好";
int b = int.Parse(b);
//轉型失敗 拋出例外

是否應改成 int b = int.Parse(a);
謝謝

我要留言

立即登入留言