2013-05-12 53 views
2

我有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

回答

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! 
... 

我更新這是更通用的,所以你可以重新-U它適用於各種其他類型,而不僅僅是float

2

實際上,不可能用特定名稱聲明索引器。你必須環繞它和使用對象:

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