我正在寻找使用隐式运算符的正确语法,该类使用索引器来访问私有字典:
[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 }
答案 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
复制到本地变量中