.NET中A类(对象)的大小

CSh*_*oob 16 .net c# class

如何确定.NET中的Class是大还是小?它是根据它的属性或字段的数量,其属性/字段的数据类型来衡量的吗?或返回类型的方法?它的方法的参数?访问其方法的修饰符,虚方法?谢谢..

 class A
{

  string x { get; set; }
}

class B 
{
  int x { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,如果我像这样实例化A类和B类

 A objA = new A();
 B objB = new B();
Run Code Online (Sandbox Code Playgroud)

类objA是更大的一个,因为它包含一个String属性而objB只包含一个Int?虽然我没有为它的财产设定任何价值.谢谢

编辑:只是为了澄清我的问题

假设我有一堂课

public class Member
{
    public string MainEmpId { get; set; }
    public string EmpId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和另一堂课

public class User
{
    public string AccessLevel { get; set; }
    public string DateActivated { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Mi { get; set; }
    public string Password { get; set; }
    public string UserId { get; set; }
    public string UserName { get; set; }
    public string Active { get; set; }
    public string ProviderName { get; set; }        
    public string ContactPerson { get; set; }
    public string Relation { get; set; }
    public string Landline { get; set; }
    public string MobileNo { get; set; }
    public string Complaint { get; set; }
    public string Remarks { get; set; }
    public string Reason { get; set; }
    public string RoomType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果我像这样实例化它

  Member A = new Member();
  User B = new User()
Run Code Online (Sandbox Code Playgroud)

对象A是否大于对象B?我知道这是一个奇怪的问题,但我相信一个对象的每个实例化都会占用内存空间.

Guf*_*ffa 42

类实例的大小由以下因素确定:

  • 实际存储在实例中的数据量
  • 值之间需要填充
  • 内存管理使用的一些额外内部数据

因此,通常需要一个包含字符串属性的类(在32位系统上):

  • 内部数据为8个字节
  • 字符串引用的4个字节
  • 4个字节的未使用空间(达到内存管理器可以处理的最小16个字节)

通常,包含整数属性的类需要:

  • 内部数据为8个字节
  • 整数值为4个字节
  • 4个字节的未使用空间(达到内存管理器可以处理的最小16个字节)

如您所见,字符串和整数属性占用了类中的相同空间,因此在第一个示例中,它们将使用相同的内存量.

string属性的值当然是另一回事,因为它可能指向堆上的字符串对象,但这是一个单独的对象,而不是指向它的类的一部分.

对于更复杂的类,填充起作用.例如,包含布尔值和字符串属性的类将使用:

  • 内部数据为8个字节
  • 布尔值为1个字节
  • 3个字节的填充以获得均匀的4字节边界
  • 字符串引用的4个字节

请注意,这些是类的内存布局示例.确切的布局取决于框架的版本,CLR的实现,以及它是32位还是64位应用程序.由于程序可以在32位或64位系统上运行,因此编译器甚至不知道内存布局,而是在执行之前代码是JIT:ed时决定.

  • @Amby:不,它的大小为16个字节.在32位系统上,它将包含8个字节的内部数据和8个字节的未使用空间,在64位系统上,它将包含16个字节的内部数据,并且没有未使用的空间. (2认同)

Dan*_*ker 10

通常,当一个类具有许多实例(非静态)字段时,无论其值如何,它都会更大; 类的最小内存为12个字节,引用类型的字段在32位系统上为4个字节,在64位系统上为8个字节.其他字段可以通过填充到字边界来布局,使得具有四个byte字段的类实际上可以占用存储器中的4个字节的四倍.但这一切都取决于运行时.

不要忘记可能隐藏的字段,例如,自动属性声明.由于它们在内部由字段支持,因此它们将增加类的大小:

public string MyProperty
{ get; set; }
Run Code Online (Sandbox Code Playgroud)

请注意,以下属性对类大小没有影响,因为它不受字段支持:

public bool IsValid
{ get { return true; } }
Run Code Online (Sandbox Code Playgroud)

要了解类或结构实例的内存大小:在类上应用该[StructLayout(LayoutKind.Sequential)]属性并调用Marshal.SizeOf()类型或实例.

[StructLayout(LayoutKind.Sequential)]
public class MyClass
{
    public int myField0;
    public int myField1;
}

int sizeInBytes = Marshal.SizeOf(typeof(MyClass));
Run Code Online (Sandbox Code Playgroud)

但是,因为运行时可以按照自己的意愿在内存中布局类,所以实例使用的实际内存可能会有所不同,除非您应用了StructLayoutAttribute.