глобальный статический словарь в C # - PullRequest
0 голосов
/ 29 августа 2018

Я пишу тестовый код C # и новое в нем. Вид сбит с толку и нужна помощь. Это скелетный код, а не весь код. Я ищу решение, в котором я могу сохранить IP-адреса и хост-ключи test_dict различными способами и только обновить значение 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, IP и HOST , Тогда зачем каждый раз, когда я меняю значение только ключа NET_MSG внутри call_test методов, я теряю два других ключа IP и HOST?

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 голосов
/ 30 августа 2018

Я создал простое консольное приложение, чтобы показать вам, как изменить значения 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_test1, call_test2 или call_test3, вы меняете только NET_MSG. Остальные test_dict поля остаются нетронутыми. Надеюсь, это поможет вам. Если вы вызовете метод call_test4, вы измените все определенные значения словаря test_dict.

0 голосов
/ 30 августа 2018

Если тестовый класс выглядит так:

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».

0 голосов
/ 30 августа 2018

Я думаю, что вы что-то упускаете при создании нового словаря.

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();
}

Или, пожалуйста, поделитесь большим количеством вашего кода, чтобы я мог следить за вашим потоком.

...