先上代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp
{
  public class Program
  {
    public struct structA
    {
      public int fieldA;
      public int propertyB { get; set; }
    }
    public struct structB
    {
      public int fieldA;
      public int propertyB { get { return 0; } set { } }
    }
    static void Main(string[] args)
    {
      Console.WriteLine($"{nameof(structA)} size is: {Marshal.SizeOf<structA>()}");
      Console.WriteLine($"{nameof(structB)} size is: {Marshal.SizeOf<structB>()}");
      Console.ReadLine();
    }
  }
}
猜猜结果是什么?不卖关子,结果如下:
structA size is: 8
structB size is: 4
个人结论:
在C#的结构体(struct)中,属性(property)如果没有手工实现getter/setter,则会在结构体本身内开辟空间存储该属性的值,如果有实现getter/setter, 则该属性不占用结构体的空间。