1、第一個C#程序
1.1 代碼:
namespace ConsoleApplication1//名稱空間
{
class Program//類
{
static void Main(string[] args)//可執行文件的入口函數
{
Console.WriteLine("Hello Word!");//輸出
Console.ReadLine();//讀入
return;//退出
}
}
}
1.2 編譯並運行(我在VS13中進行編譯運行的),結果如圖
1.3 詳細介紹
(1)大多數語句都以分號(;)結尾
(2)用花括號({ })把語句組合成塊
(3)單行註釋以//開頭,多行註釋以(/*)開頭,以(*/)結尾
2. 變量
(1)聲明變量:datatype identifier;
2.1 變量的初始化
(1)C#有兩個方法可確保變量在使用前進行了初始化:變量是類或結構中的字段,如果沒有顯式初始化,創建這些變量時,其默認值就是0;方法的局部變量必須在代碼中顯式初始化,之後才能在語句中佼用它們的值。此時,初始化不是在聲明該變量時進行的,但編譯器會通過方法檢查所有可能的路徑,如果檢測到局部變量在初始化之前就使用了它的值,就會產生錯誤。
(2)在C#中實例化一個引用對象需要使用New關鍵字。Something Objsomething = new Something();
2.2 類型推斷
(1)類型推斷(Type inference)使用var關鍵字。編譯器可以根據變量的初始化值推斷變量的類型。
(2)例:
namespace study2_2_2
{
class Program
{
static void Main(string[] args)
{
//定義3個類型推斷的變量
var name = "Bugs Bunny";
var age = 25;
var isRabbit = true;
//獲取上述3個變量的類型
Type nameType = name.GetType();
Type ageType = age.GetType();
Type isRabbitType = isRabbit.GetType();
Console.WriteLine("name's type is :" + nameType.ToString());
Console.WriteLine("age's type is :" + ageType.ToString());
Console.WriteLine("isRabbit's type is :" + isRabbitType.ToString());
}
}
}
(3)輸出:
(4)遵循規則:
- 變量必須初始化,否則,編譯器就沒有推斷變量類型的依據
- 初始化器不能爲空。
- 初始化器必須放在表達式中。
- 不能把初始化器設置爲一個對象,除非在初始化器中創建了一個新對象。
2.3 變量的作用域
(1)變量的作用域是可以訪問該變量的代碼區域
(2)確定作用域遵循以下規則:只要類在某個作用域內,其字段(也稱爲成員變量)也在該作用域內。
- 局部變量存在於表示聲明該變量的塊語句或方法結束的右花括號之前的作用域內。
- 在for、while或類似語句中聲明的局部變量存在於該循環體內。
2.3.1 局部變量的作用域衝突
(1)同名的局部變量不能在同一作用域內聲明兩次
(2)代碼:
namespace study2_3_1
{
class Program
{
static int Main(string[] args)
{
for(int i=0;i<10;i++)//for循環
{
Console.WriteLine(i);
}
for (int i = 9; i >= 0; i--)
{
Console.WriteLine(i);
}
return 0;
}
}
}
(3)結果:
兩次聲明都是在循環內部聲明的。
2.3.2 字段和局部變量的作用域衝突
(1)C#把在類級別聲明的變量看做字段,把方法中聲明的變量看做局部變量。
(2)代碼:
namespace study2_3_2{
class Program
{
static int j = 20;
static void Main(string[] args)
{
int j = 30;
Console.WriteLine(j);
Console.WriteLine(Program.j);//訪問類級變量
return;
}
}
}
(3)結果
Main()方法中的變量J隱藏了同名的類級變量,可以使用Object.fieldname訪問外部的引用類或結構字段。
2.4 常量:值在使用過程中不會發生變化的變量,在前加上關鍵字const。
(1)常量特點:
- 常量必須在聲明時初始化。指定了其值後,就不能再改寫了。
- 常量的值必須能在編譯時用於計算。
- 常量總是靜態的。
(2)常量的好處:
- 由於使用易於讀取的名稱(名稱的值易於理解)替代了較難讀取的數字或字符串,常量使程序
變得更易於閱讀。 - 常量使程序更易於修改。
- 常量更容易避免程序出現錯誤。
3. 預定義數據類型
3.1 值類型和引用類型
(1)區別:值類型直接存儲其值,而引用類型存儲對值的引用。這兩種類型存儲在內存的不同地方:值類型存儲在堆棧中,而引用類型存儲在託管堆上。
(2)代碼:
namespace study2_3_11
{
public class Vector //結構
{
public int Value;
}
class Program
{
static void Main(string[] args)
{
Vector x, y;
x = new Vector();
x.Value = 30;
y = x;
Console.WriteLine(y.Value);
y.Value = 50;
Console.WriteLine(x.Value);
}
}
}
(3)
執行這段代碼後,只有一個Vector對象,x、y都指向包含該對象的內存位置。要創建對象,必須使用關鍵字new。所以,對x的修改會影響y,反之一樣。
(4)一般把基本類型(如int和bool)規定爲值類型,而把包含許多字段的較大類型(通常在有類的情況下)規定爲引用類型
3.2 CTS
(1)C#認可的基本預定義類型並沒有內置於C#語言中,而是內置於.NET Framework中。例如,在C#中聲明一個int類型的數據時,聲明的實際上是.NET結構System.Int32的一個實例。
(2)應強調的是,在這種便利語法的背後,類型實際上仍存儲爲基本類型。
3.3 預定義的值類型:.內置的CTS值類型表示基本類型,如整型和浮點類型、字符類型和布爾類型。
3.3.1 整型
(1)C#支持8個預定義整數類型。
(2)在C#中,所有的數據類型都以與平臺無關的方式定義,以備將來C#和.NET遷移到其他平臺上。
3.3.2 浮點型:
(1)
3.3.3 decimal類型
(1)
(2)CTS和C#一個重要的優點是提供了一種專用類型進行財務計算,這就是decimal類型,使用decimal類型提供的28位的方式取決於用戶.
3.3.4 bool 類型
3.3.5 字符類型
3.4 預定義的引用類型
(1)
3.4.1 Object類型
(1)許多編程語言和類結構都提供了根類型,層次結構中的其他對象都從它派生而來。
(2)兩個目的:可以使用Object引用綁定任何子類型的對象;object 類型執行許多一般用途的基本方法.
3.4.2 String類型
(1)string是一個引用類型。String對象被分配在堆上,而不是棧上。因此,當把一個字符串變量賦予另一個字符串時,會得到對內存中同一個字符串的兩個引用。但是,string與引用類型在常見的操作上有一些區別。例如,字符串是不可改變的。修改其中一個字符串,就會創建一個全新的String對象,而另一個字符串不發生任何變化。
(2)代碼:
namespace study2_3_4_2
{
class Program
{
static void Main(string[] args)
{
string s1 = "a string";
string s2 = s1;
Console.WriteLine("s1 is " + s1);
Console.WriteLine("s2 is " + s2);
s1 = "another string";
Console.WriteLine("s1 is " + s1);
Console.WriteLine("s2 is " + s2);
}
}
}
(3)結果
4. 流控制
4.1 條件語句
4.1.1 if語句:if...else...
4.1.2 switch 語句:switch...case...
4.2 循環
4.2.1 for循環
4.2.2 while循環
4.2.3 do...while...循環
4.2.4 foreach 循環
4.3 跳轉語句
4.3.1 goto語句
4.3.2 break 語句
4.3.3 continue 語句:開始執行下一次的迭代,並不退出循環。
4.3.4 return 語句
5. 枚舉:枚舉是用戶定義的整數類型。
(1)優勢:枚舉可以使代碼更易於維護,有助於確保給變量指定合法的、期望的值;枚舉使代碼更清晰,允許用描述性的名稱表示整數值,而不是用含義模糊、變化多端的數
來表示;枚舉也使代碼更易於鍵入。
(2)代碼:
namespace study2_5_1
{
public enum TimeOfDay //引用
{
Morning = 0,
Afternoon = 1,
Evening = 2
}
class Program
{
static void Main(string[] args)
{
WriteGreeting(TimeOfDay.Afternoon);
}
static void WriteGreeting(TimeOfDay timeofday)
{
switch (timeofday)
{
case TimeOfDay.Morning:
Console.WriteLine("Good morning!");
break;
case TimeOfDay.Afternoon:
Console.WriteLine("Good Afternoon!");
break;
case TimeOfDay.Evening:
Console.WriteLine("Good Evening!");
break;
default:
Console.WriteLine("hello");
break;
}
}
}
}
(3)結果:
(4)在C#中,枚舉的真正強大之處是它們在後臺會實例化爲派生於基類System.Enum的結構。這表示可以對它們調用方法,執行有用的任務。
6. 名稱空間:提供了一種組織相關類和其他類型的方式。
(1)與文件或組件不同,名稱空間是一種邏輯組合,而不是物理組合。
(2)注意不允許在另一個嵌套的名稱空間中聲明多部分的名稱空間。
(3)名稱空間與程序集無關。同一個程序集中可以有不同的名稱空間,也可以在不同的程序集中定義同一個名稱空間中的類型。
6.1 using語句:要在文件的頂部列出類的名稱空間,前面加上using關鍵字。
6.2 名稱空間的別名:using 別名=空間名;
(1)代碼:
using System;
using Introduction = study2_6_2;
class Test
{
static void Main(string[] args)
{
Introduction::Program nsex = new Introduction.Program();
Console.WriteLine(nsex.GetNamespace());
}
}
namespace study2_6_2
{
class Program
{
public string GetNamespace()
{
return this.GetType().Namespace;
}
}
}
(2)結果:
7. Main()方法
(1)C#是從方法Main()開始執行的。這個方法必須是類或結構的靜態方法,並且其返回類型必須是int或void。
7.1 多個Main()方法
(1)一般會返回一個錯誤信息,不過可以使用/main選項,後面緊跟Main()方法所屬類的全名。
7.2 給Main()方法傳遞參數:String[ ] args。
8 有關編譯C#文件的更多內容
9. 控制檯I/O
(1)Console.Write()方法將指定的值寫入控制檯窗口;Console.WriteLine()方法類似,但在輸出結果的最後添加一個換行符。
(2)Console.ReadLine()等。
10. 使用註釋
10.1 源文件中的內部註釋://、/**/
10.2 XML文檔
註釋有3中:單行註釋、多行註釋、文檔註釋
11. C#預處理器指令
11.1 #define和#undef:定義與刪除
11.2 #if、#elif、#else和#endif:條件編譯
11.3 #warning和#error
11.4 #region和#endregion:把代碼標記爲一個塊
11.5 #line 用於改變編譯器在警告和錯誤信息中顯示的文件名和行號信息。
11.6 #pragma
12. C#編程規則
(1)關鍵字
(2)Pascal大小寫:首字母大寫;camel大小寫:首字母小寫