C# 将浮点的默认值设置为NaN?

C# 将浮点的默认值设置为NaN?,c#,C#,创建浮点时,它的默认值为零。但是,我希望它默认为NaN,因为该值应该是未知的,或者换句话说,它应该指示尚未为其分配任何值。稍后我将赋值,如果可能,如果不可能,属性应保留为NaN,因为找不到它的值。因此,NaN是合适的启动状态。这就是我所做的: class SmallObject { public float A { get; set; } = float.NaN; // slow, but the value is NaN, which is correct public flo

创建浮点时,它的默认值为零。但是,我希望它默认为NaN,因为该值应该是未知的,或者换句话说,它应该指示尚未为其分配任何值。稍后我将赋值,如果可能,如果不可能,属性应保留为NaN,因为找不到它的值。因此,NaN是合适的启动状态。这就是我所做的:

class SmallObject
{
    public float A { get; set; } = float.NaN; // slow, but the value is NaN, which is correct
    public float B { get; set; } = float.NaN; // slow, but the value is NaN, which is correct
    public float C { get; set; } = float.NaN; // slow, but the value is NaN, which is correct
    public float D { get; set; } = float.NaN; // slow, but the value is NaN, which is correct
    public float E { get; set; } = float.NaN; // slow, but the value is NaN, which is correct
}
所有属性都是用float.NaN初始化的,但问题是,这非常慢,因为属性是用值初始化的,我正在创建数百万个SmallObject。下面的速度快得多,但属性值为零:

class SmallObject
{
    public float A { get; set; } // fast, but the value is zero, which is wrong
    public float B { get; set; } // fast, but the value is zero, which is wrong
    public float C { get; set; } // fast, but the value is zero, which is wrong
    public float D { get; set; } // fast, but the value is zero, which is wrong
    public float E { get; set; } // fast, but the value is zero, which is wrong
}
我想要的是这样的东西:

class SmallObject
{
    public myFloat A { get; set; } // fast, and the value is NaN, which is correct
    public myFloat B { get; set; } // fast, and the value is NaN, which is correct
    public myFloat C { get; set; } // fast, and the value is NaN, which is correct
    public myFloat D { get; set; } // fast, and the value is NaN, which is correct
    public myFloat E { get; set; } // fast, and the value is NaN, which is correct
}
在这里,myFloat是一个默认为NaN的自定义浮点,没有任何开销,因此它的运行速度与默认为零的普通浮点一样快。这是可能的吗?谢谢

更新

由于来自评论的反馈,我决定提供度量来支持我的说法,即使用值初始化浮点比单独使用浮点要慢

创建具有5个float属性的1000万SmallObject:

释放32位:32毫秒 释放64位:4毫秒 创建1000万SmallObject,其中5个属性的float初始化为float.NaN:

释放32位:44毫秒 释放64位:53毫秒 正在创建1000万个SmallObject,其中有5个属性为float?:

释放32位:43毫秒 释放64位:4毫秒
所有结果均为中值。如您所见,将浮点初始化为NaN要比在64位版本中不进行初始化慢13.25倍。总之,对于64位版本,float?是创建对象的最佳选择。然而,我注意到下游,漂浮?由于必须经常将其转换为常规浮点以进行计算,例如Math.Abs和Math.Log以及BitConverter,因此可能会导致问题。

您可以创建一个可为空的浮点。可空类型是在C2.0中引入的

float? myNullableFloat;
这应该解决这个问题:

private float foo = Single.NaN;
public float Foo { get => foo; set => foo = value; }

你如何证明你的说法非常缓慢?对我来说,真正的问题是:为什么你要创造数百万个你可能永远不需要的公共财产?使用浮动?可能就是你要找的。我认为C和VB.NET的工作原理有些混乱。@Barns的观点也是正确的。您试图用数百万个属性实现的功能听起来是不稳定的:因为使用值初始化属性要比将其保留为默认值慢。这就是你所相信的。你能证明吗?在这两种情况下,必须在内存中设置位模式。一旦为什么要麻烦???Goggle’过早优化!我只是试着实例化1000000000个10亿个实例。使用默认分配时,我的计算机花费了11.711秒,使用额外的float.NaN分配时,花费了14.635秒。所以看起来有25%左右的细微差别。但是,只有在我们讨论的实例数量非常多的情况下,这才有意义。