第一個C#程序:
using System; // 導入命名空間 class Test // 類聲明
{ static void Main () // 方法聲明
{
int x = 12 * 30; // 陳述1 Console.WriteLine (x); // 陳述2 } // 方法結束
} // end of class
重構一個方法:
using System; class Test { static void Main () { Console.WriteLine (FeetToInches (30)); // 360 Console.WriteLine (FeetToInches (100)); // 1200 } static int FeetToInches (int feet) { int inches = feet * 12; return inches; } }
語法例子程序:
using System; class Test { static void Main () { int x = 12 * 30; Console.WriteLine (x); } }
自定義類型:
using System; public class UnitConverter { int ratio; // 屬性 public UnitConverter (int unitRatio) {ratio = unitRatio; } // 構造 public int Convert (int unit) {return unit * ratio; } // 方法 } class Test { static void Main () { UnitConverter feetToInchesConverter = new UnitConverter(12); UnitConverter milesToFeetConverter = new UnitConverter(5280); Console.WriteLine (feetToInchesConverter.Convert(30)); // 360 Console.WriteLine (feetToInchesConverter.Convert(100)); // 1200 Console.WriteLine (feetToInchesConverter.Convert( milesToFeetConverter.Convert(1))); // 63360 } }
實例 vs. 靜態成員:
using System; public class Panda { public string Name; // instance field public static int Population; // static field public Panda (string n) // constructor { Name = n; // assign the instance field Population = Population + 1; // increment the static Population field } } class Test { static void Main() { Panda p1 = new Panda ("Pan Dee"); // create new Panda instance Panda p2 = new Panda ("Pan Dah"); // create new Panda instance Console.WriteLine (p1.Name); // access instance field Console.WriteLine (p2.Name); // access instance field Console.WriteLine (Panda.Population); // access static field } }
轉換:
int x = 123456; // int is a 32-bit integer long y = x; // implicit conversion to 64-bit integer short z = (short)x; // explicit conversion to 16-bit integer
值類型 vs.引用類型:
static void Main () { Point p1 = new Point(); p1.X = 7; Point p2 = p1; // assignment causes copy Console.WriteLine (p1.X); // 7 Console.WriteLine (p2.X); // 7 p1.X = 9; // change p1.X Console.WriteLine (p1.X); // 9 Console.WriteLine (p2.X); // 7 }
static void Main () { Point p1 = new Point(); p1.X = 7; Point p2 = p1; // copies p1 reference Console.WriteLine (p1.X); // 7 Console.WriteLine (p2.X); // 7 p1.X = 9; // change p1.X Console.WriteLine (p1.X); // 9 Console.WriteLine (p2.X); // 9 }
數字文字:
Console.WriteLine ( 1.0.GetType()); // Double (double) Console.WriteLine ( 1E06.GetType()); // Double (double) Console.WriteLine ( 1.GetType()); // Int32 (int) Console.WriteLine ( 0xF0000000.GetType()); // UInt32 (uint)
checked 操作符:
int a = 1000000; int b = 1000000; // Check an expression int c = checked (a*b); // Check every expression in a statement block checked { // ... c = a * b; // ... }
int x = int.MaxValue; int y = unchecked (x + 1); unchecked { int z = x + 1; }
int x = int.MaxValue + 1; // Compile-time error int y = unchecked (int.MaxValue + 1); // No errors
特殊float和double值:
Console.WriteLine ( 1.0 / 0.0); // Infinity Console.WriteLine (-1.0 / 0.0); // -Infinity Console.WriteLine ( 1.0 / -0.0); // -Infinity Console.WriteLine (-1.0 / -0.0); // Infinity
Console.WriteLine ( 0.0 / 0.0); // NaN Console.WriteLine ((1.0 / 0.0) - (1.0 / 0.0)); // NaN
Console.WriteLine (0.0 / 0.0 == double.NaN); // False Console.WriteLine (double.IsNaN(0.0 / 0.0)); // True
實數字四捨五入錯誤:
float tenth = 0.1f; // Not quite 0.1 float one = 1f; Console.WriteLine (one - tenth * 10f); // -1.490116E-08
decimal m = 1M / 6M; // 0.1666666666666666666666666667M double d = 1.0 / 6.0; // 0.16666666666666666 decimal notQuiteWholeM = m+m+m+m+m+m; // 1.0000000000000000000000000002M double notQuiteWholeD = d+d+d+d+d+d; // 0.99999999999999989 Console.WriteLine (notQuiteWholeM == 1M); // False Console.WriteLine (notQuiteWholeD < 1.0); // True
相等和比較操作符:
public class Dude { public string Name; public Dude (string n) { Name = n; } } Dude d1 = new Dude ("John"); Dude d2 = new Dude ("John"); Console.WriteLine (d1 == d2); // False Dude d3 = d1; Console.WriteLine (d1 == d3); // True
條件操作符:
static bool UseUmbrella (bool rainy, bool sunny, bool windy) { return ! windy && (rainy || sunny); }
static int Max (int a, int b) { return (a > b) ? a : b; }
數組:
char[] vowels = new char[5]; // Declare an array of 5 characters vowels [0] = 'a'; vowels [1] = 'e'; vowels [2] = 'i'; vowels [3] = 'o'; vowels [4] = 'u'; Console.WriteLine (vowels [1]); // e for (int i = 0; i < vowels.Length; i++) Console.Write (vowels [i]); // aeiou
char[] vowels = new char[] {'a','e','i','o','u'};
多維數組, 矩形:
int [,] matrix = new int [3, 3]; for (int i = 0; i < matrix.GetLength(0); i++) for (int j = 0; j < matrix.GetLength(1); j++) matrix[i, j] = i * 3 + j;
int[,] matrix = new int[,] { {0,1,2}, {3,4,5}, {6,7,8} };
多維數組, 勾型:
int [][] matrix = new int [3][]; for (int i = 0; i < matrix.Length; i++) { matrix[i] = new int [3]; // create inner array for (int j = 0; j < matrix[i].Length; j++) matrix[i][j] = i * 3 + j; }
int[][] matrix = new int[][] { new int[] {0,1,2}, new int[] {3,4,5}, new int[] {6,7,8} };
簡單數組初始化表達式:
char[] vowels = {'a','e','i','o','u'}; int[,]rectangularMatrix = { {0,1,2}, {3,4,5}, {6,7,8} }; int[][]jaggedMatrix = { new int[] {0,1,2}, new int[] {3,4,5}, new int[] {6,7,8} };
var i = 3; // i is implicitly of type int var s = "sausage"; // s is implicitly of type string // Therefore: var rectMatrix = new int[,] // rectMatrix is implicitly of type int[,] { {0,1,2}, {3,4,5}, {6,7,8} }; var jaggedMat = new int[][] // jaggedMat is implicitly of type int[][] { new int[] {0,1,2}, new int[] {3,4,5}, new int[] {6,7,8} };
棧和堆:
using System; using System.Text; class Test { static void Main () { StringBuilder ref1 = new StringBuilder("object1"); StringBuilder ref2 = new StringBuilder("object2"); StringBuilder ref3 = ref2; ref1 = ref2 = null; Console.WriteLine(ref3); // object2 } }
值傳參:
class Test { static void Foo(int p) { p = p + 1; // increment p by 1 Console.WriteLine(p); // write p to screen } static void Main() { int x = 8; Foo(x); // make a copy of x Console.WriteLine(x); // x will still be 8 } }
class Test { static void Foo (StringBuilder fooSB) { fooSB.Append ("test"); fooSB = null; } static void Main() { StringBuilder sb = new StringBuilder(); Foo (sb); Console.WriteLine (sb.ToString()); // test } }
引用傳參:
class Test { static void Foo (ref int p) { p = p + 1; // increment p by 1 Console.WriteLine(p); // write p to screen } static void Main () { int x = 8; Foo (ref x); // Ask Foo to deal directly with x Console.WriteLine(x); // x is now 9 } }
using System; class Test { static void Swap (ref string a, ref string b) { string temp = a; a = b; b = temp; } static void Main () { string x = "Penn"; string y = "Teller"; Swap (ref x, ref y); Console.WriteLine (x); // Teller Console.WriteLine (y); // Penn } }
out 修飾符:
using System; class Test { static void Split (string name, out string firstNames, out string lastName) { int i = name.LastIndexOf(' '); firstNames = name.Substring (0, i); lastName = name.Substring (i + 1); } static void Main() { string a, b; Split ("Stevie Ray Vaughn", out a, out b); Console.WriteLine (a); // Stevie Ray Console.WriteLine (b); // Vaughn } }
隱式引用傳參:
using System; class Test { static int x; static void Main() { Foo(out x); } static void Foo(out int y) { Console.WriteLine (x); // x is 0 y = 1; // mutate y Console.WriteLine (x); // x is 1 } }
params 修飾符:
using System; class Test { static int Sum (params int[] ints) { int sum = 0; for (int i = 0; i < ints.Length; i++) sum += ints[i]; // increase sum by ints[i] return sum; } static void Main() { int total = Sum (1, 2, 3, 4); Console.WriteLine(total); // 10 } }
var: 隱式類型局部變量:
var x = 5; var y = "hello"; var z = new System.Text.StringBuilder(); var req = (System.Net.FtpWebRequest) System.Net.WebRequest.Create ("...");
The switch statement:
static void ShowCard(int cardNumber) { switch(cardNumber) { case 13: Console.WriteLine("King"); break; case 12: Console.WriteLine("Queen"); break; case 11: Console.WriteLine("Jack"); break; case -1: // joker is -1 goto case 12; // in this game joker counts as queen default: // executes for any other cardNumber Console.WriteLine(cardNumber); break; } }
順序列出常見的情況:
switch (cardNumber) { case 13: case 12: case 11: Console.WriteLine ("Face card"); break; default: Console.WriteLine ("Plain card"); break; }
break和continue:
int x = 0; while (true) { if (x++ > 5) break; // break from the loop }
for (int i = 0; i < 4; i++) { if ((i % 2) == 0) // true if i is even continue; // continue with next iteration Console.WriteLine (i); }
goto:
int i = 0; startLoop: if (i < 3 ) { Console.WriteLine(i); i++; goto startLoop; }
高級命名空間特性: extern
// csc target:library /out:Widgets1.dll widgetsv1.cs namespace Widgets { public class Widget {} }
// csc target:library /out:Widgets2.dll widgetsv2.cs namespace Widgets { public class Widget {} }
// csc /r:W1=Widgets1.dll /r:W2=Widgets2.dll application.cs extern alias W1; extern alias W2; class Test { static void Main() { W1.Widgets.Widget w1 = new W1.Widgets.Widget(); W2.Widgets.Widget w2 = new W2.Widgets.Widget(); } }
命名空間別名修飾:
namespace N { class A { public class B {} // Nested type static void Main() { new A.B(); } // Instantiate class B } } namespace A { class B {} }
namespace :: token:
namespace N { class A { static void Main() { System.Console.WriteLine(new A.B()); System.Console.WriteLine(new global::A.B()); } public class B {} } } namespace A { class B {} }