可重入代码和局部变量

本文关键字:局部变量 代码 | 更新日期: 2023-09-27 18:30:29

>我有一个这样的方法:

private static string AmpRemove(string str)
{
    int index = str.IndexOf('&');
    if (index > 0)
        str = str.Substring(0, index);
    return str;
}

在这里,我尝试从字符串中获取文本,直到找到&字符。我的前辈将此方法修改为

private static string AmpRemove(string str)
{
    if (str.IndexOf('&') > 0)
        str = str.Substring(0, str.IndexOf('&'));
    return str;
}

因此,它不会存储index,而是计算两次,他的理由是,由于该方法将在多个线程中调用,因此index中可能存在无效值。

我对线程的理解是有限的,但我相信每个线程都有自己的堆栈,参数 strindex 将被推送。我尝试与他推理,这是一个可重入代码,并且多个线程无法修改此方法中的局部变量。

所以,我的问题是,我假设缓存存储index是一个更好的解决方案是否正确,因为它不会涉及两次计算索引,并且由于它是局部变量并且str是方法的局部参数,因此多个线程无法修改/更改strindex

这是对的吗?

可重入代码和局部变量

> index不能在给定代码的情况下进行修改,因为它是一个局部变量,并且从另一个线程调用的任何方法都是单独的调用,因此不共享局部变量。

但是,您无法控制 string 参数,因为它会传入。这将使它的线程不安全...除非根据 MSDN,否则string对象是不可变的。因此,您可以假设您传递string在调用之间保持不变,并且是线程安全的。尽管您重新分配了 str 的值,但该参数未作为ref传递,因此仅重新分配局部指针,它不会修改传入的调用方变量。

因此,呈现的第一个代码是线程安全的。对传入的类型或传入方式的任何更改都不能立即假定为线程安全。

您的原始方法是线程安全的。但:

  1. 重新分配方法变量可能会令人困惑,您可以只返回子字符串: private static string AmpRemove(string str) { var index = str.IndexOf('&'); if (index > 0) { return str.Substring(0, index); } return str; }

  2. 如果"&"位于索引 0 处,则代码将返回整个字符串。这是应该发生的事情,还是应该索引>= 0?