繁体   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