Qual é a diferença entre value types e reference types em C#?
Um value type (struct, int, bool, enum) guarda seus dados diretamente e é copiado na atribuição; um reference type (class, string, arrays) guarda um ponteiro para dados na heap, e na atribuição o ponteiro é copiado, não o objeto. Passar uma struct para um método que a modifica opera silenciosamente sobre uma cópia, a menos que você a passe por ref. Uma struct guardada num campo de uma classe fica na heap junto com ela, não na stack.