C#中的全局静态字典

时间:2018-08-29 20:59:21

标签: c# dictionary static global-variables

我正在编写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_MSG都会正确, IPHOST。那么,为什么每次在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
    } 
}

请对此提供帮助,对于该问题的任何解决方案都将不胜感激。

3 个答案:

答案 0 :(得分: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();
}

或者请分享您的更多代码,以便我关注您的流程。

答案 1 :(得分: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_test4方法,则将更改test_dict字典的所有已定义值。

答案 2 :(得分: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”值。