![](/img/trans.png)
[英]Passing both stackalloc'ed Span<T> and by-ref struct as arguments
[英]C# struct by-ref
C#中有什么方法可以做到這一點:
map.player.x = 5;
同時保持Point
類型(或無聲轉換為一個)的player
,並且在進行分配時仍然能夠檢查該值的正確性?
要更清楚:
Point
是C#/。net標准庫定義的結構,並按值傳遞。 Point
的方法,例如呼叫中指向Point
是漫長而乏味。 Point
的隱式覆蓋只允許上述內容。 它必須寫為(Point)(map.player).x
,很笨拙。 如果我理解正確,那么您似乎希望通過定義類型轉換來獲得一定的靈活性。 那不會太遠。
避免使用可變結構(值類型)。 struct Point
是舊Win32 API的一個不幸殘left。
因此,瞄准map.player = new Point(5, map.player.y);
號無論player
是一個變量 ,在這種情況下,你沒有得到任何機會,以驗證分配過程中的變化,或player
是一個屬性 ,在這種情況下,表達map.player
被歸類為一個值 ,你不允許設置x
部分(這將是無用的)。
我建議您創建一個方法,以便可以調用:
map.SetPlayerX(5);
...或者您可以更改Player
類擁有的較大操作的x
值部分。 這很可能是一種面向對象的方法- 通常,如果您發現自己想做這樣的事情,那么值得研究一下設計和職責。
如何同時分配兩個坐標呢?
map.player = new Point(5, 7);
現在,您可以在播放器屬性中包含驗證邏輯。
您真的需要實現System.Drawing.Point
所有功能嗎? 僅使用您真正需要的東西來實現自己的版本並不難。 Point
沒有太多邏輯。
有人建議使用類類型來保存X和Y值。 我對這種方法持懷疑態度,並建議在許多情況下,將player
公開為字段所獲得的語義會更加簡潔(盡管我不清楚為什么map
有一個名為player
的成員。如果map
引用了MapType
,並且MapType
實例具有一個結構類型為player
的字段,字段x
為整數類型,很明顯,對map.player.x
的更改將影響一個MapType
實例。此外,說map1.player = map2.player;
將相比之下,將字段從map2.player
復制到map1.player
。相比之下,如果player
是類類型,並且一個人做了map1.player = map2.player; map1.player.x = 5;
那將同時影響map1
和map2
。
關於使用可變結構還是可變類的問題很簡單,但是“如果可變則使它成為一個類”的概念是完全錯誤的。 只需問問自己,給出:
thing1 = thing2; thing1.x = 5;
您是否要第二條語句影響thing2.x
的值? 如果是,請使用課程。 如果否,請使用結構。
順便說一句,如果您不希望地圖類型將player
為字段,則需要考慮的另一種模式是使其顯示ActOnPlayer方法:
public delegate ActionByRef<T>(ref T p); public delegate ActionByRef<T1,T2>(ref T1 p1, ref T2 p2); public void ActOnPlayer(ActionByRef<playerType> proc;) { proc(ref _player); } public void ActOnPlayer<T>(ActionByRef<playerType,T> proc, ref T param;) { proc(ref _player, ref param); } ... sample usage: map.ActOnPlayer((ref playerType it, ref int theParam) -> {it.x = theParam;}, someIntVariable);
請注意,后一種方法看起來類似於使用閉包,但是與使用閉包不同,它不會生成任何新的臨時堆對象,因此不會對垃圾收集器造成任何壓力。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.