0 c# static initialization const static-initialization
我一直在抓挠这个问题.我怀疑我;我只是在这里愚蠢,但我似乎无法获得const或静态成员进行初始化,所以我可以在整个课程中使用它.
这是一个展示我的问题的例子(或者更确切地说是我的误解):
using System;
namespace ConstExample
{
public class HasImmutableMember
{
// static private double fSectionLengthTolerancePerInch = 1 / (20 * 12); // tolerance is 1" per every 20'
private const double fSectionLengthTolerancePerInch = 1 / (20 * 12); // tolerance is 1" per every 20'
static HasImmutableMember()
{
Console.WriteLine("static c'tor: " + fSectionLengthTolerancePerInch);
}
public HasImmutableMember()
{
Console.WriteLine("instance c'tor: " + fSectionLengthTolerancePerInch);
}
}
public class Program
{
public void Main(string[] args)
{
HasImmutableMember instance = new HasImmutableMember();
}
}
}
Run Code Online (Sandbox Code Playgroud)
控制台输出是:
static c'tor: 0
instance c'tor: 0
Run Code Online (Sandbox Code Playgroud)
无法在const成员声明中设置断点,但如果我使用静态版本,我可以.两者都没能给我我想要的东西.静态成员声明确实在静态c'tor或实例c'tor之前被命中.正如预期的那样,静态c'tor在实例c'tor之前被击中.但是在static和instance c'tor中,我的成员的值是0而不是初始值.
我错过了什么?
这是一个经典的"转换为时已晚"的缺陷,我希望C#编译器警告它.您正在以整数执行所有算术运算,然后将结果分配给double.结果是一个整数,1 / 240整数为零.做双打算术:1.0 / 240.0.
我们也看到这个涉及非常数的缺陷,例如,
percentDone = doneSoFar / totalWork;
Run Code Online (Sandbox Code Playgroud)
如果被除数是整数而结果是双,则结果可能为零.
还要注意涉及乘法的相同"转换太晚"缺陷:
double microseconds = seconds * 1000000;
Run Code Online (Sandbox Code Playgroud)
如果seconds是int并且超过几千,那么在它指定为double 之前,它将在整数中溢出,而不是你想要的,这是先转换为double并在双精度中进行乘法运算.同样,应该1000000.0向编译器提示您希望以更高的精度完成操作.