Почему я не могу изменить поля в структуре, которая используется как свойство после создания экземпляра? - PullRequest
2 голосов
/ 25 марта 2011

У меня есть структура в C #, определенная следующим образом (упрощенная для демонстрационных целей), которую я использую при вызовах взаимодействия с собственной DLL:

[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct MyStruct
{
    private byte val0;
    private byte val1;
    private byte val2;
    private byte val3;

    public MyStruct(UInt32 id)
    {
        this.val0 = (byte)id;
        id >>= 8;
        this.val1 = (byte)id;
        id >>= 8;
        this.val2 = (byte)id;
        id >>= 8;
        this.val3 = (byte)id;
    }

    public void Clear()
    {
        this.val0 = this.val1 = this.val2 = this.val3 = 0;
    }

    public override string ToString()
    {
        return
            this.val3.ToString("X2") + this.val2.ToString("X2") + "-" +
            this.val1.ToString("X2") + this.val0.ToString("X2");
    }
}

Обновление: Эта структурасвойство в другом классе.Следующее:

public class MyClass
{
    MyStruct MyStruct { get; set; }
}

Когда я создаю экземпляр структуры со значением и следую за этим при вызове Clear (), содержимое не очищается.Когда я вхожу в метод Clear () с отладчиком, я вижу, что каждое поле очищается.Тем не менее, после завершения вызова Clear () исходный экземпляр структуры остается неизменным со своими первоначально созданными значениями.

MyClass class1 = new MyClass();
class1.MyStruct = new MyStruct(0x12345678);
System.Diagnostics.Debug.WriteLine("Init: " + class1.MyStruct.ToString());
class1.MyStruct.Clear();
System.Diagnostics.Debug.WriteLine("Clear: " + class1.MyStruct.ToString());

Приведенный выше результат приводит к следующему выводу:

Init: 1234-5678
Очистить: 1234-5678

Почему это так?Можно ли очистить структуру после ее создания?

Редактировать: Пример кода и результаты можно увидеть здесь: http://ideone.com/6szn9

Редактировать: Пересмотренный вопрос, чтобы более точно отразить проблему, связанную с объектом доступа.

Ответы [ 2 ]

5 голосов
/ 25 марта 2011

Не делает это для меня.http://ideone.com/PDLnt

Использует ли ваш реальный код свойство случайно?Получатель свойства делает копию при возврате.

0 голосов
/ 19 декабря 2011

То, что вы видите, является существенным ограничением в работе свойств. Если вы хотите изменить структуру, которая доступна только как свойство, а не как поле, вам придется прочитать структуру во временную переменную, изменить ее и сохранить обратно. Некоторые утверждают, что это аргумент против изменчивых структур. Я бы сказал, что, хотя ограничение к сожалению, код вроде:

  Rectangle tempRect = thing.Bounds;
  tempRect.X += 10;
  thing.Bounds = tempRect;

понятнее и понятнее, чем если бы Rectangle был чем-то иным, чем изменяемая структура.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...