时间: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

时间:2019-05-10 标签:c#applicationautostartwindows7

时间:2019-05-10 标签:c++freadjibberish