今天剛學C#,寫下我的第一個程序:
class Program{ public static void Main(String[] args){ Console.WriteLine(10.0); } }
作為一名java程序員,C#的寫法是有點差異,常用的System.out.println()被替換成:Console.WriteLine(),而且C#的規范要求方法的首字母大寫,但在java中這是類的命名規則。
這些都是小問題,很快就習慣了,但我一運行這個代碼,就發現我的輸出變成了:10!
原來,在C#這里,10.0會當成10來處理,如果我們想要正確的輸出10.0,就要利用格式化輸出,像是下面這樣:
Console.WriteLine("{0:N1}", 10.0);
我們還可以這樣寫(這樣麻煩了點):
Console.WriteLine(String.Format("{0:N1}", 10.0));
甚至我們還可以這樣寫;
double d = 10; Console.WriteLine(d.ToString("N2");
前面兩種寫法的第一個參數"{0:N1}"表示后面的第一個參數,就是10.0,取小數后一位,如果想取兩位,可以將1改為2。后面一種說明,在C#中,double本身就是一種對象類型,因為它擁有方法。事實上,在C#中,所有的類型,值類型和引用類型繼承自System.Object這個基類(看到Object,我這個java人可是親切得很,但也被C#的這種特點嚇到了~~才怪,javascript已經讓我對這種情況沒有什么感覺了---函數都是對象!)。
當然,它可以處理更多的參數,像是這樣:
Console.WriteLine("I love {0}, you love {1}", "you", "me");
而且我們還能以科學計數法的格式輸出:
Console.WriteLine("{0:E2}", 100);
輸出結果就是:1.00E+002.
格式化輸出還有更加神奇的地方:它允許一個格式項有多種格式選擇:
Console.WriteLine("{0:#,###0.00;#,###0.000;#,###0.0000}",10); Console.WriteLine("{0:#,###0.00;#,###0.000;#,###0.0000}", -10); Console.WriteLine("{0:#,###0.00;#,###0.000;#,###0.0000}", 0));
神奇的是,這種格式具有選擇性,第一種格式對應的是正數,第二種對應的是負數,第三種對應的是0,后面的參數會根據自身情況,選擇相應的格式。
格式化的內容很多,涉及到日期,貨幣等等,這些都是在需要用到的時候才會接觸,所以,這里就不詳談。上面的問題其實很簡單,因為我的數字是小數,在C#中,真的有一個專門的類型:decimal,它的位數是128位,范圍為1.0 * 10^-28到7.9 * 10^28。我在使用的時候應該是這樣:
Console.WriteLine(10.0M);
M表示是decimal類型,否則,就會默認轉化為double。
例子雖短,但反映出來的東西卻不少,像是:string和String,應該用哪一個?
我試過,兩者都行,C#不是對大小寫敏感嗎?事實上就是,CLR(學C#的同學一定知道這東西)中是String類型,但在C#中,是string關鍵字。C#編譯器在編譯的時候,會進行這樣的行為:
using string = System.String這樣的映射操作。
既然這樣,我就用回我以前習慣的String好了,這也是CLR via C#所建議的,但是其他的映射,像是:
using int = System.Int32;
using short = System.Int16;
...
為了可讀性,我還是使用int,short比較好,就算那樣會提高點效率,但可讀性也很重要,但如果是調用方法,還是使用Int32比較好說明這是在調用方法。這里倒想要補充一點:System.Single這貨一開始讓我摸不着頭腦,后來才想起來是float!因為float是單精度,所以使用Single表示(對應System.Double的雙精度)。稍微吐糟這點,float這個名字讓很多人都忘記它是單精度的事實,因為浮點數這樣的名稱只會認為是小數。
格式化輸出還有一個問題我一直搞不明白:N和F應該用哪一個?
使用N,會有千分符,像是10000,會變成這樣:10,000,但有些結果看上去似乎是一樣的,像是10.235,使用N2和F2,是一樣的,就連尾數同樣是四舍五入。看了資料,說N是數值,F是固定點,還是不明白,望請大神指教。