C# Memory Management Explained: Value Types vs. Reference Types