C# 字典中的一个小知识点记录(字典赋值的两种方式区别)

最近在monogame游戏开发中,遇到了一个使用字典中的小细节

字典赋值的两种方式区别

这两行代码在功能上有重要区别:

_animations["Down"] = _playerDownMoveAnim.Animation;
_animations.Add("Down", _playerDownMoveAnim.Animation);

主要区别

1. 索引器赋值 (_animations["Down"] = value)

  • 行为:如果键("Down")已存在,则覆盖该键对应的值;如果键不存在,则添加新键值对
  • 异常:不会因为键已存在而抛出异常
  • 适用场景:当你想要更新已存在的键值对,或者不确定键是否存在时

2. Add 方法 (_animations.Add("Down", value))

  • 行为:如果键("Down")已存在,则抛出异常 (ArgumentException);只有键不存在时才添加新键值对
  • 异常:如果键已存在,会抛出 ArgumentException
  • 适用场景:当你确定键不存在,或者希望确保不会意外覆盖现有值时

实际应用示例

使用索引器(安全,允许覆盖)

// 初始化字典
_animations = new Dictionary<string, Animation>();

// 添加或更新动画
_animations["Down"] = _playerDownMoveAnim.Animation; // 添加
_animations["Down"] = updatedAnimation; // 更新 - 不会报错

使用 Add 方法(严格,防止意外覆盖)

// 初始化字典
_animations = new Dictionary<string, Animation>();

// 添加动画
_animations.Add("Down", _playerDownMoveAnim.Animation); // 成功添加

// 尝试再次添加相同键
try {
    _animations.Add("Down", updatedAnimation); // 抛出 ArgumentException
}
catch (ArgumentException) {
    Console.WriteLine("键 'Down' 已存在!");
}

在游戏开发中的建议

  1. 初始化阶段:使用 Add 方法,确保不会意外覆盖已有的动画

    public void LoadContent()
    {
        _animations = new Dictionary<string, Animation>();
        _animations.Add("Down", _playerDownMoveAnim.Animation);
        _animations.Add("Up", _playerUpMoveAnim.Animation);
        _animations.Add("Left", _playerLeftMoveAnim.Animation);
        _animations.Add("Right", _playerRightMoveAnim.Animation);
    }
    
  2. 运行时更新:使用索引器,允许动态更新动画

    public void ChangeAnimation(string direction, Animation newAnimation)
    {
        _animations[direction] = newAnimation; // 安全更新
    }
    
  3. 检查键是否存在:可以使用 ContainsKey 方法

    if (!_animations.ContainsKey("Down"))
    {
        _animations.Add("Down", _playerDownMoveAnim.Animation);
    }
    else
    {
        // 处理键已存在的情况
    }
    

总结

  • 使用 字典[键] = 值 当你想添加或更新值
  • 使用 字典.Add(键, 值) 当你只想添加新键值对,并且希望键重复时报错
  • 在游戏开发中,通常初始化时使用 Add,运行时更新使用索引器

posted on 2025-08-30 16:11  C#我喜欢  阅读(6)  评论(0)    收藏  举报

导航