gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:12:43 25 4
gpt4 key购买 nike

我有这样的方法:

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会被压入栈中。我试过和他推理,这是一个可重入代码,多个线程不可能修改这个方法中的局部变量。

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

对吗?

最佳答案

index 无法根据代码修改,因为它是局部变量,从另一个线程调用的任何方法都是单独的调用,因此不共享局部变量。

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

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

关于c# - 可重入代码和局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26917240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com