【发布时间】:2013-11-01 12:32:16
【问题描述】:
如果我在一个类中实现一个接口,它绝对什么都不做,它会减慢调用它的代码吗?例子2(NoLogger)对代码速度有影响吗,用在什么地方?
示例代码:
interface ILogger{
void Write(string text);
}
class TextLogger : ILogger {
public void Write(string text){
using (var sw = new StreamWriter(@"C:\log.txt"))
{
sw.WriteLine(text);
}
}
}
class NoLogger : ILogger{
public void Write(string text){
//Do absolutely nothing
}
}
实现一、TextLogger
void Main(){
ILogger tl = new TextLogger();
for (int i = 0; i < 100; i++)
{
tl.Write(i.ToString());
}
}
实现 2,NoLogger
void Main(){
ILogger tl = new NoLogger();
for (int i = 0; i < 100; i++)
{
tl.Write(i.ToString());
}
}
当然,示例 1(文本记录器)会减慢执行它的代码的速度,因为它实际上做了一些事情。
但是示例 2 呢?编译器是否足够智能,能够判断出即使实例化了一个类并调用了一个方法,也绝对没有代码可以在任何路径上执行任何操作,而只是在编译时忽略它?
【问题讨论】:
-
如果您使用优化构建(发布模式),对
Write的调用可能会内联,因此堆栈不必处理额外的“框架” " 用于方法调用。当正文为空时,内联可能意味着什么都不做。但是,C# 编译器不会删除对方法的调用。
标签: c# .net compiler-construction