当前位置:  开发笔记 > 编程语言 > 正文

为什么我的const或静态成员没有初始化?

如何解决《为什么我的const或静态成员没有初始化?》经验,为你挑选了1个好方法。

我一直在抓挠这个问题.我怀疑我;我只是在这里愚蠢,但我似乎无法获得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而不是初始值.

我错过了什么?



1> Eric Lippert..:

这是一个经典的"转换为时已晚"的缺陷,我希望C#编译器警告它.您正在以整数执行所有算术运算,然后将结果分配给double.结果是一个整数,1 / 240整数为零.做双打算术:1.0 / 240.0.

我们也看到这个涉及非常数的缺陷,例如,

percentDone = doneSoFar / totalWork;

如果被除数是整数而结果是双,则结果可能为零.

还要注意涉及乘法的相同"转换太晚"缺陷:

double microseconds = seconds * 1000000;

如果seconds是int并且超过几千,那么它指定为double 之前,它将在整数中溢出,而不是你想要的,这是先转换为double并在双精度中进行乘法运算.同样,应该1000000.0向编译器提示您希望以更高的精度完成操作.

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有