我对以下示例代码的逻辑感到完全不知所措:

namespace StructInClass
{
    internal class Program
    {
        static void Main(string[] args)
        {
            SomeClass someClass = new SomeClass();
            someClass.DoStaff();
        }
    }


    public class SomeClass
    {
        private SomeStruct _someStruct;

        public SomeClass() =>        
            _someStruct = new SomeStruct();  
    
        public void DoStaff() => 
            _someStruct = new SomeStruct(4, 5); 
    }


    public readonly struct SomeStruct
    {
        public readonly int x;
        public readonly int y;

        public SomeStruct()
        {
            this.x = 0;
            this.y = 1;  
        }

        public SomeStruct(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    }
}

我在这里有几个问题.

  1. 当我创建一个SomeClass的实例时,它的SomeStruct实例将被放置在Heap中(同时该 struct 实例的指针位于Stack中),这一理解正确吗?
  2. 当我调用someClass.DoStaff()的时候,SomeStruct的新实例是在DoStuff方法的对应堆栈框架内创建的,对吗?那么指针现在指向Stack中的新 struct 实例吗?
  3. 就性能而言,声明类型为SomeStruct的私有字段有意义吗?

谷歌给了我模棱两可的答案.

推荐答案

#1.SomeClass在堆上, struct 内联在该堆内存中(如果SomeStruct是一个类,那么它将在单独的堆分配中)

#2堆上的禁忌

#3-是的,它内联在包含类中,而不是作为新的堆分配

Csharp相关问答推荐

AutoMapper -如何为两个不同的用例设置单个映射?

当我使用NET6作为目标框架时,为什么DotNet使用NET8作为MS包?

使用命令初始化可绑定属性

从应用程序图API调用访问所有者字段

具有单一导航属性的EF核心一对多关系

Blazor服务器端的身份验证角色

如何忽略API JSON响应中的空字符串?

最新的Mediatr和具有同步方法的处理程序Handle:并非所有代码路径都返回值"

TagHelpers在新区域不起作用

为什么我可以用硬编码的集合而不是变量来设置没有setter的IList属性的值?

.NET Google Workspace API获取错误CS0266

在平行内使用跨度.用于循环

如何使用IHostedService添加数据种子方法

如何在C# WinForm控件中使用Windows 10/11的黑暗主题?

单位中快照的倾斜方向

C#中的逻辑运算符用作单词';is';and';and';

如何在C#中反序列化Java持续时间?

如何在.NET8中使用Blazor Web App(WebAssembly)托管服务器端控制器?

同时通过多个IEumable<;T&>枚举

带有类约束的C#泛型