

using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace EventDemo {class Celsius{private float degrees;public Celsius(float temp){degrees = temp;}public static explicit operator Fahrenheit(Celsius c){return new Fahrenheit((9.0f / 5.0f) * c.degrees + 32);}public float Degrees{get { return degrees; }}}class Fahrenheit{private float degrees;public Fahrenheit(float temp){degrees = temp;}// Must be defined inside a class called Fahrenheit:public static explicit operator Celsius(Fahrenheit fahr){return new Celsius((5.0f / 9.0f) * (fahr.degrees - 32));}public float Degrees{get { return degrees; }}}class Program{static void Main(){Fahrenheit fahr = new Fahrenheit(100.0f);Console.Write("{0} Fahrenheit", fahr.Degrees);Celsius c = (Celsius)fahr;Console.Write(" = {0} Celsius", c.Degrees);Fahrenheit fahr2 = (Fahrenheit)c;Console.WriteLine(" = {0} Fahrenheit", fahr2.Degrees);Console.ReadLine();}} }
?
implicit?關鍵字用于聲明隱式的用戶定義類型轉換運算符。?如果可以確保轉換過程不會造成數據丟失,則可使用該關鍵字在用戶定義類型和其他類型之間進行隱式轉換


using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace EventDemo {class Digit{public Digit(double d) { val = d; }public double val;// ...other members// User-defined conversion from Digit to doublepublic static implicit operator double(Digit d){return d.val;}// User-defined conversion from double to Digitpublic static implicit operator Digit(double d){return new Digit(d);}}class Program{static void Main(string[] args){Digit dig = new Digit(7);//This call invokes the implicit "double" operatordouble num = dig;//This call invokes the implicit "Digit" operatorDigit dig2 = 12;Console.WriteLine("num = {0} dig2 = {1}", num, dig2.val);Console.ReadLine();}} }
?
使用?operator?關鍵字來重載內置運算符,或提供類或結構聲明中的用戶定義轉換。


using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace EventDemo {class Fraction{int num, den;public Fraction(int num, int den){this.num = num;this.den = den;}// overload operator +public static Fraction operator +(Fraction a, Fraction b){return new Fraction(a.num * b.den + b.num * a.den,a.den * b.den);}// overload operator *public static Fraction operator *(Fraction a, Fraction b){return new Fraction(a.num * b.num, a.den * b.den);}// user-defined conversion from Fraction to doublepublic static implicit operator double(Fraction f){return (double)f.num / f.den;}}class Program{static void Main(){Fraction a = new Fraction(1, 2);Fraction b = new Fraction(3, 7);Fraction c = new Fraction(2, 3);Console.WriteLine((double)(a * b + c));Console.ReadLine();}} }
和前面的“按值傳遞”相對應的是按引用傳遞。顧名思義,這里傳遞的不在是值,而是引用。注意這里不是傳遞一個復制品了,而是將真實的自己傳到方法中供方法玩弄。
注意點:
1、按引用傳遞的參數,系統不再為形參在托管棧中分配新的內存。
2、此時,形參名其實已經成為實參名的一個別名,它們成對地指向相同的內存位置。


using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Timers;namespace AllDemo {public class Program{static void Main(string[] args){int i = 1;int j = 2;int k = Plus(ref i, ref j); //實參前也要加ref關鍵字Console.WriteLine(i); //輸出 2Console.WriteLine(j); //輸出 3Console.WriteLine(k); //輸出 5 Console.ReadKey();}public static int Plus(ref int i, ref int j) //形參錢要加ref關鍵字 {i = i + 1;j = j + 1;return i + j;}} }
輸出參數和引用參數有一定程度的類似,輸出參數可用于將值從方法內傳遞到方法外,實際上就相當于有多個返回值。要使用輸出參數只需要將引用參數的ref關鍵字替換為out關鍵字即可。但又一點必須注意,只有變量才有資格作為輸出參數,文本值和表達式都不可以,這點要謹記。
注意兩個問題:
1、編譯器允許在方法中的任意位置、任意時刻讀取引用參數的值。
2、編譯器禁止在為輸出參數賦值前讀取它。
這意味著輸出參數的初始值基本上是沒意義的,因為它在使用前要被賦予新的值。因此想通過輸出參數將值傳入方法的路是行不通的。


using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Timers;namespace AllDemo {public class Program{static void Main(string[] args){int i = 1;int j = 2;int k = Plus(i, out j); //實參前也要加out關鍵字Console.WriteLine(i); //輸出 1Console.WriteLine(j); //輸出 100Console.WriteLine(k); //輸出 102 Console.ReadKey();}public static int Plus(int i, out int j){i = i + 1;j = 100;return i + j;}} }
參數數組 - 關鍵字params


using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Timers;namespace AllDemo {public class Program{static void Main(string[] args){int count1 = Plus(1); //輸出 1 Console.WriteLine(count1);int count2 = Plus(1, 2, 3);//輸出 6 Console.WriteLine(count2);int count3 = Plus(); //輸出 0 參數數組本身可選,沒傳入值也不會出錯 {Console.WriteLine(count3);}Console.ReadKey();}public static int Plus(params int[] values){int count = 0;foreach (int i in values){count = count + i;}return count;}} }
?
?