C#的可空類型、decimal相關


今天,我的C#代碼拋異常了。代碼如下,是RPC自動生成的代碼。
<span style="font-family:Courier New;">static decimal? C(double x)
{
	return double.IsNaN(x) ? null : (decimal?)Math.Round((decimal)x, 6);
}</span>
這段代碼涉及到了"值類型"和"可空類型"。
C# 2.0 中引入了可空類型,可空類型也是值類型,只是可空類型是包括null的值類型。
Decimal為SQL Server、MySql等數據庫的一種數據類型,不屬於浮點數類型,在.NET環境中,計算該類型的值會有性能上的損失,因為它不是基本類型。

以下代碼測試了可空類型的使用,測試了decimal可存儲的最大值,分析了C#的Exception表達的意思。

<span style="font-family:Courier New;">using System;
namespace Cs_Test_decimal
{
    class Program
    {
//      static double? t_double1(double x)
//      {//編譯不過去,因為x是double類型,不是double?類型。需要強轉一下才行。
//          return x >= double.MaxValue ? null : x;
//      }
        static double? t_double2(double x)
        {
            return x >= double.MaxValue ? null : (double?)x;
        }
        static string t_string(double x)
        {// "類似對象的類型"是可以為null的。所以不需要加問號和強轉等措施。
            return x >= double.MaxValue ? null : Convert.ToString(x);
        }
        static decimal? t_decimal(double x)
        {
            return double.IsNaN(x) ? null : (decimal?)Math.Round((decimal)x, 6);
        }
        static void Main(string[] args)
        {
            try {
                double maxD = double.MaxValue;
                var testDecimal = (decimal)maxD;
            } catch (Exception ex)
            {
                string errorStr = "" + ex;
                Console.WriteLine(errorStr);
                //System.OverflowException: 值對於 Decimal 太大或太小。
                //在 System.Decimal..ctor(Double value)
                //在 System.Decimal.op_Explicit(Double value)
                //其中,ctor是constructor的意思,表示用double構造Decimal的過程中出錯了。
            };

            double dTest = 1.0;
            for (int i = 1; i <= 40; ++i)
                dTest *= 10;
            //出現了一個有趣的現象:我想得到1.0E+40,結果得到了dTest = 9.9999999999999979E+39。
            try {
                // dTest = 1.0E+28 時候,沒有拋異常。
                var testDecimal = (decimal)dTest;
            } catch (Exception ex)
            {
                Console.WriteLine("" + ex);
            };
        }
    }
}</span>
完。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com