C# 访问从属性自动生成的值类型

C# 访问从属性自动生成的值类型,c#,properties,C#,Properties,在讨论自动生成的属性时,大多数示例都讨论“简单”值类型,例如字符串。但是,如果您想访问在IL中自动生成的值类型字段以备份“自动属性”,该怎么办 编译器不允许这样做:“无法修改'Position'的返回值,因为它不是变量”。我理解为什么我们不能修改这个返回值,但是我们如何访问这些字段呢 说我们有 class A { Vector2 Position { get; set; } public void Foo() { Position.X = 10.0f;

在讨论自动生成的属性时,大多数示例都讨论“简单”值类型,例如字符串。但是,如果您想访问在IL中自动生成的值类型字段以备份“自动属性”,该怎么办

编译器不允许这样做:“无法修改'Position'的返回值,因为它不是变量”。我理解为什么我们不能修改这个返回值,但是我们如何访问这些字段呢

说我们有

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”那么简单)。也,