Peterluo的技术博客

     ------自助者天助之,每天进步一点
 

今天风痕在群里问了个问题:给如下这三种定义decimal类型的变量赋值有什么不同?

 

using System; 

using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Decimal
{
    class Program
    {
        static void Main(string[] args)
        {
            decimal dRebate1 = new decimal(1);
            decimal dRebate2 = Convert.ToDecimal(1);
            decimal dRebate3 = 1M;

            Console.WriteLine("dRebate1:{0}\ndRebate2:{1}\ndRebate3:{2}"
                 dRebate1.ToString(), dRebate2.ToString(), dRebate3.ToString());
            Console.ReadLine();
        }
    }
}

 

我感觉没有什么大的区别,仅仅是初始化值的来源方式不同而已,就好比吃饭可以用筷子或者勺子一样。现在就简单说说。 

1.dRebate1 新实例初始化为指定的 32 位有符号整数值,因为C#编辑器知道它是值类型,所以在线程栈上分配这个整数值的实例,装的数值是1,其作用是初始化一个值。右键转到定义会看到程序集 mscorlib.dll中的元数据,发现在new decimal(1)中的1不能是string等字符类型,只能是如图下面的一些类型:

 

 

2. dRebate2 这个是将指定的 32 位(也可以是16位)带符号整数的值转换为等效的十进制数,即decimal基本类型,它在这里就是将其它的基本类型转化成decimal类型,当然,可以是绝大部分的基本类型都可以通过Convert进行转换,可以点这里查看转换类型种类。

3.dRebate3 ,这个就更加的明显了,在C#中,M或者m表示的就是这个值是decimal的基本类型,只要是这样定义的,就告诉C#编辑器,这个值是decimal类型的,以后就当这个类型的来用。当然,如果你写个string类型的"123"后面跟个M,那肯定是会报错的,F5不通过,因为编辑器不认识这是什么东东,即使"123"的老爸是李刚也不行。跟decimal基本类型M写法类似的有很多,float用F或者f,double用D或者d等等。

 

最后,我用VS2010自带的工具 IL反汇编工具看了下有什么不同,其实因为本来值得来源展示方式不同,那生成的IL肯定也不同了。

 

 

里面的IL关键字每种定义可以参看:《你必须知道的.NET》中的第三章,《CLR via C#》的第五章,这里就不多说 了。

 

总结:我们定义类型的时候,要看具体场合,不要纠结谁好谁差,用对了场景,符合了习惯,那就是100% 的好。

 

 

 

posted on 2012-08-15 00:11  linjun  阅读(33574)  评论(0编辑  收藏  举报