代码之家  ›  专栏  ›  技术社区  ›  JeffH

为什么在设计器中为控件的属性指定一个数值会导致代码中出现新的十进制(new int[]…?

  •  3
  • JeffH  · 技术社区  · 16 年前

    在VS2005的C.NET WinForm应用程序中,我有一个NumericUpDown控件。在设计器中,我将numericupdown的最小属性设置为-65535。

    在表单的.designer.cs代码中,我希望看到:

    this.myNumericUpDown.Minimum = -65535;
    

    但相反,我得到:

        this.myNumericUpDown.Minimum = new decimal(new int[] {
        65535,
        0,
        0,
        -2147483648}); 
    

    我知道这意味着什么 int32[] decimal constructor 但是,为什么设计者使用该窗体而不是输入值,或者甚至使用 int32 decimal constructor ?

    2 回复  |  直到 16 年前
        1
  •  3
  •   csharptest.net    16 年前

    理论上,设计师可以存储原始输入文本。然而,由于可视化设计器还可以修改这些值(即左、上等),因此在序列化期间,它必须将此存储与控件的值协调起来。这可能是设计器不存储输入的文本值的一个原因,相反,它会获取文本并将其转换为可放入控件中的值。当需要序列化时,它只读取控件的属性并写入它们。在存储之前,几乎没有必要询问十进制的细节,只是为了优化要使用的构造函数。它需要处理十进制类型的所有可能值,因此int[]为十进制可以表示的任何值提供了一个往返可靠的存储机制。

    顺便说一句,下面概述了十进制的内部结构:

    • 位是一个由32位有符号整数组成的四元素数组。
    • 位[0]、位[1]和位[2]包含96位整数的低、中和高32位。
    • 位[3]包含比例因子和符号,并由以下部分组成:
      • 低位0到15是未使用的,必须是零。
      • 位16到23必须包含一个介于0和28之间的指数,这表示10的幂除以整数。
      • 位24到30未使用,必须为零。
      • 位31包含符号;0表示正,1表示负。

    更新:

    你能解释一下“…因为视觉设计师也可以修改这些值,…”它必须在序列化期间将此存储与控件的值协调起来……更详细地说?

    当然。我只是想解释一下你的问题“为什么设计师使用那种形式 而不是把我输入的值 “。基本上,我要说的是,设计师没有跟踪你输入的确切文本值“-65535”。相反,它将其转换为具有类似decimal.parse(…)的十进制。然后将这个小数点放入控件的值中,在本例中是numericupdown.minimum。在单词后面,它通过读取每个属性值来序列化XXXX.designer.cs文件中控件的状态。因此,它不再具有您输入的原始文本“-65535”的副本,而是只具有生成的十进制值。

    提到“协调此存储…”的部分只是简单地指出,不仅很难跟踪用户输入的原始文本,而且很难检测原始文本输入是否被其他方法更改了该值。

    对不起,如果这仍然令人困惑的话,我很难描述它。英语是我的第五种语言,在C语言、C++、SQL和JScript之后,所有这些都比英语更明确。

        2
  •  0
  •   Florian Doyon    16 年前

    这可能是一些过早的优化,迫使小数的指数部分为0,以便与其他小数进行更快的比较,而无需进行任何缩放,或进行更快的增量/减量操作。

    this.myNumericUpDown.Minimum = new decimal(new int[] {
        65535,
        0,
        0,
        -2147483648}); // -2147483648 == 10000000000000000000000000000000b
                       // => only sign bit is set