C#簡介
C#是微軟公司開發的一種面向對象的,運行在.NET Framework
上的高級程序設計語言。.NET Framework
是 Microsoft 爲開發應用程序而創建的一個具有革命意義的平臺。.NET Framework
主要包含一個龐大的代碼庫,可以在客戶語言中通過面向對象編程技術來使用這些代碼。這個庫分爲多個不同的模塊,這樣就可以根據希望得到的結果來選擇使用其中的各個部分。
變量和表達式
變量
變量是有名稱和類型的數據塊。變量只有經過聲明和初始化後,才能使用。
變量類型
在C#中,變量類型分爲簡單類型和複雜類型,簡單類型包括整數類型,浮點數類型,字符類型(char),字符串類型(string),布爾類型(bool) 。整數類型包括sbyte, byte, short, ushort, int, uint, long, ulong;浮點數類型包括float, double, decimal 。複雜類型包括枚舉,結構,數組。枚舉和結構在代碼主體之外進行聲明,則此命名空間內的所有類都可以訪問到。另外,按照存儲方式可將變量分爲引用類型和值類型。值類型在內存的同一處存儲它們自己和它們的內容;引用類型存儲指向內存中其他某個位置(稱爲堆)的引用,實際內容存儲在這個位置。值類型有int, double, bool, char, struct 結構, enum 枚舉等類型;引用類型有string, object, class 類等類型。
變量命名
變量命名規則:變量名的第一個字符必須是字母,下劃線或@,其後的字符可以是字母,下劃線或數字。且變量名不能使用C#中的關鍵字。
類型轉換
類型轉換採用以下兩種形式:
- 隱式轉換: 讓編譯器執行轉換
- 顯式轉換: 明確要求編譯器把數值從一種數據類型轉換爲另一種數據類型
隱式轉換規則是:任何類型A,只要其取值範圍完全包含在類型B的取值範圍內,就可以隱式轉換爲類型B。顯式轉換的語法是:(<destinationType>)<sourceVar>
或使用Convert命令進行顯式轉換。
字符串的處理
- 使用+運算符可以連接字符串
- string 類型的變量可以看成 char 變量的只讀數組,可以通過下標來訪問字符
- ToCharArray():返回一個可寫的char類型數組
- Length屬性:返回字符串中的字符數
- ToLower() :返回字符串的小寫形式
- ToUpper():返回字符串的大寫形式
- Trim():刪除字符串前後的空格
- TrimStart(),TrimEnd():刪除字符串前面或後面的空格
- PadLeft(length):在字符串的左邊添加空格或指定的字符,使字符串達到指定的長度
- PadRight(length):在字符串的右邊添加空格或指定的字符,使字符串達到指定的長度
- Split():把 string 轉換爲 string 數組,把它在指定的位置隔開,這些位置採用 char 數組形式
- Replace():把字符串中指定的子字符串替換成新的子字符串
注:上面的所有方法會返回一個新字符串,都不會改變原字符串。
表達式
表達式由操作數(變量和字面值)和運算符構成。運算符分爲三類:一元運算符,二元運算符,三元運算符(即條件運算符)。
運算符的優先級
名稱空間
名稱空間是.NET中提供應用程序代碼容器的方式,這樣就可以唯一地標識代碼及其內容。默認情況下,C#代碼包含在全局名稱空間中,這意味着對於包含在這段代碼中的項,全局名稱空間中的其他代碼只要通過名稱進行引用,就可以訪問它們。使用 namespace 關鍵字可以爲花括號中的代碼塊顯式定義名稱空間。如果在該名稱空間代碼的外部使用名稱空間中的名稱,就必須寫出該名稱空間中的限定名稱。限定名稱包括它所有的分層信息,限定名稱在不同的名稱空間級別之間使用句點字符(.)。
流程控制
分支:三元運算符,if語句,switch語句
循環:do循環,while循環,for循環
循環中斷:break(終止循環),continue(終止當前循環,繼續執行下一次循環),return(跳出循環及包含該循環的函數)
函數
函數其實就是可重用的代碼塊,在程序中使用函數可提高代碼的可讀性。函數還可以用於創建多用途的代碼,讓它們對不同的數據執行相同的操作。函數的定義包括函數名,返回類型以及一個參數列表,這個參數列表指定了該函數需要的參數數量和參數類型。函數的名稱和參數共同定義了函數的簽名。
定義和使用函數
static <returnType> <FunctionName>(<paramType> <paramName>, ...)
{
...
return <returnValue>;
}
這裏唯一的限制是<returnValue>
必須是<returnType>
類型的值,或者可以隱式轉換爲該類型。
執行一行代碼的函數可使用 Lambda 箭頭函數:
static <returnType> <FunctionName>(<paramType> <paramName>, ...) => <statement>;
在使用函數(即調用函數時),必須使提供的參數與函數定義中指定的參數完全匹配,這意味着要匹配參數的類型,個數和順序。C#允許爲函數指定一個(只能指定一個)特殊參數,這個參數必須是函數定義中的最後一個參數,稱爲參數數組。參數數組允許使用個數不定的參數調用函數,可使用 params
關鍵字定義它們。參數數組可以簡化代碼,因爲在調用代碼中不必傳遞數組,而是傳遞同類型的幾個參數。例如:
static int SumVals(params int[] arrs)
{
int sum = 0;
foreach(int arr in arrs)
{
sum += arr;
}
return sum;
}
int sum = SumVals(1, 2, 3, 4); //調用函數
引用參數與值參數
使用值參數的函數不會改變函數調用中指定的實參,使用引用參數會改變(函數執行完畢後,該參數的值將返回給函數調用中使用的變量),只需在函數定義和調用的時候使用ref關鍵字指定參數。例如:
static void ShowDouble(ref int val)
{
val *= 2;
Console.WriteLine($"Val double = {val}");
}
ShowDouble(ref myNumber); //myNumber的值將會被改變
用作ref參數的變量有兩個限制:必須使用“非常量”變量;必須使用初始化過的變量。
輸出參數
使用 out 關鍵字,指定所給的參數是一個輸出參數。使用方式和執行方式與引用參數幾乎完全一樣,但有些許不同:out 參數可以且必須看成是尚未賦值的變量(可以把已賦值的變量用作out參數,但存儲在該變量中的值會在函數執行時丟失)。例如編寫一個函數返回數組中最大值,同時獲取數組中最大值的元素索引:
static int MaxValue(int[] intArray, out int maxIndex)
{
int maxVal = intArray[0];
maxIndex = 0;
for(int i=1; i<intArray.Length; i++)
{
if(intArray[i] > maxVal)
{
maxVal = intArray[i];
maxIndex = i;
}
}
return maxVal;
}
static void Main(string[] args)
{
int[] myArray = { 1, 8, 3, 6, 2, 5, 9, 3, 0, 2 };
int maxIndex;
Console.WriteLine($"此數組的最大值爲 {MaxValue(myArray, out maxIndex)}");
Console.WriteLine($"此數組的最大值的下標爲 {maxIndex + 1}");
Console.ReadKey();
}
由於變量是有作用域的,所以我們需要利用函數來交換數據。變量的作用域包含定義它們的代碼塊和直接嵌套在其中的代碼塊。按作用域可將變量分爲全局變量和局部變量。在控制檯應用程序中,需要使用 static 或 const 關鍵字來定義和修改(const不能修改)全局變量(的值)。如果函數中出現了與全局變量同名的局部變量時,必須用一個完整限定的名稱來使用全局變量。
namespace Practice1
{
class Program
{
static string myString; //聲明全局變量
static void Main(string[] args)
{
string myString = "局部變量";
Program.myString = "全局變量";
Console.WriteLine($"{myString}");
Console.WriteLine($"{Program.myString}");
Console.ReadKey();
}
}
}
函數重載
在調用函數時,必須匹配函數的簽名。函數重載允許創建多個同名函數,每個函數可使用不同的參數類型,參數個數等等。即函數重載就是定義名稱相同但簽名不同的多個函數。
委託
委託是一種存儲函數引用的類型。委託的聲明非常類似於函數,但不帶函數體,且要使用 delegate 關鍵字。定義了委託後,就可以聲明該委託類型的變量,接着把這個變量初始化爲與委託具有相同返回類型和參數列表的函數引用。之後,就可以使用委託變量調用這個函數,就像該變量是一個函數一樣。
namespace Practice1
{
class Program
{
delegate double ProcessDelegate(double param1, double param2);//定義委託類型
static double Multiply(double param1, double param2) => param1 * param2;//定義要委託的函數
static double Divide(double param1, double param2) => param1 / param2;//定義要委託的函數
static void Main(string[] args)
{
ProcessDelegate process;
Console.WriteLine("輸入兩個數字並用逗號隔開");
string input = Console.ReadLine();
int commaPos = input.IndexOf(',');
double param1 = Convert.ToDouble(input.Substring(0, commaPos));
double param2 = Convert.ToDouble(input.Substring(commaPos + 1, input.Length - commaPos - 1));
Console.WriteLine("輸入M表示兩數相乘,輸入D表示兩數相除");
input = Console.ReadLine();
if (input == "M")
process = new ProcessDelegate(Multiply); //這是委託賦值的一種獨特語法,參數是要使用的函數名
else
process = new ProcessDelegate(Divide); //初始化委託變量,即要把一個函數引用賦給委託變量
Console.WriteLine($"結果爲{process(param1, param2)}");
Console.ReadKey();
}
}
}