在 .NET 控制台应用程序中存储全局数据

问题描述 投票:0回答:1

我正在制作一个 .net 控制台应用程序,它是一个 Arena Discord 机器人,在机器人启动时,将从 JSON 文件加载大量字符数据(我正在移植 Unity 应用程序,这与所有 ScriptableObject 相关)数据)。现在,我只想将此字符数据保留在内存中,直到最终将其移动到数据库。我想知道在控制台应用程序中存储此类全局数据时的最佳实践是什么。在查看示例代码时,我看到了公共类的示例,其中包含存储数据的静态变量和检索数据的静态方法。这是我计划做的一个例子。这是典型的方法吗?

    public sealed class CharacterData
    {
        private static List<Character> characters = new();

        public static void AddCharacterData(Character character)
        {
            characters.Add(character);            
        }
        public static Character GetCharacterData(Guid guid)
        {
            return characters.Find(x => x.id == guid);            
        }
    }

    public class Character
    {
        public Guid id = Guid.NewGuid();
        public string myName = "";
        public int level = 1;
    }

它是这样工作的,我只是在寻找最佳实践建议。

c# .net console-application
1个回答
0
投票

对于一个小项目来说,这可能没问题。您只是使用静态字段“记忆”数据。

如果这种情况可能会增长,则需要考虑各种问题:

  • 如果同时从不同的线程访问和修改集合,则可能会出现线程安全问题。确保在开始使用整个集合之前同步创建它,或者找到一种方法使您的解决方案线程安全。
  • 如果最终有大量字符,
    Find
    会很慢。考虑使用类似字典的结构,以便查找时间不取决于有多少个字符。
  • 使用静态/全局变量通常被认为是不好的做法,因为它将类与特定的实现和实例紧密耦合。最好有一个类来跟踪实例字段中的字符,并设置依赖项注入以在需要的任何地方注入该类的相同实例。这使得实例在实践中有效地全局化,同时允许您创建或模拟实例以创建隔离的单元测试。
  • 注意您期望角色的哪些方面可以改变。通过将
    id
    设为公共字段,代码可以更改 ID。如果您以按 ID 索引的方式存储字符数据(如字典),则集合可能与内部项目的 ID 不同步。使用属性将允许您明确其他类允许更改哪些值。使用构造函数和
    readonly
    字段或仅获取属性可以防止某些值在构造对象后发生更改。
© www.soinside.com 2019 - 2024. All rights reserved.