为什么我永远不应该使用不安全的块来修改字符串?

2024-01-10

我有一个字符串,我想以某种方式修改它。例如:反转或大写。

我发现最快的方法是使用不安全的块和指针。

例如:

        unsafe 
        {
            fixed (char* str = text)
            {
                *str = 'X';
            }
        }

有什么理由让我永远不应该这样做吗?


.Net 框架要求字符串是不可变的。由于这一要求,它能够优化各种操作。

字符串实习 http://en.wikipedia.org/wiki/String_intern_pool这是这一要求被大量利用的一个很好的例子。为了加速某些字符串比较(并减少内存消耗),.Net 框架维护一个指针字典,所有预定义的字符串都将存在于该字典或您调用的任何字符串中。String.intern方法上。当调用 IL 指令 ldstr 时,如果我们已经分配了字符串,它将检查 interned 字典并避免内存分配,请注意:字符串连接 http://bartdesmet.net/blogs/bart/archive/2006/09/27/4472.aspx不会检查实习字符串。

.net 框架的这一属性意味着,如果您开始直接使用字符串进行处理,则可能会损坏您的实习表,进而损坏对同一字符串的其他引用。

例如:

         // these strings get interned
        string hello = "hello";
        string hello2 = "hello";

        string helloworld, helloworld2;

        helloworld = hello;
        helloworld += " world";

        helloworld2 = hello;
        helloworld2 += " world"; 

        unsafe
        {
            // very bad, this changes an interned string which affects 
            // all app domains.
            fixed (char* str = hello2)
            {
                *str = 'X';
            }

            fixed (char* str = helloworld2)
            {
                *str = 'X';
            }

        }

        Console.WriteLine("hello = {0} , hello2 = {1}", hello, hello2);
        // output: hello = Xello , hello2 = Xello  


        Console.WriteLine("helloworld = {0} , helloworld2 = {1}", helloworld, helloworld2);
        // output : helloworld = hello world , helloworld2 = Xello world  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我永远不应该使用不安全的块来修改字符串? 的相关文章

  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何在.NET Core上直接调用F#编译器?

    UPD 我想直接从 NET Core SDK 调用 F 编译器 即 fsc 我了解 dotnet build co 但当我只需要编译一个简单的问题时 即 fsc file fs 就足够的情况下 我不想涉及它们 我尝试在 NET Core S
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • Swift Realm Write 方法是同步还是异步线程

    我在我的项目中使用 Realm 我想知道是否realm write 方法是否同步 我的例子在这里 let realm try Realm try realm write realm delete message realm invalida
  • 在 iOS 10 中请求照片库授权时发生崩溃

    我有一个示例 iOS 10 应用程序请求对照片库的授权 并在真实设备上崩溃并出现以下崩溃错误 PhotosAuthorizationCrashTest 2014 42551 access
  • 我可以获得构建 C++ 可执行文件 (gcc) 时链接的所有库的报告吗? (包括静态链接)

    我有一个继承的 C 应用程序 其中包含 我的主要应用程序 几个特定于应用程序的库 libapp1 libapp2 等 几个 第三方 库 大多数 第三方只是公司中的其他团队 从主应用程序 特定于应用程序的 libappX 库以及其他第三部分库
  • UpdateSource 无法在 CoerceValueCallback 中工作

    我的总体目标是创建一个 TwoWay Attached DependencyProperty 或 OneWayToSource 始终将其绑定源更新为特定值 在我的现实世界场景中 这是一个不恒定的对象 取决于它所附加的对象 我的示例涉及以下模
  • Rails 2:使用form_for构建覆盖同一类的多个对象的表单

    对于 Rails 专家来说 这有望是一个灌篮 我有一个应该迭代一组的表单LineItems并收集有关每个的信息 我想得到form for and fields for创建正确的字段名称和参数 为我的控制器提供一个参数哈希 例如 params
  • 禁用 Android 中的主页按钮

    我在我的活动中添加此代码 public boolean onKeyDown int keyCode KeyEvent event if keyCode KeyEvent KEYCODE HOME return false return su
  • 使用 Struts 2 中的拦截器进行身份验证后登录重定向

    我有一个登录页面 登录请求可以来自多个操作类 一旦用户经过验证 我必须将其重定向到上一个操作类 登录请求来自该操作类 我正在使用拦截器来执行此操作 但我错过了一些东西 它无法正确重定向 这是我的代码 public class SetTarg
  • Windows Phone:按下后退按钮时,IE 或 Edge 中缺少模糊事件

    以下场景与 Windows Phone 设备 IE 或 Edge 相关 场景一 如果输入元素具有焦点并且软键盘处于打开状态 则按硬件后退键会模糊焦点元素并按应有的方式弹出键盘 但是 没有触发相应的模糊事件 场景2 如果输入元素具有焦点并且软
  • libpcap 用于捕获 10 Gbps NIC

    我想从10Gbps网卡上抓包 0丢包 我正在将 lipcap 用于 100Mbps NIC 并且工作正常 libpcap 能够处理 10Gbps NIC 流量吗 如果不是 还有什么其他替代方法可以实现这一目标 libpcap 是否能够以 0
  • 如何找到进程的入口点(或基地址) - 处理 ASLR

    由于ASLR 地址空间布局随机化 自Windows Vista起 exe的基地址是随机的 因此无法在PE文件中找到它 在 Visual C 中 DYNAMICBASE 选项默认启用 因此基地址 exe 的运行是随机的 每次加载程序加载它时
  • Socket.SendAsync 需要几秒钟才能完成

    我正在尝试优化 TCP 套接字包装器 该包装器正在处理大量入站连接 我正在一个基本的聊天服务器和一个小型客户端应用程序中测试它 以将客户端发送到它 这两个应用程序都位于通过千兆位交换机连接的单独 W2k3 服务器上 通过反复试验 我将测试改
  • 如何比较postgres中的两个表

    我想比较来自两个不同查询的两个列值 谁能建议一个比较 Postgres 中两列的查询 嗯 最容易理解的 但不一定是最快的 可能是这样的 但你所说的 比较 可能还有其他意思 Values in column1 that aren t in c
  • 子进程调用 ls 时出错

    知道错误想说什么吗 Traceback most recent call last File
  • Jquery - 是否可以重命名 js 函数?

    希望可以有人帮帮我 我有一个类似的功能 是否可以将此函数重命名 或克隆 为my test 2 提前致谢 Peter 功能有一流的物体 http en wikipedia org wiki First class object在 JavaSc
  • 如何更改 Vuetify v-autocomplete 菜单边框半径样式?

    我想改变盒子的样式v autocomplete下拉列表并给出border radius样式到下拉列表 如下图所示 到目前为止我设计的内容如下图所示 到目前为止 我已经将 menu props 属性直接赋予v autocomplete tag
  • 在Powershell中,有没有办法将html转换为具有深度的对象?

    我正在使用 Powershell 来试验网络抓取 想知道是否有更简单的方法来处理元素 有没有办法将 Html 页面转换为 powershell 中具有适当深度的对象 类似于 Convert ToJson Depth 的东西吗 例如 要得到某
  • Eclipse 条件断点,在任何字符串等于处断点

    我有一个大型 遗留 应用程序 我必须对其进行修复 其代码结构很糟糕 代码味道太多 让我窒息 我真的无法弄清楚 gui 中的字符串填充在哪里 因此 如果我能以某种方式在任何字符串 我不知道变量的名称或它在哪里 等于 foobar 时有一个表达
  • 如何使用 Python 自动杀死占用过多内存的进程?

    情况 我有一个网站 允许人们执行任意代码用另一种语言 具体来说 是我创建的 esolang 在共享托管服务器上使用 Python 解释器 我在一个单独的进程中运行此代码 该进程的时间限制为 60 秒 问题 你可以做类似的事情 Python等
  • msbuild 从属性组创建项目组

    我想传递一个以分号分隔的字符串列表 每个字符串代表一个文件名
  • 为什么我永远不应该使用不安全的块来修改字符串?

    我有一个字符串 我想以某种方式修改它 例如 反转或大写 我发现最快的方法是使用不安全的块和指针 例如 unsafe fixed char str text str X 有什么理由让我永远不应该这样做吗 Net 框架要求字符串是不可变的 由于