![](/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.