【问题标题】:Why does setting a static object cause my method calls to abort?为什么设置静态对象会导致我的方法调用中止?
【发布时间】:2011-09-19 21:41:21
【问题描述】:

我有一个包含 4 个选项卡的 WPF 应用程序。 Tab1 是应用程序加载的第一个选项卡。我有一个 Tab1Load 方法(选项卡的名称),如下所示:

private void Tab1Load(object sender, RoutedEventArgs e)
    {
        myConfig.LoadConfigurationData();
        XiphosDB.DataContext = Xiphos.XiphosDbNames;
    }

myConfig 在 Window1.xaml.cs 文件的顶部声明

LoadConfigData myConfig = new LoadConfigData();

LoadConfigData 看起来像:

public void LoadConfigurationData()
    {
        LoadGen2Data();
        LoadXiphosData();
        LoadTestConsumerData();
    }

第一个方法调用 LoadGen2Data 一直运行到最后,它为静态对象设置一个值。电话是:

var count = 0;
        foreach (var name in Gen2.allFiNames)
        {
            Gen2.ApiKeys.Add(name, APIKeys[count]);
            Gen2.ConnectStrings.Add(name, connectStrings[count]);
            Gen2.LongNames.Add(name, LongNames[count]);
            count++;
        }

Gen2 声明是:

 public class Gen2
{
    public static List<string> allFiNames { get; set; }

    public static Dictionary<string, string> LongNames { get; set; }
    public static Dictionary<string, string> ApiKeys { get; set; }
    public static Dictionary<string, string> ConnectStrings { get; set; }
}

在调用 Gen2.ApiKeys.Add 之后,应用程序跳过它所在的方法 (LoadGen2Data) 而不调用其余的 Add 语句,然后退出 LoadConfigurationData 方法而不调用剩余的两个方法 (LoadXiphosData和 LoadTestConsumerData)。

进入 foreach 循环的顶部,我已验证“名称”值已填充,并且 APIKeys[count] 提供了合法值(GUID)。

我没有收到任何错误。没有捕获到其他调试点,我可以毫无问题地在应用程序 GUI 中移动(也没有数据)。

知道问题出在哪里吗?

谢谢,

杰森

【问题讨论】:

  • 您没有显示足够的代码 - 什么是设置这些全局变量?请创建一个简短但完整的程序来演示该问题。老实说,我个人会尽量避免使用这样的全局变量...

标签: c# wpf static abort


【解决方案1】:

您正在点击NullReferenceException

public static Dictionary<string, string> LongNames { get; set; }

因为自动生成的支持属性是null。其他 Dictionary 变量和 List 变量也会发生这种情况。

你可以这样修复它:

private static Dictionary<string, string> longNames = new Dictionary<string, string>();

public static Dictionary<string, string> LongNames { get { return longNames; } set { longNames = value; } }

在这种情况下,您甚至可以跳过设置器。

public class Gen2
{
    private static List<string> allFiNames = new List<string> allFiNames();
    public static List<string> AllFiNames { get { return allFiNames; } }

    private static Dictionary<string, string> longNames = new Dictionary<string, string>();
    public static Dictionary<string, string> LongNames { get { return longNames; } }

    private static Dictionary<string, string> apiKeys = new Dictionary<string, string>();
    public static Dictionary<string, string> ApiKeys { get { return apiKeys; } }

    private static Dictionary<string, string> connectStrings = Dictionary<string, string>();
    public static Dictionary<string, string> ConnectStrings { get { return connectStrings; } }
}

【讨论】:

  • 谢谢。我们的一位开发人员得出了相同的结论。 WPF 只是忽略错误并继续前进,这有点令人沮丧。
猜你喜欢
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-25
  • 2011-12-14
  • 2016-12-23
相关资源
最近更新 更多