Ehsan Sajjad Ответов: 1

Реальный usecase для одного и того же fieldoffset на нескольких полях


Привет, читаю книгу CLR через C# на страница 124 существует дискуссия об изменении вида макета для типов значений для обеспечения совместимости, и есть приведенный пример, который использует то же самое FieldOffSet для нескольких полей.

Что я уже пробовал:

Я понимаю, что память обоих полей перекрывается, и изменение одного поля приведет к изменению значения другого поля, но то, о чем я думаю, - это реальный случай использования, когда он нам понадобится или использовался в прошлом? вот код для примера:


[StructLayout(LayoutKind.Explicit)]
public struct SomeValType {
[FieldOffset(0)]
public  Int16 m_b; // The m_b and m_x fields overlap each
[FieldOffset(0)]
public  Int32 m_x; // other in instances of this type
}
}


и когда я написал следующий код в Main, он вызвал 10 как значение в m_x поле :


SomeValType obj = new SomeValType();
obj.m_b = 10;
Console.WriteLine(obj.m_x);


Может ли кто-нибудь пролить свет на это? это будет высоко оценено.

Спасибо!

1 Ответов

Рейтинг:
12

Afzaal Ahmad Zeeshan

Хммм, интересный вопрос, но это возвращает многое к старым школам и может потребовать обсуждения некоторых низкоуровневых вещей, которые я лично игнорирую, когда речь заходит о C#.

Первое, что нужно понять, это то, что вы хотите переставить биты и их расположение, только если вы точно знаете, что вы делаете и почему вы делаете. Когда я прочитал Ваш вопрос, Первое, что пришло мне в голову после прочтения,

Цитата:
изменение одного поля приведет к изменению значения другого поля
была ли польза от union в C, где ваш тип имел максимальный размер, установленный на самое большое поле, и мог содержать одно значение. Такой же случай был бы и здесь, если бы у вас было 5 полей (все с FieldOffset(0)), то все они будут изменять предыдущий контент. Пожалуйста, прочитайте немного больше о союзах и различиях структур здесь, по следующим ссылкам (Я знаю, что вы знаете об этом, но все же ради будущих посетителей),

Союзы В С[^]
struct-разница между структурой и объединением в C-Stack Overflow[^]

Выдержка из последней ссылки,
Цитата:
С объединением вы должны использовать только один из элементов, потому что все они хранятся в одном и том же месте.

Я также думал о ссылках, где вы изменяете предыдущий материал, но это что-то другое и не изменяете поля одного и того же объекта, а работаете непосредственно с объектами.

Наконец, Вам также нужно проверить размер переменных, одна из ваших переменных была Int16, а другая-Int32, они имеют разные размеры, поэтому они определенно вызовут проблему или, возможно, сбои в низкоуровневой памяти — в чем я не уверен, поэтому не буду углубляться. Но дело в том, что никогда не используйте его по-настоящему. :смеяться:

В C# или даже C++ я не вижу никакой пользы от этого, когда вы собираетесь хранить только одно поле за раз, а остальные поля либо являются мусором, либо вообще не используются, почему бы не иметь переменную в первую очередь?