C# 类(对象)在.NET中的大小
如何确定.NET中的类是大还是小?是否根据其属性或字段的数量、属性/字段的数据类型进行测量?还是返回方法的类型?它的方法的参数?访问其方法的修改器,虚拟方法?谢谢C# 类(对象)在.NET中的大小,c#,.net,class,C#,.net,Class,如何确定.NET中的类是大还是小?是否根据其属性或字段的数量、属性/字段的数据类型进行测量?还是返回方法的类型?它的方法的参数?访问其方法的修改器,虚拟方法?谢谢 class A { string x { get; set; } } class B { int x { get; set; } } 在这个例子中,如果我像这样实例化类A和B A objA = new A(); B objB = new B(); Member A = new Member(); Use
class A
{
string x { get; set; }
}
class B
{
int x { get; set; }
}
在这个例子中,如果我像这样实例化类A和B
A objA = new A();
B objB = new B();
Member A = new Member();
User B = new User()
类objA是更大的一个,因为它持有一个字符串属性,而objB只持有一个Int?虽然我没有为它的属性设置任何值。谢谢
编辑:只是为了澄清我的问题
假设我有一节课
public class Member
{
public string MainEmpId { get; set; }
public string EmpId { get; set; }
}
还有一节课
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; }
}
如果我像这样实例化它
A objA = new A();
B objB = new B();
Member A = new Member();
User B = new User()
物体A比物体B大吗?
我知道这是一个奇怪的问题,但我相信一个对象的每一次插入都会占用内存空间。一般来说,当一个类有许多实例(非静态)字段时,不管它们的值是多少,它都会变大;类的内存最小为12字节,引用类型的字段在32位系统上为4字节,在64位系统上为8字节。其他字段可以通过填充字边界来布局,这样一个具有四个
字节的类实际上可以占用内存中四倍于4个字节的空间。但这一切都取决于运行时
不要忘记可能隐藏在自动属性声明中的字段。由于它们在内部由字段支持,因此它们将增加类的大小:
public string MyProperty
{ get; set; }
请注意,以下属性对类大小没有影响,因为它不受字段支持:
public bool IsValid
{ get { return true; } }
要了解类或结构实例的内存大小,请在类上应用[StructLayout(LayoutKind.Sequential)]
属性,并调用类型或实例
[StructLayout(LayoutKind.Sequential)]
public class MyClass
{
public int myField0;
public int myField1;
}
int sizeInBytes = Marshal.SizeOf(typeof(MyClass));
但是,由于运行时可以按其希望的方式在内存中布局类,因此实例使用的实际内存可能会有所不同,除非您应用。类实例的大小由以下因素确定:
- 实例中实际存储的数据量
- 值之间需要的填充
- 内存管理使用的一些额外的内部数据
因此,通常包含字符串属性的类需要(在32位系统上):
- 8字节用于内部数据
- 字符串引用为4字节
- 4字节的未使用空间(达到内存管理器可以处理的最小16字节)
通常,包含整数属性的类需要:
- 8字节用于内部数据
- 整数值为4字节
- 4字节的未使用空间(达到内存管理器可以处理的最小16字节)
如您所见,string和integer属性在类中占用相同的空间,因此在第一个示例中,它们将使用相同的内存量
string属性的值当然是另一回事,因为它可能指向堆上的string对象,但这是一个单独的对象,不是指向它的类的一部分
对于更复杂的类,填充起作用。例如,包含布尔值和字符串属性的类将使用:
- 8字节用于内部数据
- 布尔值为1字节
- 3字节的填充,以达到4字节的均匀边界
- 字符串引用为4字节
请注意,这些是类的内存布局示例。具体的布局取决于框架的版本、CLR的实现以及它是32位还是64位应用程序。由于程序可以在32位或64位系统上运行,编译器甚至不知道内存布局,它决定了代码在执行前的JIT:ed时间。如果说类大小,我会假设它意味着类有多少成员,以及类有多复杂
然而,您的问题是当我们创建类的实例时所需的内存大小。我们不能如此确定确切的大小,因为.NETFramework保留了底层的内存管理,并使其远离我们(这是一件好事)。即使我们现在有了正确的大小,该值也可能永远正确。无论如何,我们可以确定以下内容将占用内存中的一些空间:
实例变量李>
自动属性
所以说用户
类将比成员
类占用更多的内存是有道理的。虽然下面的文章是旧的(.NET 1.1),但这些概念清楚地解释了CLR为应用程序中实例化的对象分配内存所做的工作;它们放在哪些堆中,它们的对象引用指针寻址的位置,等等
您还可以检查:。
调用构造函数后,有一种简单的方法可以测试对象的大小。github上有一个名为的项目,它使用了一些魔术,显示了类或对象的大小
用法很简单:
GCex.SizeOf<Object>(); // size of the type
GCEx.SizeOf(someObject); // size of the object;
要计算一个对象的大小,它使用了真正的黑魔法,这很难得到:)看一看。这是一个模棱两可的问题……当你说“类大小”时,你是包括该类有指针指向的所有引用/对象使用的内存,还是只包括该类本身和指针本身使用的内存?你是指内存中的空间吗?如果是这样的话,我认为你不能真正测量它,也不应该太在意它。是的,我的意思是记忆中的大小。。我认为这对我来说至关重要,因为我使用的是价值对象,我的一些对象有100个属性!我把这些对象放在一个类似列表的集合中。。只是想知道它是否对性能有影响…@Nick Craver,我是指实例化或使用时内存中的对象大小。@CSharpNoob-你还没有澄清任何问题,这取决于你测量的内容,如果你存储一个字符串,它实际上是对内存中包含该字符串的另一个位置的引用,但是在类本身上,您只存储了一个指针,那么您是在计算字符串使用的空间,还是只存储一个指针