追查NaN的原因浮

问题描述:

我有int数组追查NaN的原因浮

public float[] Outputs; 
在我的代码

某处,东西更新数组值,造成NaN的。这是一个非常偶尔的错误,我不能解决我的生活是什么导致它。

如何使用最少的代码更改进行更改以追踪它?将该阵列设置为私有并重新命名会很好,然后创建一个名为Outputs的属性,以获取和设置每次设置NaN时进行检查。然后,当NaN被设置并检索一个调用栈时,我可以轻松地引发一个异常,而不是在另一段代码尝试使用它时发现它。像这样 - 实际上编译。

我得到的错误:

"Bad array declarator: To declare a managed array the rank specifier precedes 
the variable's identifier. To declare a fixed size buffer field, use the fixed 
keyword before the field type." 

这里是我的代码:

public float[] _outputs; 

    public float Outputs[int index] 
    { 
     get 
     { 
      return _outputs[index]; 
     } 
     set 
     { 
      if (float.IsNaN(value)) 
       throw new Exception("Blar blar"); 
      _outputs[index] = value; 
     } 
    } 

编辑:谢谢你的答案的人,其他人寻找答案可能需要阅读此: Why C# doesn't implement indexed properties?

+0

你的问题是什么? – Kenneth 2013-05-12 10:01:20

+1

为什么不能正常工作? – 2013-05-12 10:02:18

+0

我已将其更新以使问题更清楚。我无法获得编译的代码。 – 2013-05-12 10:03:48

您不能使用命名索引在C#中,作为一种解决方法,你可以这样做:

public class Indexer<T> 
{ 
    private T[] _values; 

    public Indexer(int capacity) 
    { 
     _values = new T[capacity]; 
    } 

    protected virtual void OnValueChanging(T value) 
    { 
     // do nothing 
    } 

    public T this[int index] 
    { 
     get { return _values[index]; } 
     set 
     { 
      OnValueChanging(value); 
      _values[index] = value; 
     } 
    } 
} 

public class FloatIndexer : Indexer<float> 
{ 
    public FloatIndexer(int capacity) 
     : base(capacity) 
    { 
    } 

    protected override void OnValueChanging(float value) 
    { 
     if (float.IsNaN(value)) 
      throw new Exception("Blar blar"); 
    } 
} 

public class Container 
{ 
    public Container() 
    { 
     Outputs = new FloatIndexer(3); 
    } 

    public FloatIndexer Outputs { get; private set; } 
} 
... 
var container = new Container(); 
container.Outputs[0] = 2.5f; 
container.Outputs[1] = 0.4f; 
container.Outputs[2] = float.NaN; // BOOM! 
... 

我更新这是更通用的,所以你可以重新-U它适用于各种其他类型,而不仅仅是float

实际上,不可能用特定名称声明索引器。你必须环绕它和使用对象:

public float this[int index] { ...} 

你的情况,你可以使用一个包装类这种情况:

public class ArrayWrapper 
{ 
    public float this[int index] { ...} 
    public ArrayWrapper(float[] values) { .... } 
} 

你需要使用ArrayWrapper -class物业使用类型。

作为替代方案(因为你需要改变的代码不那么精细),你可以使用一个扩展方法:

public static void SetFloat(this float[] @this, int index, float value) { ... } 

而且使用这种方式:

targetObject.Outputs.SetFloat(0, Single.NaN); 
+0

扩展方法建议还需要'index'作为参数传入。 – James 2013-05-12 10:38:08

+0

@James我正是这么做的,很快就忘记了。 – 2013-05-12 11:15:06