我不想讨论何时抛出异常而不抛出异常.我想解决一个简单的问题.99%的时间不抛出异常的论点围绕着它们缓慢而另一方声称(基准测试)速度不是问题.我读过很多关于一方或另一方的博客,文章和帖子.那是哪个呢?
C#中的例外有多贵?只要堆叠不深,它们似乎并不是非常昂贵; 但我读过相互矛盾的报道.
有没有被反驳的确定性报告?
我有一个Vector2的生成列表我必须检查一个字典,看看它们是否存在,这个函数每次滴答都会被执行.
这样做会跑得最快/做得更好?
public static bool exists(Vector2 Position, Dictionary<Vector2, object> ToCheck)
{
try
{
object Test = ToCheck[Position];
return (true);
}
catch
{
return (false);
}
}
Run Code Online (Sandbox Code Playgroud)
或者我应该坚持常态?
public static bool exists(Vector2 Position, Dictionary<Vector2, object> ToCheck)
{
if (ToCheck.ContainsKey(Position))
{
return (true);
}
return (false);
}
Run Code Online (Sandbox Code Playgroud)
谢谢你输入:)
旁注:(此时密钥的值无关紧要,或者我将使用TryGetValue而不是ContainsKey)
我有一个Dictionary<string, decimal>具有固定数量的条目,并且我想经常更新它的许多值,但仅限于已经存在的键。如果字典中尚不存在某个键,我不想添加它,因为我的目标是将字典限制为固定大小。因此,下面的代码(使用set 索引器)将无法满足我的需求:
dictionary[key] = newValue;
Run Code Online (Sandbox Code Playgroud)
key如果它已经存在,此代码将更新它的值,或者如果它不存在,它将插入一个新的键/值对。那不是我想要的。所以我TryUpdate为该类编写了一个扩展方法Dictionary<TKey, TValue>,具有理想的行为:
public static bool TryUpdate<TKey, TValue>(
this Dictionary<TKey, TValue> source,
TKey key, TValue value)
{
ArgumentNullException.ThrowIfNull(source);
if (!source.ContainsKey(key))
return false;
source[key] = value;
return true;
}
Run Code Online (Sandbox Code Playgroud)
现在我的代码按预期工作:
dictionary.TryUpdate(key, newValue);
Run Code Online (Sandbox Code Playgroud)
我不喜欢上述实现的是,如果密钥已经存在(这是我的场景中的常见情况),则密钥将在每个TryUpdate操作中被哈希两次。因此,为了保证我的字典不会增长超过其初始大小,我将在性能方面付出双倍的代价。键是长字符串,因此哈希成本很高。有没有办法重写我的TryUpdate方法,使其与set索引器一样高效?
c# ×4
dictionary ×2
exception ×2
performance ×2
.net ×1
.net-6.0 ×1
containskey ×1
hashcode ×1
try-catch ×1