Они хранятся на стеке.
Если нужно передать куда-то, то уже зависит:
- Если передается интерфейс - то боксинг и это куча
- Если исходная структура - то просто структура копируется (без боксинга)
Если интересует IDisposable - то тут без боксинга. Компилятор понимает, что нужно просто вызвать Dispose и боксинг не происходит.
struct SomeStruct: IInterface
{ }
void DoSomethingStruct(SomeStruct s)
{ }
void DoSomethingInterface(IInterface i)
{ }
void Main()
{
var s = new SomeStruct();
// Без боксинга
DoSomethingStruct(s);
// Боксинг
DoSomethingInterface(s);
}