我有一個簡單的類,它表示 3 維坐標Coord3,它只具有 x、y 和 zint值。
我想宣告一個靜態常量變數Coord3.zero,其中 x、y 和 z 設定為 0。
我已經嘗試過:
public static readonly Coord3 zero = new Coord3(0, 0, 0);
但是我發現這個變數是可以改變的。例如,如果我這樣做
Coord3 coord = Coord3.zero;
coord.x = 5;
這實際上將 x 值更改Coord3.zero為 5。也許我誤解了readonly?我知道在 UnityVector3.zero中永遠不會改變。我試圖達到同樣的效果。
uj5u.com熱心網友回復:
readonly與您所說的不可變并不完全相同。readonly意味著您不能分配給變數。所以你做不到
public static readonly Cord3 zero = new Cord3(0, 0, 0);
zero = new Cord3(0, 0, 1);
為了達到您想要的效果,您可能需要創建一個具有只讀屬性或欄位的類、結構或記錄。使用內部庫中定義的型別無法實作這種效果。如果型別允許欄位或屬性的可變性,則該欄位或屬性是可變的。
uj5u.com熱心網友回復:
也許我誤會了
readonly?
是的,readonly意味著您不能更改變數的參考。換句話說,你不能寫Coord3.zero = new(...);
現在,這些東西通常寫成s struct,其中的欄位默認是不可變的。那將在那里解決您的問題。在 Unity 中也是如此。請注意,您也可以對類執行此操作,方法是在您的屬性上只使用 getter 并從您的建構式中一次填充它們,但類對于這些小型別來說非常重要。
uj5u.com熱心網友回復:
標記zero為readonly確實可以防止您更改zero商店。您不能重新分配它。
zero = new Coord3(1, 1, 1); // error
請注意,因為Coord3是一個類,zero.x = 5;實際上并沒有改變什么zero商店。您只是在更改zero所參考物件的某些屬性。zero仍然存盤對同一個舊物件的相同參考。
您可以通過不提供任何Coord3會更改其欄位值的公共 API 來防止這種情況發生 - 例如,通過使,x成為所有只讀屬性:yz
public int X { get; }
public int Y { get; }
public int Z { get; }
當然,如果您只想阻止設定屬性 on zero,但允許修改Coord3其他物件,這將不起作用。
我建議你做Coord3一個結構:
public struct Coord3 {
public int X { get; set; }
public int Y { get; set; }
public int Z { get; set; }
}
現在zero直接存盤欄位的值,而不是對物件的參考。zero.x = 5;會產生錯誤,因為您正在修改zero直接存盤的內容。
請注意,Vector3例如,Unity 也是一個結構。
uj5u.com熱心網友回復:
我試圖達到同樣的效果。
對于這個效果,你可以這樣使用。
void Main()
{
Coord3 zero = new Coord3();
zero.Zero();
}
public class Coord3
{
public Coord3()
{
}
public Coord3(int x,int y,int z)
{
X=x;
Y=y;
Z=z;
}
public void Zero(){
X=0;
Y=0;
Z=0;
}
public int X { get; set; }
public int Y { get; set; }
public int Z { get; set; }
}
uj5u.com熱心網友回復:
我認為你可以創建一個不可變的基類并Coord3繼承這個類。
public class BaseCoord3
{
// protected means it can only be used by BaseCoord3 and Coord3
protected int x;
// equivalent to public int X { get { return x; } }
public int X => x;
}
public class Coord3 : BaseCoord3
{
public override int X
{
get { return x; }
set { x = value; }
}
public static BaseCoord3 Zero => new BaseCoord3(0,0,0);
}
這應該類似于在 c# 中使用只讀版本的集合的方式。我認為結構解決方案是要走的路。
uj5u.com熱心網友回復:
您如何只使用 get-property 從不更改zero物件?
public class Coord3
{
public static Coord3 Zero => new Coord3(0,0,0);
}
然后您將無法更改 的值Zero,但您將保持Coord3物件的功能。
Coord3 a = Coord3.Zero;
a.x = 2; // changes a.x, but not Coord3.Zero.x
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/439319.html
標籤:C#
上一篇:帶有文本檢查/驗證的C#登錄錯誤
下一篇:未定義值的索引處的陣列值
