簡體   English   中英

C#struct by-ref

[英]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值部分。 這很可能是一種面向對象的方法- 通常,如果您發現自己想做這樣的事情,那么值得研究一下設計和職責。

1個

如何同時分配兩個坐標呢?

map.player = new Point(5, 7);

現在,您可以在播放器屬性中包含驗證邏輯。


2

您真的需要實現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;那將同時影響map1map2

關於使用可變結構還是可變類的問題很簡單,但是“如果可變則使它成為一個類”的概念是完全錯誤的。 只需問問自己,給出:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM