具有类索引器的隐式运算符的语法

时间:2016-03-25 14:36:58

标签: c# implicit-conversion indexer

我正在寻找使用隐式运算符的正确语法,该类使用索引器来访问私有字典:

[System.Serializable]
public class MyClass : IEnumerable
{
   private Dictionary<string, object> vars = new Dictionary<string, object>();

   public object this[string key]
   {
       get
       {
           if(vars.ContainsKey(key))
           {
                return (object)vars[key];
           }
           else
           {
               return null;
           }
       }

       set
       {
           object o = value;
           if(!vars.ContainsKey(key))
           {
               vars.Add(key, o);
           }
           else if(value == null)
           {
               vars.Remove(key);
           }
           else
           {
               vars[key] = o;
           }
        }
    }

/*some code*/

   public static implicit operator bool(WorldVars w, string i)
   {
       if(w[i] != null)
       {
           return true;
       }
       else
       {
           return false;
       }
   }
}

现在使用非常简单

MyClass[anykey] = myValue

但我想更快地测试值的存在,例如:

if(MyClass[anykey])
   { //logic }

1 个答案:

答案 0 :(得分:0)

As commenter Eric notes,如果你能够实现你所要求的,那么你班级的语义就会完全被打破。索引器的重点在于,当您编写表达式myClass[anyKey]时,它会计算出您的类与anyKey关联的

如果您要更改实现以便它只返回表示包含的bool值,那么您将不得不实现一些其他机制来实际检索值(例如,单独的方法)。此外,它还会提出设置者应该做什么的问题。

鉴于您展示的实施,在我看来,写if (myClass[anyKey] != null)并不是很不方便,而且对我来说似乎有合理的表现力。也就是说,这是代码清楚表达意图的合理方式。

那就是说,如果你确实想要一些更具表现力的东西,那么为你的目的在你的课堂上写一个ContainsKey()方法是不合理的:

public bool ContainsKey(string key) { return vars.ContainsKey(key); }

然后你可以检查密钥的存在,如:

if (myClass.ContainsKey[anyKey]) { ... }


最后,你发布的代码应该可以很好地工作,但它似乎过于冗长和不一致。恕我直言,编写索引器方法的更好方法是这样的:

public object this[string key]
{
    get
    {
        object o;

        return vars.TryGetValue(key, out o) ? o : null;
    }

    set
    {
        if (value != null)
        {
            vars[key] = value;
        }
        else
        {
            vars.Remove(key);
        }
    }
}

该实现避免了以下内容:

  • 获取值时进行遏制的冗余检查
  • 设置值
  • 时不必要地将value复制到本地变量中
  • 有两行不同的代码,每行代码都可以设置字典中键的值