考虑以下代码:
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;
无论何时设置DoStuffWhenPositionChanges
结构的X
或Y
组件,我都想调用Position
。请注意,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
属性的基础值何时更改?
答案 0 :(得分:0)
一种方法是为Struct创建包装器,然后实现RaisePropertyChanged
方法或INotifyPropertyChanged
:
public struct Vector2
{
public float X;
public float Y;
}
public class VectorWrapper
{
private Vector2 thing;
public var X
{
get { return thing.X; }
set { thing.X = value; RaisePropertyChanged(SomePropertyName); }
}
public var Y
{
get { return thing.Y; }
set { thing.Y = value; RaisePropertyChanged(SomePropertyName); }
}
}
答案 1 :(得分:0)
有点hack,但这可以完成工作。
static void Main(string[] args)
{
var s = new Sprite();
s.DoStuffWhenPositionChanges(s.Position.X++);
}
public struct Vector2
{
public float X;
public float Y;
}
public class Sprite
{
private Vector2 position;
public ref Vector2 Position => ref position;
public void DoStuffWhenPositionChanges(float f = default)
{
}
}