我有浮点数组
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 :(得分:4)
您不能在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!
...
我将此更新为更通用,因此您可以将其重复用于其他各种类型,而不仅仅是float
。
答案 1 :(得分:2)
实际上,无法声明具有特定名称的索引器。您必须在其周围包裹一个对象并使用:
public float this[int index] { ...}
在您的情况下,您可以为此案例使用包装类:
public class ArrayWrapper
{
public float this[int index] { ...}
public ArrayWrapper(float[] values) { .... }
}
要使用它,您需要使用ArrayWrapper
- 类作为属性类型。
作为替代方案,您可以使用扩展方法(不太好,因为您需要更改代码):
public static void SetFloat(this float[] @this, int index, float value) { ... }
并以这种方式使用它:
targetObject.Outputs.SetFloat(0, Single.NaN);