C#中的全局静态字典

问题描述 投票:2回答:3

我正在写一个C#测试代码和新的代码。有点困惑,需要帮助。这是一个骨架代码,而不是整个代码。我正在寻找解决方案,我可以保持test_dict键IP和主机完好不同的方法,只更新NET_MSG值。

public partial testclass
{
    IDictionary<string, string> test_dict= new Dictionary<string, string>();
    String ping_msg

    private void test1()
    {
       test_dict = develop.AddPing(ping_msg)
    }

每次我在test_dict["NET_MSG"]中在下面的方法中添加一条新消息,并打印test_dict,我在test_dict中只得到一个密钥,即test_dict["NET_MSG"],我看不到IP地址和主机。

我很困惑,因为我使用的是全局字典变量,一旦从test_dict调用test1()test_dict就会将所有三个键都正确,NET_MSGIPHOST。那么为什么每次如果我改变NET_MSG方法里面只有call_test键的值我失去了其他两个键IPHOST

public void call_test1()
{
    test_dict["NET_MSG"] = "Putting new message";
}

    public void call_test2()
{
    test_dict["NET_MSG"] = "Putting new message 2";
}

    public void call_test3()
{
    test_dict["NET_MSG"] = "Putting new message3";
}

在另一个文件中:

public static class develop
{
    public static IDictionary<string, string> AddPing(String message)
    {
        IDictionary<string, string> new_ping = new Dictionary<string, string>();
        new_ping["NET_MSG"] = message
        new_ping["IP"] = "192.168.111.111"
        new_ping["HOST"] = "some_host_name"

        return new_ping
    } 
}

请帮助我,并解决问题的任何解决方案。

c# dictionary static global-variables
3个回答
0
投票

我认为你在创建一个新词典时缺少一些东西。

using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TrieQuestions
{
    [TestClass]
    public class UnitTest2
    {
        //1st new of Dictionary
        IDictionary<string, string> test_dict= new Dictionary<string, string>();
        private String ping_msg;
        [TestMethod]
        public void TestMethod1()
        {
            test_dict = develop.AddPing(ping_msg);
            test_dict["NET_MSG"] = "Putting new message";
        }
    }

    public static class develop
    {

        public static IDictionary<string, string> AddPing(String message)
        {
            //another new instance of the dictionary is created!!
            IDictionary<string, string> new_ping = new Dictionary<string, string>();
            new_ping["NET_MSG"] = message;
            new_ping["IP"] = get_IP();
            new_ping["HOST"] = get_host();

            return new_ping;
        }

        private static string get_host()
        {
            return "host";
        }

        private static string get_IP()
        {
            return "ip";
        }
    }
}

我为你创建了这个测试代码,这样你就能理解你所缺少的东西。

如果你在单元测试中调用代码,它将适合你。但是请注意这些评论,我补充说,你要分配一个新的字典两次,第一次调用测试并再次在静态类中,这意味着如果你写入第一个分配的字典,你将看到一个空字典。

如果在调试模式下将test_dict添加到监视列表中,则还可以使用make object Id命令来查看是否正在创建新实例。

如果要解决它,可以将原始字典作为参数传递给函数。

 public static void AddPing(String message, IDictionary<string, string> dict)
{
    dict["NET_MSG"] = message;
    dict["IP"] = get_IP();
    dict["HOST"] = get_host();
}

或者请分享更多代码,以便我可以按照您的流程进行操作。


0
投票

我创建了一个简单的控制台应用程序,只是为了向您展示如何修改test_dict值:

class Program
{

    static void Main(string[] args)
    {
        var foo = new Testclass();
        foo.test1();

        Display(foo);
        foo.call_test1();
        Display(foo);
        foo.call_test2();
        Display(foo);
        foo.call_test3();
        Display(foo);
        foo.call_test4();
        Display(foo);
    }

    private static void Display(Testclass foo)
    {
        foreach (var item in foo.test_dict)
        {
            Console.WriteLine(item.Value + item.Key);
        }

        Console.WriteLine();
    }
}

public partial class Testclass
{
    public IDictionary<string, string> test_dict = new Dictionary<string, string>();
    private String ping_msg;

    public void test1()
    {
        test_dict = Develop.AddPing(ping_msg);
    }

    // chnages only NET_MSG value, other test_dict fields stay untouched!!!
    public void call_test1()
    {
        test_dict["NET_MSG"] = "Putting new message";
    }

    // chnages only NET_MSG value, other test_dict fields stay untouched!!!
    public void call_test2()
    {
        test_dict["NET_MSG"] = "Putting new message 2";
    }

    // chnages only NET_MSG value, other test_dict fields stay untouched!!!
    public void call_test3()
    {
        test_dict["NET_MSG"] = "Putting new message3";
    }

    // here you can change all the fields 
    public void call_test4()
    {
        test_dict["NET_MSG"] = "new net_msg value";
        test_dict["IP"] = "new ip value";
        test_dict["HOST"] = "new host value";
    }
}

public static class Develop
{

    public static string get_IP()
    {
        return "blah";
    }

    public static string get_host()
    {
        return "blah2";
    }

    public static IDictionary<string, string> AddPing(String message)
    {
        return new Dictionary<string, string>()
        {
            {"NET_MSG", message},
            {"IP", get_IP()},
            {"HOST", get_host()}
        };
    }

}

因此,您应该收到:

NET_MSG
blahIP
blah2HOST

Putting new messageNET_MSG
blahIP
blah2HOST

Putting new message 2NET_MSG
blahIP
blah2HOST

Putting new message3NET_MSG
blahIP
blah2HOST

new net_msg valueNET_MSG
new ip valueIP
new host valueHOST

调用call_test1call_test2call_test3只会更改NET_MSG。其他test_dict领域保持不变。希望它可以帮到你。如果您调用call_test4method,您将更改test_dict字典的所有已定义值。


0
投票

如果测试类看起来像这样:

public partial testclass
{
  IDictionary<string, string> test_dict= new Dictionary<string, string>();
  String ping_msg

  private void test1()
  {
   test_dict = develop.AddPing(ping_msg)
  }

  public void call_test1()
  {
    test_dict["NET_MSG"] = "Putting new message";
  }

  public void call_test2()
  {
    test_dict["NET_MSG"] = "Putting new message 2";
  }

  public void call_test3()
  {
    test_dict["NET_MSG"] = "Putting new message3";
  }
}

问题是test1()永远不会被调用来填充初始字典,所以初始字典是空的和行

test_dict["NET_MSG"] = "Putting new message1";

test_dict["NET_MSG"] = "Putting new message2";

test_dict["NET_MSG"] = "Putting new message3";

正在空字典中创建关键字“NET_MSG”。

要填充并仅更改NET_MSG,请添加对test1()的调用,以将test_dict设置为要使用的字典而不是空字典。

还要记住,如果每次都要实例化一个新类,每次都必须调用test1()

例1:

public void call_test1() {
  test1();
  test_dict["NET_MSG"] = "Putting new message1";
}

用法:

testclass test = new testclass(<ctor args>);
test.call_test1();

这将填充然后改变NET_MSG

例2:

public void init() {
  test1();
}

public void call_test1() {
  test_dict["NET_MSG"] = "Putting new message1";
}

用法:

testclass test = new testclass(<ctor args>);
test.init();
test.call_test1();

这在确定发生了什么时更加明确 - 初始化发生,因此在call_*方法有用之前初始化数据。

你甚至可以:

testclass test = new testclass(<ctor args>);
test.init();
test.call_test1();
//Do something with the data
test.call_test2();
//Do something with the data
test.call_test3();
//Do something with the data

然后你初始化一次,call_ *将使用相同的字典,只更改“NET_MSG”值。

© www.soinside.com 2019 - 2024. All rights reserved.