C#中内联的替代方案?
我使用以下语句将当前函数(例如,事件处理程序)的名称打印到Visual Studio(2010)中的输出窗口: 如果我把它放在一个实用函数中,比如C#中内联的替代方案?,c#,inline-code,C#,Inline Code,我使用以下语句将当前函数(例如,事件处理程序)的名称打印到Visual Studio(2010)中的输出窗口: 如果我把它放在一个实用函数中,比如DisplayFunctionName(),而不是调用它的父函数,那么每次显示的都是“DisplayFunctionName”——这并不奇怪 我知道C#中没有内联,但是除了使用“snippets”之外,是否还有其他解决方案,以避免重复此类语句?您可以使用显示调用方的名称 public void WriteDebug(string message, [C
DisplayFunctionName()
,而不是调用它的父函数,那么每次显示的都是“DisplayFunctionName
”——这并不奇怪
我知道C#中没有内联,但是除了使用“snippets”之外,是否还有其他解决方案,以避免重复此类语句?您可以使用显示调用方的名称
public void WriteDebug(string message, [CallerMemberName] string memberName = "")
{
Debug.Write("[" + memberName + "] " + message);
}
还有和,您可以使用它包含更多诊断信息。这些属性是。结合方法上的[Conditional(“DEBUG”)]
,您可以在调试期间提供大量信息,这些信息在发布版本中完全消除
我知道C#中没有内联,但是除了使用“片段”之外,还有其他解决方案吗?这样就不必重复这样的语句了
请注意,这实际上与“内联”没有直接关系,与获取调用成员的诊断信息也没有直接关系。也就是说,JIT在代码运行时肯定会执行内联,这是C#具有良好性能的主要原因之一
这需要Visual Studio 2012,因为它在该版本中使用了新的编译器功能
如果您使用的是较旧的编译器,另一种选择是使用来提取堆栈跟踪信息。但是,这会对性能产生相当大的影响,因此我不会在紧循环中使用它,至少不会在生产环境中使用,尽管它在调试期间仍然可以用于诊断
string callingMethodName = (new StackTrace()).GetFrame(1).GetMethod().Name;
“C#?”中没有内联。醒醒:-)是的,C中肯定有内联。如果没有内联,你就无法获得那样的性能……我指的是“C++类型宏”意义上的内联。@SonerGönül:谢谢你的编辑。有关更多详细信息,请参阅。里德,谢谢,+1。我有VisualStudio2010,在我的项目中使用.NET4.0。未定义CallerMemberName。安装.NET4.5会解决这种情况吗?搜索结果表明VS 2010可能无法使用。@Sabuncu您需要使用VS 2012-这是一个编译器功能。您仍然可以将.NET 4作为目标(如果您自己实现这些属性),因为它纯粹是一个编译器功能,但在VS 2010中不起作用。@Decf:谢谢您提供的链接,+1。顺便说一句,里德在他的第二段中引用了相同的链接。@Sabuncu为你提供了另一个VS 2010/.NET 4的替代方案
string callingMethodName = (new StackTrace()).GetFrame(1).GetMethod().Name;