今天,我的C#代码抛异常了。代码如下,是RPC自动生成的代码。
C# 2.0 中引入了可空类型,可空类型也是值类型,只是可空类型是包括null的值类型。
Decimal为SQL Server、MySql等数据库的一种数据类型,不属于浮点数类型,在.NET环境中,计算该类型的值会有性能上的损失,因为它不是基本类型。
<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>
完。