更改静态变量的值是一种不好的做法吗?

10

我有一个静态字符串变量,可能需要根据HTTP协议进行更改。

更改静态字符串变量是不好的做法吗?

static string QuoteWebServiceUrl = CommonFunctions.ReadAppSetting("QuoteWebServiceUrl");

if(url == "https")
{
  QuoteWebServiceUrl = CommonFunctions.ReadAppSetting("QuoteWebServiceUrlSecure");
}
else
{
  QuoteWebServiceUrl = CommonFunctions.ReadAppSetting("QuoteWebServiceUrl");
}

感谢


3
我认为你误解了静态概念,或者将其与const混淆了。同时,你代码中的else语句没有意义,因为QuoteWebServiceUrl已经等于你设置的值。 - Ash Burlaczenko
我认为这可能会成为线程问题。if/else只是我正在做的随意模拟。 感谢您的帮助。 - telsokari
8个回答

11

当然可以更改静态字符串变量的值。您为什么认为这是不良实践?


1
确实不错的做法。但是,楼主提出的原因,我相信与可变静态字段容易出现线程问题有关。(当然,像任何字段一样,但静态字段更可能在线程之间共享而不是实例字段。) - Kirk Woll
3
考虑到在多线程环境中可能会产生灾难性后果,我很惊讶这个问题得到了这么多赞。 - captaintom
2
@CaptainTom:我没有看到 OP 说他正在尝试并发加载设置。我们不会默认假设它是一个多线程程序,对吧?否则 SO 上很多答案都是错误的。 - Cheng Chen
1
在处理运行时发生变化的静态变量时,一定要考虑到多线程。 - captaintom
1
@CaptainTom:我不同意。考虑到许多内置类,它们被记录为“非线程安全”。 - Cheng Chen

2

我的意思是,修改静态变量不是问题。它是一个变量。它可以变化。那么为什么变化(即修改它)会是一种不好的做法呢?是的,有些情况下你不应该这样做,或者必须小心谨慎,但总体来说并不是不好的。

这里的大问题是在应用程序内部深处读取应用程序设置。这会破坏可维护性和可测试性。这是一种极其糟糕的做法,我鼓励你立即停止。


我不能更改应用程序设置,因为这是一款公司应用程序,我只是在修改模块。 谢谢。 - telsokari

2
在这种情况下,看起来只是一次性的设置,但在多线程环境中(包括ASP.NET),您必须注意竞态条件。

0

从编程角度来看,就语言而言更改它是可以的。

否则就取决于变量的逻辑以及在整体业务逻辑中所具有的含义。


0

单独改变静态变量并不是什么坏事。

然而,我没有看到任何关于多个实例同时修改同一个静态变量的预防措施。这可能会导致并发问题。

此外,您应该在静态变量中设置两个选项,并根据您的条件选择适当的选项,但一旦它们被初始化,就不要再更改静态变量了。


0

对于多线程编辑静态变量不好,不可扩展,并且在某些情况下可能会不适当地运行。

但是......

有一些业务逻辑只有一个线程在处理或限制为一个线程。如果是这种情况,完全可以使用

在这些情况下,这是很好的选择,有时我们可能没有其他选择,而是更改(其中之一是使用WEBAPI与异步任务时,最重要的是每次API调用仅有一个线程和用户希望获得每个API命中的动态状态更新)。


-1
你可以使用静态属性代替静态变量。

private static string QuoteWebServiceUrl 
{ 
    get 
    { 
        if(url == "https") 
        {   
            return CommonFunctions.ReadAppSetting("QuoteWebServiceUrlSecure"); 
        } 
        else 
        {   
            return CommonFunctions.ReadAppSetting("QuoteWebServiceUrl"); 
        } 
    } 
}

静态属性


这对解决所提出的问题毫无帮助。 - Servy

-2

一般而言,这不是一个坏的做法。但在您的特定情况下,这是一个可怕的想法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接