是转换线程的扩展方法安全

Ari*_*ian 2 c# extension-methods thread-safety c#-4.0 c#-6.0

请考虑以下代码:

public static int ToInt (this string str)
{
    return Convert.ToInt32 (str);
}
Run Code Online (Sandbox Code Playgroud)

我应该使用lock这个声明吗?


编辑1)

public static int ToInt(this string str)
{
    int Id = -1;
    if (str.IsEmpty() == true ||
        int.TryParse(str.Trim().Replace(",", ""), out Id) == false)
    {
        throw new Exception("Invalid Parameter: " + str);
    }
    else
    {
        return Id;
    }         
}
Run Code Online (Sandbox Code Playgroud)

这个方法也是线程吗?

Bra*_*NET 6

不,没有锁.

string是不可改变的; 因此,当您尝试解析它时,另一个线程无法更改其内容.

它与扩展方法没有任何关系; 根据他们做什么(或他们采取什么参数),那些可能是也可能不是线程安全的.

除了; 除非lock在守则的其他地方受到尊重; 这样做不会改变任何东西......(至少对于这种方法而言)

  • 你不仅不能说所有的值类型都是不可变的,你也不能说所有的类都是可变的.类和结构都可以是不可变的或可变的.可变性与类型是引用类型还是值类型无关. (3认同)
  • @BradleyDotNET`struct`s*建议*通常是不可变的.虽然`System.ValueTuple`掩盖了这一点. (2认同)
  • @BradleyDotNET C#没有"原始"类型的定义.这不是语言中定义明确的术语.很多类是不可变的,实际上这里讨论的是不可变类.你可能很少使它们成为现实,但对于每个人来说都不是这样,而且无论如何都不能说明对象都是非常可变的错误. (2认同)