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

使用字符串插值重载字符串方法分享

时间:2023-04-10 19:10:32 C#

使用字符串插值重载字符串方法为什么字符串插值更喜欢使用string而不是IFormattable来重载方法?想象一下:staticclassLog{staticvoidDebug(stringmessage);静态无效调试(I??Formattable消息);静态布尔IsDebugEnabled{得到;我有非常昂贵的ToString()对象。以前,我做了以下操作:if(Log.IsDebugEnabled)Log.Debug(string.Format("Message{0}",expensiveObject));现在,我想在Debug(IFormattable)中使用IsDebugEnabled逻辑,并且仅在必要时才在消息中的对象上调用ToString()。Log.Debug($"Message{expensiveObject}");但是,这会调用Debug(string)重载。这是Roslyn团队深思熟虑的决定:我们通常认为库大多是用不同的API名称编写的,用于执行不同操作的方法。因此,FormattableString和String之间重载解析的差异无关紧要,因此String也可能获胜。因此,我们应该坚持一个简单的原则,即内插字符串是一个字符串。故事的结局。链接中对此有更多讨论,但事实证明他们希望您使用不同的方法名称。一些库API确实希望消费者使用FormattableString,因为它更安全或更快。采用String的API和采用FormattableString的API实际上做不同的事情,因此不应在同一个名称上重载。意识到你在问为什么你不能这样做,我只想指出你实际上可以做到这一点。您只需要诱使编译器更喜欢FormattableString重载即可。我在这里详细解释了它:https://robertengdahl.blogspot.com/2016/08/how-to-overload-string-and.html这是测试代码:publicclassStringIfNotFormattableStringAdapterTest{publicinterfaceIStringOrFormattableStringOverload{voidOverload(StringIfNotFormattableStringAdapters);无效重载(FormattableStrings);}privatereadonlyIStringOrFormattableStringOverload_stringOrFormattableStringOverload=Substitute.For();公共接口IStringOrFormattableStringNoOverload{voidNoOverload(StringIfNotFormattableStringAdapters);}privatereadonlyIStringOrFormattableStringNoOverload_noOverload=Substitute.For();[事实]publicvoidA_Literal_String_Interpolation_Hits_FormattableString_Overload(){_stringOrFormattableStringOverload.Overload($"可格式化字符串");_stringOrFormattableStringOverload.Received().Overload(Arg.Any());}[事实]publicvoidA_String_Hits_StringIfNotFormattableStringAdapter_Overload(){_stringOrFormattableStringOverload.Overload("plainstring");_stringOrFormattableStringOverload.Received().Overload(Arg.Any());}[事实]publicvoidAn_Explicit_FormattableString_Detects_Missing_FormattableString_Overload(){Assert.Throws(()=>_noOverload.NoOverload((FormattableString)$"这不是allowed"));}}下面是使该项目工作的代码:newStringIfNotFormattableStringAdapter(s);}publicstaticimplicitoperatorStringIfNotFormattableStringAdapter(FormattableStringfs){thrownewInvalidOperationException("MissingFormattableStringoverloadofmethodtakingthistypeasargument");}}你需要将其IFormattableFormattableString为IFormattable或FormattableString:Log.Debug((IFormattable)$"Message{expensiveObject}");您可以使用IFormattable技巧作用为IFormattable为IFormattable的速记:publicstaticclassFormattableExtensions{publicstaticFormattableStringFS(FormattableStringformattableString){returnformattableString;}}并以这种方式使用它:Log.Debug(FS($"Message{expensiveObject}"));想要生产中的JIT编译器InlineFS以上就是C#学习教程:使用字符串插值重载字符串方法的全部内容分享。如果对你有用,需要了解更多C#学习教程,希望大家多加关注——本文来自网络合集,不代表立场,如涉及侵权,请右击联系管理员删除。如需转载请注明出处: