【发布时间】:2019-02-13 04:57:55
【问题描述】:
考虑以下代码:
public struct Vector2
{
public float X;
public float Y;
}
public class Sprite
{
private Vector2 position;
public ref Vector2 Position => ref position;
private void DoStuffWhenPositionChanges() { /*...code...*/ }
}
ref return 允许我执行以下设置操作:
someSprite.Position.X++;
someSprite.Position.Y = 42;
我想在设置Position 结构的X 或Y 组件时调用DoStuffWhenPositionChanges。注意,Vector2 是库级结构,不能在我的代码中更改。
我正在寻找类似的解决方案:
public class Sprite
{
private Vector2 position;
public Vector2 Position
{
get => position; //ref return not possible!
set
{
position = value;
DoStuffWhenPositionChanges();
}
}
private void DoStuffWhenPositionChanges() { /*...code...*/ }
}
...但使用ref return,以避免在调用代码中执行以下操作:
someSprite.Position = new Vector2(someSprite.Position.X, someSprite.Position.Y + 1);
我考虑过INotifyPropertyChanged,但由于我无法修改库级别的Vector2 结构,我需要一个替代解决方案。我还考虑了一种代理类型,可以隐式转换为 Vector2,它可以实现INotifyPropertyChanged,但这似乎……很麻烦;也许有一个我不知道的更清洁的解决方案。
根据上述设置,是否可以知道ref return 属性的基础值何时发生变化?
【问题讨论】:
-
为什么不实现
Translate()方法? -
Vector2来自哪个框架/库?我不认为您要求的内容是可能的,但该框架可能会提供例如“已移动”事件,该事件将为您提供类似的信息。 -
Framework/library 并不真正相关,因为我正在寻找更通用的解决方案(实现
Translate()方法也是如此)。这个非常具体的例子是 MonoGame 框架;我没有标记 MonoGame,因为它恰好是我的问题的上下文。在这个非常特殊的情况下,我可以为 X 和 Y 组件提供传递属性;但它不适用于更大的结构。对于这个问题,我提供的示例恰好是minimal reproducible example。 -
这有点像在你提供了一个方法的响应之后,试图知道其他一些代码对 its 变量做了什么。在调试场景(例如数据断点)之外,您不会发现。