在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
今天刚学C#,写下我的第一个程序: class Program{ public static void Main(String[] args){ Console.WriteLine(10.0); } } 作为一名java程序员,C#的写法是有点差异,常用的System.out.println()被替换成:Console.WriteLine(),而且C#的规范要求方法的首字母大写,但在java中这是类的命名规则。 原来,在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是固定点,还是不明白,望请大神指教。 |
请发表评论