时间:2019-05-10 标签:c#release optimizationunusedstring
Posted
技术标签:
【中文标题】时间:2019-05-10 标签:c#release optimizationunusedstring【英文标题】:c# release optimization unused string 【发布时间】:2017-05-10 17:19:36 【问题描述】:简单的问题:
在 VS20XX 的发布版本中,字符串 A 和 B 的连接根本没有完成吗?
string A = // Dynamic string
string B = // Another Dynamic string
DoNothing(A+B);
...
void DoNothing(string MyString)
#ifdef DEBUG
// actual code here using MyString
#endif
如果不清楚,我正在尝试创建一些调试探针,但我不希望消息的串联影响最终版本的性能...
【问题讨论】:
有什么理由不在#ifdef DEBUG
中添加调试调用?
任何未读取的变量都将在发布版本中进行优化。您甚至可能会收到编译器警告。
我怀疑你能不能保证它不会完成。由于方法体最终将是空的,因此可能会省略实际调用。运行时是否意识到字符串连接没有副作用,因此可以省略,这可能是它可能可以做的事情,但我怀疑你可以保证它会做。
@MotKohn 这不是那么容易。例如,如果由于创建该方法从不使用的参数而产生了任何副作用,那么这些副作用仍然需要发生。
@Servy 你是对的,但在 OP 问题中,它看起来都被#ifdef DEBUG
保护着。连接不是副作用。
【参考方案1】:
您实际上可以使用System.Diagnostics.ConditionalAttribute
来完成此操作:
[System.Diagnostics.Conditional( "Debug" )]
void DoNothing( string myString )
// The #if DEBUG is no longer required in here
这实际上将保证调用站点的参数不被评估。
然而,如果 DoNothing
从单独的程序集中被调用(您的示例省略了访问修饰符,因此不清楚预期的可见性是什么),DoNothing
的行为取决于在调用者中定义的符号,而不是在编译 DoNothing
时定义的符号。如果方法最终是私有的或内部的,这无关紧要。
【讨论】:
以上是关于时间:2019-05-10 标签:c#release optimizationunusedstring的主要内容,如果未能解决你的问题,请参考以下文章
时间:2019-05-10 标签:c#socketconnectionwithmultithreadingtelnet
时间:2019-05-10 标签:c#paypalrestapitransactionsearch
时间:2019-05-10 标签:c#socketThread
时间:2019-05-10 标签:c++threadeddbclassmemorymixup