Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类(对象)在.NET中的大小_C#_.net_Class - Fatal编程技术网

C# 类(对象)在.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

如何确定.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();
  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-你还没有澄清任何问题,这取决于你测量的内容,如果你存储一个字符串,它实际上是对内存中包含该字符串的另一个位置的引用,但是在类本身上,您只存储了一个指针,那么您是在计算字符串使用的空间,还是只存储一个指针