【问题标题】:failed to update a static property无法更新静态属性
【发布时间】:2011-09-13 07:59:46
【问题描述】:
public static class clsCounter
{
    static int count;

    public static int Counter
    {
        get { return count; }
        set { count = value; }
    }
}

以上是用于记录数字的静态类。

另外,我在 VS2010 解决方案中有两个项目,其中一个是类库。在其中一个类中,我得到了以下使用 clsCounter 的代码。

if (clsCounter.Counter == 0)
    countIES++;
else
    countIES = 0;

现在,在另一个项目中,我将一些新值设置为 clsCounter

clsCounter.Counter = 50;

但是,由于某种原因,我无法将 clsCounter.Counter 设置为 50,因此我总是得到 countIES++。代码对我来说看起来不错,但我不知道它有什么问题?任何人都可以帮忙吗?

谢谢。

编辑:

我想知道它是否与 vs 解决方案中的项目范围有关?

解决方案结构

解决方案

  • Excel插件

    • Form1.cs => (clsCounter.Counter = 50)
    • ...
  • 类库

    • clsCounter =>(静态类)
    • ...

编辑 2:

clsCounter.Counter = 50; 实际上是在backgroundworker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 事件中运行。这可能是一个问题吗?

编辑 3:

我上传了一个示例项目,似乎能够重现同样的问题。这是共享链接:=> http://www.4shared.com/folder/sInyNWyi/_online.html

我想在这里做的是在按下按钮“设置值”后用值填充单元格Other case。静态类和 UDF 可以在类库中找到。

请注意,要在 excel 插件中使用 =testFunc(),需要在自动化服务器列表中找到并启用它。所以只需去 File->Option->Addin->Under Manage Add-in->点击 GO->Automation->Ebale ClassLibrary1.UDF

请在启动调试器之前检查“Register for COM interop”选项是否已启用。要找到它,请转到 ClassLibrary1 Property -> Build -> 在 Output 下,检查 Register for COM interop

【问题讨论】:

  • 不清楚这些代码在哪个项目中。
  • 您能否尝试创建一个具有相同行为的最小(但完整)示例?
  • clsCounter 是否有可能在多个地方定义?
  • 这些行可能运行在不同的线程上吗?
  • 您确定引发了 RunWorkerCompleted 事件吗?

标签: c# .net static


【解决方案1】:

将以下行添加到您的静态属性中:

public static class clsCounter
{
    private static int count;

    public static int Counter
    {
        get { 
               Debug.WriteLine("Counter viewed"); 
               return count; 
            }
        set { 
               Debug.WriteLine("Counter Changed from {0} to {1}", count, value);
               count = value; 
            }
    }
}

然后您可以观察您的调试器并在计数器上设置断点,这将允许您找出代码的哪一部分不恰当地修改了您的计数器。静态计数器将在访问之前“在某个时间”初始化。我会说您正在设置计数器,并且在您阅读之前某处会立即增加它。

【讨论】:

  • 当我单击“设置值”按钮时,我收到消息,说“计数器从 0 更改为 50”。但是当您再次在单元格中键入公式 =testFunc() 时,结果仍然没有变化。嗯,真的很奇怪。我想知道你是否可以下载源代码并可能运行它?
  • 你有消息。所以你现在可以解决你的问题。如果它正在增加,那么您将看到发生的位置。如果有人修改了您的“计数器”,那么您将看到一条调试消息。
【解决方案2】:

最后,我想我找到了一种解决方法,尽管它与静态无关。我有点受到在网络应用程序中使用 cookie 的想法的启发。

同样,我需要做的就是:

将值存储在临时文本文件中,方法是

System.IO.File.WriteAllText(@"C:\countIESValue.txt", value);

在“设置值”按钮单击事件处理程序。

并在需要时从上述文本文件中读取存储的值并将其分配给局部变量。

if(System.IO.File.Exists(@"C:\countIESValue.txt"))
{
    string val = System.IO.File.ReadAllText(@"C:\countIESValue.txt");
}

文本文件也可以在处理完成后删除。这样,我就不用担心任何范围或应用领域的问题,虽然需要写文件的权限。我很高兴它对我来说工作得很好。

【讨论】:

    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2019-12-25
    • 2019-07-06
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多