当前位置: 首页 > 编程语言 > C#

SortedList实现为什么要用ThrowHelper而不是直接抛出?分享

时间:2023-04-10 16:23:54 C#

SortedList实现为什么要用ThrowHelper而不是直接抛出?Reflector告诉我,SortedList使用ThrowHelper类来抛出异常,而不是直接抛出异常,例如:publicTValuethis[TKeykey]{get{intindex=this.IndexOfKey(key);if(index>=0)返回这个.values[index];ThrowHelper.ThrowKeyNotFoundException();返回默认值(TValue);其中ThrowKeyNotFoundException只是执行以下操作:thrownewKeyNotFoundException();请注意,这需要一个duff语句“returndefault(TValue)”,这是无法访问的。我不得不得出结论,这种模式的好处足以证明这一点。这些好处是什么?根据ThrowHelper.cs源码,主要目的是减少JITted代码的大小。以下是链接中的直接复制粘贴://这个文件定义了一个内部类,用于在BCL代码中抛出异常。//主要目的是减少代码大小。////抛出异常的旧方法会生成相当多的IL代码和汇编代码。//以下是示例://C#源代码//thrownewArgumentNullException("key",Environment.GetResourceString("ArgumentNull_Key"));//IL代码://IL_0003:ldstr"key"//IL_0008:ldstr"ArgumentNull_Key"//IL_000d:调用字符串System.Environment::GetResourceString(string)//IL_0012:newobj实例voidSystem.ArgumentNullException::.ctor(string,string)//IL_0017:throw//在IL中是21字节。////所以我们想摆脱ldstr并调用IL中的Environment.GetResource。//为了做到这一点,我创建了两个枚举:ExceptionResource、ExceptionArgument以小整数表示//参数名称和资源名称。源代码将更改为//ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key,ExceptionResource.ArgumentNull_Key);////IL代码将是7个字节。//IL_0008:ldc.i4.4//IL_0009:ldc.i4.4//IL_000a:callvoidSystem.ThrowHelper::ThrowArgumentNullException(valuetypeSystem.ExceptionArgument)//IL_000f:ldarg.0////这也将大大减少了Jitted代码的大小。查看ThrowHelper的作用。它获取错误消息的资源和内容。在这个特定的例子中,没有错误文本,所以它看起来没有用,但他们的模式可能需要它,所以编写它的开发人员按照他/她应该遵循的模式。以上是C#学习教程:SortedList实现为什么要用ThrowHelper而不是直接抛出?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: