c# – 可重入代码和局部变量

我有一个方法,如:
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;
}

所以不是存储索引,而是计算它两次,他的推理是因为该方法将在多个线程中调用,所以索引中可能存在无效值.

我对线程的理解是有限的,但我相信每个线程都有自己的堆栈,其中参数str和index将被推送.我已经尝试过与他进行推理,这是一个可重入的代码,并且多线程无法修改方法中的局部变量.

所以,我的问题是,我是否正确地假设缓存存储索引是一个更好的解决方案,因为它不会涉及计算索引两次,因为它是局部变量而str是方法本地的参数,所以没有办法多线程可以修改/更改str和index吗?

那是对的吗 ?

解决方法

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

但是,您不会控制字符串参数,因为它被传入.这将使其线程不安全…除了根据MSDN,字符串对象是不可变的.因此,您可以假设您传递的字符串在调用之间保持相同,并且是线程安全的.虽然您重新分配了str的值,但该参数未作为ref传递,因此只重新分配本地指针,它不会修改传入的调用者的变量.

因此,如所示,第一代码是线程安全的.传入的类型或传入方式的任何更改都不能立即被假定为线程安全的.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...