.net 中的固定块

2024-03-13

我对何时需要固定块有点困惑。我有一个例子,它给了我一个矛盾的场景,如下:

enum RoomType { Economy, Buisness, Executive, Deluxe };

struct HotelRoom
{
    public int Number;
    public bool Taken;
    public RoomType Category;

    public void Print()
    {
        String status = Taken ? "Occupied" : "available";
        Console.WriteLine("Room {0} is of {1} class and is currently {2}", Number, Category, status);
    }
}

我创建了一个函数,它将接受一个指向HotelRoom

private unsafe static void Reserve(HotelRoom* room)
{
    if (room->Taken)
        Console.WriteLine("Cannot reserve room {0}", room->Number);
    else
        room->Taken = true;
}

在主要方法中我有以下内容:

unsafe static void Main(string[] args)
{
    HotelRoom[] myfloor = new HotelRoom[4];
    for (int i = 0; i < myfloor.Length; i++)
    {
        myfloor[i].Number = 501 + i;
        myfloor[i].Taken = false;
        myfloor[i].Category = (RoomType)i;
    }
    HotelRoom Room =  myfloor[1];
    Reserve(&Room);   //I am able to do this without fixed block.
    //Reserve(&myfloor[1]);  //Not able to do this so have to use fixed block below. 

    fixed (HotelRoom* pRoom = &myfloor[1])
    {
        Reserve(pRoom);
    }

    myfloor[1].Print();
    Room.Print();
}

我的困惑是我能够做到Reserve(&Room)但不是Reserve(&myfloor[1])。我认为他们在做同样的事情 - 传递 a 的内存地址HotelRoom结构到Reserve功能。为什么我需要fixed去做这个?


Room是存储在堆栈中的局部变量,而myfloor存储在堆中。垃圾收集器可以移动堆中的对象以压缩它(地址会改变),因此您需要“固定”它们。这就是为什么你需要fixed陈述。

Update:

另外,还有一种在堆栈而不是堆上分配内存的方法:

HotelRoom* fib = stackalloc HotelRoom[4];

在这种情况下你不需要fixed陈述。

小免责声明:能够做到这一点并不意味着您当然应该这样做。正如其他人已经提到的,这是一种非常非 .NET 的编写代码的方式,所以我只是认为这个问题是理论上的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.net 中的固定块 的相关文章

  • 在 .Net 应用程序中使用 Active Directory Web 服务

    我正在尝试构建一个 Net 应用程序来询问 Active Directory 编辑 我需要使用 Web 服务来执行此操作 因为我将使用需要使用 Web 服务的第三方工作流工具从 Sharepoint 工作流与 AD 进行通信 根据我的研究
  • 如何将 Integer8 值转换为 DateTime?

    如何将 Integer8 类型值转换为 DateTime 类型值 特别是 我正在尝试获得帐户过期采用人类可读形式的 Active Directory 用户属性 SearchResult GetDirectoryEntry Propertie
  • Objective-C:int值无故改变

    Objective C 我需要帮助保留 int 的值 无需我的命令 它就在我身上发生变化 最初的问题是 如何声明和保留 int 这在另一篇文章中得到了满足 Objective C 如何声明和保留 int https stackoverflo
  • Python tkinter.filedialog Askfolder 干扰 clr

    我主要在 Spyder 中工作 构建需要弹出文件夹或文件浏览窗口的脚本 下面的代码在spyder中完美运行 在 Pycharm 中 askopenfilename工作良好 同时askdirectory什么都不做 卡住了 但是 如果在调试模式
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 是否可以修改 PDF 表单字段名称?

    情况是这样的 我有一个 PDF 其中包含自动生成的 pdf 表单字段名称 问题是这些名称不太用户友好 它们看起来像 topmostSubform 0 Page1 0 Website Address 0 我希望能够更改它们 使它们类似于 We
  • 在 .Net 中保持 Powershell 运行空间打开

    我正在尝试从 VB Net 中运行一些 PowerShell 代码 如果您知道的话 C 编码器也可能会有所帮助 代码的第一部分 我需要使用密码连接到 na 控制器 并且需要保持连接打开 我还有其他命令需要通过单击按钮来运行 获取文件 显示文
  • 我应该如何缓冲绘制的矩形以提高性能(C#/.NET/WinForms/GDI+)

    我在做什么 我正在开发一个 C NET 4 7 2 WinForms 应用程序 它使用以下命令在表单上绘制大量填充矩形Graphics FillRectangle https learn microsoft com en us dotnet
  • 如何检查 FTP 目录是否存在

    寻找通过 FTP 检查给定目录的最佳方法 目前我有以下代码 private bool FtpDirectoryExists string directory string username string password try var r
  • .Net 中是否有与 HTML 等效的 XmlReader?

    我用过Html敏捷包 http html agility pack net z codeplex过去在 Net 中解析 HTML 但我不喜欢它只使用 DOM 模型 在大型文档和 或具有大量嵌套的文档上 可能会遇到堆栈溢出或内存不足异常 另外
  • 实体框架代码首先保存后不延迟加载

    我的数据库中有一个查找表和一个数据表 我将使用性别和人物作为例子 假设性别表如下所示 Id Code 1 Male 2 Female 人员表如下所示 Id Name GenderId 1 Bob 1 2 Jane 2 我首先在 EF 代码中
  • 如何在Web网格的列中编写IF条件

    我在 WEB GRID 列中创建 if 条件时遇到错误 所以 请帮助改进我的代码并解决我的问题 grid Column Status format item gt
  • 从 .net 应用程序登录 OpenID 站点

    我一直在考虑编写一个小工具来登录 SO 并定期使用一些主题 当前信息更新我的个人资料信息 例如我最新的博客文章或我需要帮助的问题等 为了让它工作 我需要以某种方式从控制台应用程序登录到SO 是否有一个 Net 库可以简化使用原始 http
  • 有没有办法在不重新编译的情况下覆盖 .NET Windows 服务名称?

    我有一个 Windows 服务可执行文件 我知道它是用 NET 编写的 我需要将其安装在不同的服务名称下以避免冲突 安装无论如何都不提供指定服务名称 如果我只能访问二进制文件 当我使用 installutil 安装它时是否可以覆盖服务名称
  • 为什么抽象类应该实现抽象基类的抽象方法?

    在下面的示例中 该类Derived实现抽象方法method从课堂上Main 但我想不出在抽象中填写方法体的理由Derived类的实现 当然 我应该只在实际类中实现抽象方法 那么我怎样才能避免这样做呢 我还可以做些什么 abstract cl
  • 使用 NServiceBus FileShareDataBus 时清理文件

    我在 NServiceBus 3 中使用 FileShareDataBus 是否支持清理数据总线文件 如果不是 实现此目的的最佳实践是什么 例如如何确保该文件不是错误队列中消息的一部分 鉴于不可能知道消息在错误队列中停留多长时间 我通常会在
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a

随机推荐

  • SQL-Server 中的错误计算

    作为一个例子 我发现了一个简单的计算 例如 select cast 200 00 as float 1908 30 170 00 1150 00 1128 30 作为正常添加 这会导致0 00但 SQL Server 显示结果为2 2737
  • fitz.open() 在 for 循环中不起作用(FITZ、PYTHON、PYMUPDF)

    当我尝试使用 PyMuPDF 中的 fitz 迭代目录 PDFS 中的文件时 我遇到了困难 问题是 当我只是执行 document somepdf pdf 时 代码可以工作 但是一旦我插入 for 循环并尝试访问文件 就会出现此错误 文件名
  • Android 记录来电和去电

    我想了解是否有一种方法可以在 Android 手机 2 2 及更高版本上记录来电和去电 客户希望记录他们给客户拨打的代理电话 以便以后可以用来填写一些材料 他们不想让客户在接听电话时等待 而是希望稍后再做 这可能吗 我需要使用哪些 API
  • 如何配置IntelliJ 11 +远程tomcat 6 + maven导入模块?

    这是我现在所拥有的 将多个maven模块导入到IntelliJ项目中 Maven 目标从 Maven 项目弹出窗口运行正常 创建一个 war 文件 从 Build Make Project 创建项目也可以 但这里没有创建战争 只是创建 cl
  • myBatis 中 ArrayList 的类型处理程序

    我正在尝试为 ArrayList 编写类型处理程序 但这给了我错误任何人都可以帮助我 我想将 ArrayList 作为 VARCHAR 存储在数据库中并将其作为 ArrayList 检索 package com someweb typeha
  • 如何在容器中存储不同类型的模板化对象?

    假设我有一个vector or list或任何可能更适合这里的容器 我想将模板化类型的多个对象 或指针 存储在 std vector
  • SCNMaterialProperty不是渲染层

    当分配 AVPlayerLayer 时 SCNMaterialProperty 的内容属性在 SCNMaterial 上无法呈现 请注意 这只是物理设备上的问题 在模拟器 Xcode 6 0 1 上运行良好 我正在这样创建我的 SCNode
  • 在谷歌地图上显示多条路线

    我试图在同一张地图上显示多条路线 但无法这样做 无论我做什么 我都只能得到一条路线 function calcRoute var start document getElementById start value var end docum
  • 从字典中获取特定值

    如何从Python中的字典中获取特定的键 我有一本字典 dict redorange 1 blackhawak 2 garlicbread 3 我想获取其键名称中包含大蒜的键的值 我怎样才能实现它 让我们调用你的字典d print v fo
  • 将 nodemon 与 docker 和 docker-compose 结合使用

    我将 nodemon 与 docker compose 一起使用 这是我的 Dockerfile FROM node 10 WORKDIR usr src app COPY package json RUN npm install COPY
  • 如何从 Apache .htaccess 创建虚拟主机?

    我在用Apache 之友 XAMPP http www apachefriends org en xampp html在 Windows 本地服务器 中 我将虚拟主机设置为httpd vhosts conf在 Apache 配置目录中 如下
  • Android - 在 AsyncTask onPostExecute() 中设置的共享首选项并不总是设置?

    我有一些代码在 98 的时间内有效 在我自己的测试中则为 100 因此除了让用户设备遇到此问题之外 我无法真正重现该问题 我在 onPostExecute 中所做的是设置如下参数 SharedPreferences prefs Prefer
  • 带有方角的 UISegmentedControl

    我想用子类修改 UISegmentedControl 以删除圆角 我似乎无法设置cornerRadius 使 SegmentedControl 比屏幕更宽 因此 切掉 角落 不是一个选择 因为我有 4 或 5 个段 然后它们的大小会有所不同
  • 如何使用 python 连接多个 .wav 文件 [重复]

    这个问题在这里已经有答案了 我看到一篇文章将两个 wav 文件连接在一起 但我想知道如何使用 python 连接多个 wav 文件 我正在使用 python 3 6 0 如果有人有办法做到这一点 请教我 我看到另一篇文章要求加入 2 个 w
  • 更改背景后手指绘画速度变慢

    在我的 Paint 应用程序中 我使用了自定义视图 该视图位于 Finger Paint API 演示中 代码如下 public class MyView extends View private static final float MI
  • NSDateFormatter 中的上午/下午问题

    我编写下面的代码将一种日期格式转换为另一种日期格式 但 AM 字符串有效 PM 无效 请帮忙 dateTime 2013 01 24 18 30 PM dateTime 2013 01 24 06 30 AM NSDateFormatter
  • 在活动组中添加新活动时出现 java.lang.StackOverflowError

    我正进入 状态stackoverflow error 我的布局结构如下
  • 如何使用C断言让代码更安全?

    阅读杂项 与SDL开发相关的教程我发现了两个不同的例子 做同样的事情 但以不同的方式 我想知道从代码 安全性 和可维护性的角度来看 您认为这两者中哪一个是正确的 在第一个示例中 程序员根本没有使用断言 但代码看起来不错 至少在我看来 int
  • 零 SQL 死锁设计 - 有编码模式吗?

    我在 MS SQL Server 2005 之上运行的 NET 2 0 Web 应用程序上遇到了非常罕见但烦人的 SQL 死锁 过去 我们一直以非常经验的方式处理 SQL 死锁 基本上是调整查询直到它起作用 然而 我发现这种方法非常不令人满
  • .net 中的固定块

    我对何时需要固定块有点困惑 我有一个例子 它给了我一个矛盾的场景 如下 enum RoomType Economy Buisness Executive Deluxe struct HotelRoom public int Number p