這是一個專門在 Unity 環境中的 C# 問題(在這里可能相關也可能不相關)。
我在屬性中有一個特定條件,如下所示:
public override bool IsFinished
{
get
{
return buildable == null || (buildable != null && buildable.BuildingComplete);
}
}
buildable 變數是一個 IBuildable,在本例中是一個已經通過 GameObject.Destroy 方法銷毀的 GameObject。
現在這個條件在這種情況下應該為真,因為游戲物件已被銷毀,并且可構建變數已經為空。但是在 Unity 中,當您銷毀游戲物件時,您仍然可以訪問該物件的屬性,即使buildable == null
比較回傳 true。
問題是:即使 buildable 實際上為 null,該屬性也會回傳 false。證明如下:
有任何想法嗎?
uj5u.com熱心網友回復:
布林值的默認值為 false。在除錯模式下,當一行被突出顯示時,執行還沒有在它上面運行。因此,該行未執行,該運算式尚未計算。只需將該 return 陳述句更改為:
var result = buildable == null || (buildable != null && buildable.BuildingComplete);
return result;
然后在結果行放置一個斷點,并在命中該斷點時檢查結果。
順便說一句,正如@gunr2171 在評論中指出的那樣,buildable != null
該運算式不需要。
uj5u.com熱心網友回復:
謝謝你們的快速回答。== 運算子在 Unity 中確實被這個特定的運算子覆寫(我對此無能為力,因為它在庫本身中)。
我重寫了它,所以你可以看到,我知道布林值的默認值為 false。
正如您在此處看到的,即使 buildable 為 null,它仍然可以被評估并且其中實際上有值。我唯一不能理解的是左側條件仍然為真(可構建 == null 評估為真)但結果為假。
uj5u.com熱心網友回復:
好吧,我剛剛發現一些傳說已經發現了。這是因為 Unity 的運算子多載,所以這是解決方案,我剛剛測驗過,它可以作業。我現在沒有使用 buildable == null ,而是使用這種方法,并且效果很好。
/// <summary>
/// Returns true if the object is either a null reference or has been destroyed by unity.
/// This will respect ISPDisposable over all else.
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static bool IsNullOrDestroyed(this System.Object obj)
{
if (object.ReferenceEquals(obj, null)) return true;
if (obj is UnityEngine.Object) return (obj as UnityEngine.Object) == null;
return false;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/490176.html