取消装箱后更改结构字段到对象
Changing struct fields after unboxing to object
我想知道是否可以在不使用 setter 的情况下做到这一点。
void Main()
{
Point p = new Point();
p.x = 7;
Object o = p;
((Point)o).y = 9; // This doesnt work !
((Point)o).Print();
}
struct Point
{
public int x, y;
public void Print()
{
System.Console.WriteLine("x= "+this.x+"\ny= "+this.y);
}
}
是否可以仅通过转换和拆箱来更改 y 值?
提前致谢
(Un)装箱是复制操作。您不是在修改盒装结构的值,您只是在修改一个副本 - 之后您会立即将其丢弃。
这与二传手无关。你只是在修改错误的值:)
如果需要修改一个boxed struct,基本上需要手动复制,然后再复制回去:
var p2 = (Point)o;
p2.y = 9;
o = (object)p2;
不用说,这有点浪费。如果你真的需要做这样的事情(而且很难看出 为什么 ),你可能想要创建一个手动装箱对象 - 类似于
class MyBox<T> where T : struct
{
public T Value;
}
这允许你做
var o = (object)new MyBox<Point> { Value = p };
((MyBox<Point>)o).Value.y = 9;
请注意 Value
是一个 字段 而不是 属性 - 我们不是复制,而是直接引用 "boxed" 值。
如果你可以改变结构点,你可以做的是让点实现一个接口,然后将装箱结构转换为接口。这是有效的,因为当您将装箱点投射到界面时不会发生拆箱。
这是示例代码,
public static void Main()
{
Point p = new Point();
p.x = 7;
object o = p;
((IModifiablePoint)o).Y = 9; // This works
((Point)o).Print();
}
interface IModifiablePoint
{
int X { get; set; }
int Y { get; set; }
}
struct Point : IModifiablePoint
{
public int x, y;
public int X
{
get { return x; }
set { x = value; }
}
public int Y
{
get { return y; }
set { y = value; }
}
public void Print()
{
System.Console.WriteLine("x= " + this.x + "\ny= " + this.y);
}
}
}
我想知道是否可以在不使用 setter 的情况下做到这一点。
void Main()
{
Point p = new Point();
p.x = 7;
Object o = p;
((Point)o).y = 9; // This doesnt work !
((Point)o).Print();
}
struct Point
{
public int x, y;
public void Print()
{
System.Console.WriteLine("x= "+this.x+"\ny= "+this.y);
}
}
是否可以仅通过转换和拆箱来更改 y 值? 提前致谢
(Un)装箱是复制操作。您不是在修改盒装结构的值,您只是在修改一个副本 - 之后您会立即将其丢弃。
这与二传手无关。你只是在修改错误的值:)
如果需要修改一个boxed struct,基本上需要手动复制,然后再复制回去:
var p2 = (Point)o;
p2.y = 9;
o = (object)p2;
不用说,这有点浪费。如果你真的需要做这样的事情(而且很难看出 为什么 ),你可能想要创建一个手动装箱对象 - 类似于
class MyBox<T> where T : struct
{
public T Value;
}
这允许你做
var o = (object)new MyBox<Point> { Value = p };
((MyBox<Point>)o).Value.y = 9;
请注意 Value
是一个 字段 而不是 属性 - 我们不是复制,而是直接引用 "boxed" 值。
如果你可以改变结构点,你可以做的是让点实现一个接口,然后将装箱结构转换为接口。这是有效的,因为当您将装箱点投射到界面时不会发生拆箱。
这是示例代码,
public static void Main()
{
Point p = new Point();
p.x = 7;
object o = p;
((IModifiablePoint)o).Y = 9; // This works
((Point)o).Print();
}
interface IModifiablePoint
{
int X { get; set; }
int Y { get; set; }
}
struct Point : IModifiablePoint
{
public int x, y;
public int X
{
get { return x; }
set { x = value; }
}
public int Y
{
get { return y; }
set { y = value; }
}
public void Print()
{
System.Console.WriteLine("x= " + this.x + "\ny= " + this.y);
}
}
}