gpt4 book ai didi

c# - 如何将 [CallerLineNumber] 的参数强制为只读?

转载 作者:行者123 更新时间:2023-11-30 16:59:04 24 4
gpt4 key购买 nike

[CallerLineNumber] 是一项很棒的语言功能。但我用它来 automatically order class properties as their declaration order .但是,当用户调用带有此参数的函数或构造函数时,用户可以为其提供一个值,这完全违背了自动生成的目的。目前,我必须将此参数命名为类似 _doNotSet 的名称,以提示调用者不要设置此参数。

我怎样才能强制它为只读,或者更好的是,将它从函数签名中隐藏起来?

我的另一个想法是将参数标记为 [Obsolete],这样编译器会在使用它时发出警告。不幸的是,ObsoleteAttribute 不是针对参数的,所以我不能这样标记参数。

最佳答案

我很惊讶编译器没有覆盖调用函数传入的值。无论如何,接受这种不幸的行为,我认为您无法做任何事情来保证没有人会破坏它。

据我所知,最接近的就是你所做的。将其命名为 _doNotSet,但我建议使用 _settingThisBreaksTheTool。根据代码的受众,这可能足以满足您的需求。

编辑这个link展示了如何确定是否提供了一个值,不幸的是,那里提供的策略都不适合你。基本上他们建议使用一个已知的不太可能的值(在你的情况下是不可能的,因为你不知道行号或者你不关心)。或者不要使用默认值并重载函数。但是 [CallerLineNumber] 属性需要参数是可选的才能工作。 SCSS 。

拜托微软...为什么

这涉及 .Net 如何实现可选参数的默认值。当您指定一个函数的参数是可选的,并在没有值的情况下调用该函数时,编译期间会发生一些非常特别的事情。 具有该参数值的代码被替换为具有默认值的值的代码。

我前一段时间读了一些关于这个的博客文章,this了解基础知识是最简单的。

我可能在这里做了一些跳跃,但我的猜测是 [CallerLineNumber] 属性指示编译器使用不同的值,即行号。 但是编译器甚至不会执行注入(inject)值的过程,因为首先有一个值。

可能 Microsoft 希望 [CallerLineNumber] 覆盖传递给函数的值,但搭载默认值的副作用可能导致他们无法支持该值。我很想看看 Roslyn项目对该功能进行了一些增强。

关于c# - 如何将 [CallerLineNumber] 的参数强制为只读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24337782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com