我一直在抓挠这个问题.我怀疑我;我只是在这里愚蠢,但我似乎无法获得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(); } } }
控制台输出是:
static c'tor: 0 instance c'tor: 0
无法在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;
如果被除数是整数而结果是双,则结果可能为零.
还要注意涉及乘法的相同"转换太晚"缺陷:
double microseconds = seconds * 1000000;
如果seconds
是int并且超过几千,那么在它指定为double 之前,它将在整数中溢出,而不是你想要的,这是先转换为double并在双精度中进行乘法运算.同样,应该1000000.0
向编译器提示您希望以更高的精度完成操作.