C# 访问从属性自动生成的值类型
在讨论自动生成的属性时,大多数示例都讨论“简单”值类型,例如字符串。但是,如果您想访问在IL中自动生成的值类型字段以备份“自动属性”,该怎么办 编译器不允许这样做:“无法修改'Position'的返回值,因为它不是变量”。我理解为什么我们不能修改这个返回值,但是我们如何访问这些字段呢 说我们有C# 访问从属性自动生成的值类型,c#,properties,C#,Properties,在讨论自动生成的属性时,大多数示例都讨论“简单”值类型,例如字符串。但是,如果您想访问在IL中自动生成的值类型字段以备份“自动属性”,该怎么办 编译器不允许这样做:“无法修改'Position'的返回值,因为它不是变量”。我理解为什么我们不能修改这个返回值,但是我们如何访问这些字段呢 说我们有 class A { Vector2 Position { get; set; } public void Foo() { Position.X = 10.0f;
class A
{
Vector2 Position { get; set; }
public void Foo()
{
Position.X = 10.0f; // Not allowed!
}
}
如何在类A中访问和设置Vector2实例的字段X
访问从属性自动生成的引用类型
您的问题是Vector2
不是引用类型;它是一种值类型。当您访问属性Position
时,将返回一个副本,因此您正在尝试对临时属性进行变异。在这种情况下,您需要设置一个全新的值:
Position = new Vector2(10.0, Position.Y);
在这种情况下,您也可以创建专用字段,而不使用自动属性:
class A
{
Vector2 _position;
Vector2 Position
{
get { return _position; }
set { _position = value; }
}
public void Foo()
{
_position.X = 10.0f;
}
}
文档:Vector2实际上是一种值类型,而不是引用类型。您必须创建一个新矢量2:
Postion = new Vector2(10.0f, Position.Y);
谢谢所以,仅仅因为Vector2恰好是一种值类型,我们不能以这种方式使用属性,因为生成的Getter会返回一个副本。我认为在这种情况下,最好有支持的底层变量可用,这样我们就不必因为使用值类型而对属性进行不同的处理…@user1610325:当然,代码的用户没有这种特权。不过没关系,因为他们会知道到底发生了什么。框架本身定义了具有值类型属性的类型(例如,
Form.Location
)。顺便说一句。。。我首先完全回答了这个问题,你应该选我的:D抱歉,还没看懂支票的内容:-)。在您看来,您会引入_位置变量解决方案,它允许直接操作字段,还是只创建全新的Vector2实例?我想,在这种情况下,在堆栈上创建新的值类型不应该有太大的开销?(我是一名迁移到C#的Java/C++开发人员)@user1610325:关于这一点:“我想在堆栈上添加新的值类型”-这些值类型不一定是堆栈分配的(实际上肯定不会),因为它们是父对象的一部分。不管怎样,这可能是一个过早的优化,但是您最好阅读值类型v引用类型的语义(它不像“stack v heap”那么简单)。也,