C# 预处理器指令与命名空间

目录

一、预处理器指令

1.#warning 和 #error:

2. #region 和 #endregion

3. #line

4. #pragma

二、命名空间Namespace

1.命名空间

2.using 关键字


一、预处理器指令

预处理器指令指导编译器在实际编译开始之前对信息进行预处理。
所有的预处理器指令都是以 # 开始。且在一行上, 预处理器指令不是语句,所以它们不以分号(;)结束。
C# 编译器没有一个单独的预处理器,但是,指令被处理时就像是有一个单独的预处理器一样。 在 C# 中,预处理器指令用于在条件编译中起作用。

C# 预处理器指令列表

下表列出了 C# 中可用的预处理器指令:
预处理器指令
描述
#define
它用于定义一系列成为符号的字符。
#undef
它用于取消定义符号。
#if
它用于测试符号是否为真。
#else
它用于创建复合条件指令,与 #if 一起使用。
#elif
它用于创建复合条件指令。
#endif
指定一个条件指令的结束。
#line
它可以让您修改编译器的行数以及(可选地)输出错误和警告的文件名。
#error
它允许从代码的指定位置生成一个错误。
#warning
它允许从代码的指定位置生成一级警告。
#region
它可以让您在使用 Visual Studio Code Editor 的大纲特性时,指定一个可展开或折叠的代码块。
#endregion
它标识着 #region 块的结束。

预处理指令在程序调试和运行上有重要的作用。比如预处理器指令可以禁止编译器编译代码的某一部分,如果计划发布两个版本的代码,即基本版本和有更多功能的企业版本,就可以使用这些预处理器指令来控制。在编写提供调试信息的代码时,也可以使用预处理器指令进行控制。总的来说和普通的控制语句(if等)功能类似,方便在于预处理器指令包含的未执行部分是不需要编译的。
#define PI
using System;namespace PreprocessorDAppl{
class Program
{
static void Main(string[] args)
{
#if (PI)
Console.WriteLine("PI is defined"); //PI不存在,则这条语句不编译
#else
Console.WriteLine("PI is not defined"); //PI存在,则这条语句不编译
#endif
Console.ReadKey();
}
}}

其他预处理器指令:

1.#warning 和 #error:

当编译器遇到它们时,会分别产生警告或错误。如果编译器遇到 #warning 指令,会给用户显示 #warning 指令后面的文本,之后编译继续进行。如果编译器遇到 #error 指令,就会给用户显示后面的文本,作为一条编译错误消息,然后会立即退出编译。使用这两条指令可以检查 #define 语句是不是做错了什么事,使用 #warning 语句可以提醒自己执行某个操作。

#if DEBUG && RELEASE #error "You've defined DEBUG and RELEASE simultaneously!"

#endif

#warning "Don't forget to remove this line before the boss tests the code!"

Console.WriteLine("*I hate this job.*");

2. #region 和 #endregion

#region 和 #endregion 指令用于把一段代码标记为有给定名称的一个块,如下所示:

#region Member Field Declarationsint x;double d;Currency balance;#endregion

这看起来似乎没有什么用,它不影响编译过程。这些指令的优点是它们可以被某些编辑器识别,包括 Visual Studio .NET 编辑器。这些编辑器可以使用这些指令使代码在屏幕上更好地布局。

3. #line

#line 指令可以用于改变编译器在警告和错误信息中显示的文件名和行号信息,不常用。

如果编写代码时,在把代码发送给编译器前,要使用某些软件包改变输入的代码,就可以使用这个指令,因为这意味着编译器报告的行号或文件名与文件中的行号或编辑的文件名不匹配。#line指令可以用于还原这种匹配。也可以使用语法#line default把行号还原为默认的行号:

#line 164 "Core.cs" // 在文件的第 164 行// Core.cs, before the intermediate// package mangles it.// later on#line default // 恢复默认行号

4. #pragma

#pragma 指令可以抑制或还原指定的编译警告。与命令行选项不同,#pragma 指令可以在类或方法级别执行,对抑制警告的内容和抑制的时间进行更精细的控制。如下:


#pragma warning disable 169 // 取消编号 169 的警告(字段未使用的警告)public class MyClass{

int neverUsedField; // 编译整个 MyClass 类时不会发出警告

}
#pragma warning restore 169 // 恢复编号 169 的警告

总结:预处理器指令主要是方便我们开发人员进行调试,如用#else搭配来可以不编译部分代码,开发无报错可自定义报错提示等等。


二、命名空间Namespace

1.命名空间

命名空间类似于一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。

定义命名空间

命名空间的定义是以关键字  namespace  开始,后跟命名空间的名称,如下所示:
namespace namespace_name
{
   // 代码声明
}

嵌套命名空间

命名空间可以被嵌套,即您可以在一个命名空间内定义另一个命名空间,如下所示:
namespace namespace_name1
{
// 代码声明
namespace namespace_name2
{
// 代码声明
} }
可以使用点(.)运算符访问嵌套的命名空间的成员 using SomeNameSpace.Nested;
Nested是 SomeNameSpace内声明的命名空间

2.using 关键字

using 关键字表明程序使用的是给定命名空间中的名称。例如,我们在程序中使用 System 命名空间,其中定义了类 Console。我们可以只写:
Console . WriteLine ( "Hello there" );
我们可以写完全限定名称,如下:
System . Console . WriteLine ( "Hello there" );

1. using指令:引入命名空间

这是最常见的用法,例如:

using System;using Namespace1.SubNameSpace;

2. using static 指令:指定无需指定类型名称即可访问其静态成员的类型

using static System.Math;

var = PI; // 直接使用System.Math.PI

3. 起别名

using Project = PC.MyCompany.Project;

4. using语句:将实例与代码绑定

using (Font font3 = new Font("Arial", 10.0f),

font4 = new Font("Arial", 10.0f))

{

// Use font3 and font4.

}

代码段结束时,自动调用font3和font4的Dispose方法,释放实例。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值