【问题标题】:Is static variable shared between class instances类实例之间是否共享静态变量
【发布时间】:2011-09-02 10:58:24
【问题描述】:

我有下面的课程。 _commandLine 变量被声明为静态的。这个变量会在 WkHtml 类实例之间共享吗?

附言拥有可以在 VS 中显示此类信息的工具会很酷。例如开发人员选择变量并获取有关变量的信息、类之间是否共享变量、是否线程安全等。

public class WkHtml
{
    private static string _commandLine;

    public void AddCommandLine(object value)
    {
        AddCommandLine("{0}", value);
    }

    public void AddCmdWithCond(string value, bool condition, object compareValue)
    {
        AddCmdWithCond(value, condition, compareValue, "");
    }

    public void AddCmdWithCond(string value, bool condition, object compareValue, string defaultValue)
    {
        if (compareValue != null && !string.IsNullOrEmpty(compareValue.ToString()) && Helpers.GetBool(compareValue) == condition)
            AddCommandLine("{0}", value);
        else
            if (defaultValue != null)
                AddCommandLine("{0}", defaultValue);
    }

    public void AddCommandLine(object parameter, object value, object defaultValue)
    {
        if (value == null || string.IsNullOrEmpty(value.ToString()))
        {
            value = defaultValue;
        }
        AddCommandLine(parameter, value);
    }

    public void AddCommandLine(object parameter, object value)
    {
        if (value == null || string.IsNullOrEmpty(value.ToString())) return;
        _commandLine = _commandLine + string.Format(parameter.ToString(), value) + " ";
    }

    public string GetCommandLine
    {
        get { return _commandLine; }
    }

}

【问题讨论】:

    标签: c# class static


    【解决方案1】:

    static 变量在所有类实例之间共享。

    我看不出你为什么应该将它声明为静态的任何理由?

    【讨论】:

    • 最后一点强烈+1; static 这里看起来完全不正确
    【解决方案2】:

    这个变量会在 WkHtml 类实例之间共享吗?

    是的,它确实 - 同样,它适用于无,而是:类型本身。您可以使用没有任何类型实例的静态变量。

    并获取有关变量的信息,是类之间共享的变量

    您已经这样做了 - 智能感知中的 S 符号和 static 修饰符。

    线程安全吗

    这更复杂,无法通过此类来评估 - 如果不深入了解代码及其使用方式,就不可能评论线程安全。

    【讨论】:

    • C# 中的字符串是线程安全的,因为它是不可变的。为什么它不应该是线程安全的? (我要补充一点,他以非线程安全的方式使用,因为他在同一个函数中多次重新读取值,认为读取之间的值不会改变)
    • @xanatos string 不是变量 - 它是对象。是的,字符串 object 是线程安全的(除非有讨厌的黑客攻击),但字符串 variable 不是。 _commandLine = _commandLine + string.... 就是一个很好的例子;这会忽略竞争更改并可能导致数据丢失。
    • 我认为那回复应该是“in your code no”,因为他在_commandLine = _commandLine + string.Format(parameter.ToString(), value) + " ";中犯了那个特别的错误
    • @xanatos 通过查看变量在代码中的使用方式来思考变量 except 的线程安全性是没有意义的。
    【解决方案3】:

    是的,它是一个类变量,该类的所有实例都将看到相同的属性值。如果一个实例更改它,它将反映所有实例。

    【讨论】:

      【解决方案4】:

      static 变量确实在类实例之间“共享”,尽管它是独立于实例的。 static 变量是类的一部分,但不是该类的实例。

      【讨论】:

        猜你喜欢
        • 2011-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多