C#能否像使用预处理器语句在C编程语言中那样定义宏?我想简化某些重复语句的常规输入,如下所示:
Console.WriteLine("foo");
Andrew Hare.. 48
不,C#不支持像C这样的预处理器宏.另一方面,Visual Studio有片段.Visual Studio的代码片段是IDE的一个功能,在编辑器中进行了扩展,而不是在预处理器的编译代码中替换.
不,C#不支持像C这样的预处理器宏.另一方面,Visual Studio有片段.Visual Studio的代码片段是IDE的一个功能,在编辑器中进行了扩展,而不是在预处理器的编译代码中替换.
您可以使用C预处理器(如mcpp)并将其装入.csproj文件中.然后,您可以在源文件中编译"构建操作",从"编译"到"预处理"或您调用的任何内容.只需将BeforBuild添加到您的.csproj中,如下所示:
您可能必须在至少一个文件(在文本编辑器中)手动更改编译到预处理 - 然后在Visual Studio中可以选择"预处理"选项.
我知道宏被严重过度使用和误用,但是如果不是更糟的话,将它们完全删除也同样糟糕.宏使用的典型示例是NotifyPropertyChanged.每个必须手动重写这段代码的程序员都知道没有宏会有多痛苦.
我用它来避免Console.WriteLine(...)
:
public static void Cout(this string str, params object[] args) { Console.WriteLine(str, args); }
然后你可以使用以下内容:
"line 1".Cout(); "This {0} is an {1}".Cout("sentence", "example");
它简洁而有点时髦.
虽然你不能编写宏,但在简化你的例子之类的东西时,C#6.0现在提供了静态用法.以下是Martin Pernica在他的Medium文章中给出的例子:
using static System.Console; // Note the static keyword namespace CoolCSharp6Features { public class Program { public static int Main(string[] args) { WriteLine("Hellow World without Console class name prefix!"); return 0; } } }
没有直接等价于C风格的宏在C#中,但inline
d静态方法-用或不用#if
/ #elseif
/ #else
编译指示-是你可以得到的最接近:
////// Prints a message when in debug mode /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Log(object message) { #if DEBUG Console.WriteLine(message); #endif } ////// Prints a formatted message when in debug mode /// /// A composite format string /// An array of objects to write using format [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void Log(string format, params object[] args) { #if DEBUG Console.WriteLine(format, args); #endif } ////// Computes the square of a number /// /// The value ///x * x [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double Square(double x) { return x * x; } ////// Wipes a region of memory /// /// The buffer [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void ClearBuffer(ref byte[] buffer) { ClearBuffer(ref buffer, 0, buffer.Length); } ////// Wipes a region of memory /// /// The buffer /// Start index /// Number of bytes to clear [MethodImpl(MethodImplOptions.AggressiveInlining)] public static unsafe void ClearBuffer(ref byte[] buffer, int offset, int length) { fixed(byte* ptrBuffer = &buffer[offset]) { for(int i = 0; i < length; ++i) { *(ptrBuffer + i) = 0; } } }
这可以完美地用作宏,但有一个缺点:标记为inline
d的方法将像其他“常规”方法一样复制到程序集的反射部分。