前面两篇文章简单介绍了C#创建控制台程序
和窗体应用程序
无论是控制台应用还是Windows窗体应用,都有以下两种生成.exe文件的方式。
(1)在调试环境下,编译后生成的.exe文件及其文件默认保存在项目的“bin\dubug\.netxxx”子文件夹下。
(2)在发布环境下,编译后生成.exe文件及他文件默认保存在项目“bin\release\.netxxx”子文件夹下。发布程序时一般采用这种方式。
一、命名空间和类
.NET为开发人员提供了非常多的类,利用这些类可快速实现各种功能。为了避免类名冲突和方便管理,这些类分别被划分为不同的名命空间中。
1.将类划分到不同的命名空间中
不同命名空间下类的划分方式类似于不同子目录下文件的划分方式,一是同一个项目中可包含多个命名空间,二是不同的命名空间下的类名可以相同也可以不同。
调用命名空间下某个类提供的属性、方法和事件时,命名空间、类名、静态方法名之间都用点“.”分割。例如,调用类中某个静态方法的一般语法如下:
命名空间.命名空间......命名空间.类名.静态方法名(参数,.....)
若命名空间下的某个方法为实例方法,需要先创建类的实例,然后再通过实例名访问其中包含的方法,一般语法如下:
命名空间.命名空间......命名空间.类名.方法名(参数,.....)
以上语法中的内容需要用实际的名称替换。例如:
System.Console.WriteLine("Hello World");
上面这条语句调用System命名空间下Console类的WriteLine类静态方法,实现的功能是输出字符串“Hello World”。
但是,这种每行语句都从命名空格开始依次键入的一大串写法过于繁琐,为了提高输入效率,还需要引入一个新的概念:using关键字。
2.using关键字
在C#编程中,using关键字有如下用法。
(1)作为引用指令
将using关键字作为引用指令来使用时,其用途是导入某个命名空间中包含的类型。一般在程序的开头引用命名空间来简化代码的表示形式。例如,对于语句:
System.COnsole.WriteLine("Hello World");
如果在程序的开头加上:
using System;
则该语句就可以简写为:
Console.WriteLine("Hello World");
(2)作为别名指令
using关键字还可以给一串命名空间定义一个简写的名称。例如:
using System.Windows;
可以表示为:
using Win=System.Windows;
这样一来,语句:
System.Windows.MessageBox.Show("Hello");
就可以简写为:
Win.MessageBox.Show("Hello");
(3)作为语句
将using关键字作为一条语句使用的情况非常多。此时语句的作用是当不再使用该语句所指定的对象时,立即释放该对象,而不是让垃圾回收器去处理它。这是用C#编写代码时立即释放占用大量内存空间资源(图片、字库等)的最简单高效的方式。
例如:
static void main() { using StreamWriter w = File.CreateText("text.txt"); w.WriterLine("1111"); w.WriterLine("2222"); w.WriterLine("3333"); }
上面是一种简写的using 语句用法,用起来比早期版本的using语句用法更直观。此用法是从C#8.0开始增加的,在早期的C#版本中,这段代码是用下面的形式表示的:
static void main() { using (StreamWriter w = File.CreateText("text.txt")) { w.WriterLine("1111"); w.WriterLine("2222"); w.WriterLine("3333"); } }
3.全局using指令
为了让代码看起来更加简洁,从C#6.0开始,引入了“全局using指令”的概念。
全局using指令是指在整个应用程序范围内声明的引用指令,开发人员在整个项目中都可以直接使用所引用的这些命名空间下的类,不再需要在每个文件内都显示声明这些using指令。
使用VS2022创建项目时,系统默认会自动生成全局using指令。例如:
using System; using System.IO; using System.Linq;
此时,在每个扩展为.cs的文件内再显式声明这些using指令就没有必要了。另外,除了系统默认自动生成的这些全局using指令所引用的命名空间,开发人员在代码中引用其他命名空间时,仍热必须显式声明引用其他命名空间的using指令。
4.顶级语句和隐式using指令
当生成项目时,编译器会自动将Program类和Main方法合成,并将所有顶级语句放置在Main方法内。同时,编译器还会根据项目类型自动添加一组全局using指令,在这种情况下自动添加的这些全局using指令称为“隐式using指令”,这些指令会隐式包含在应用程序项目中,开发人员可在整个应用项目中直接使用隐式using指令所引用的命名空间。
不论是否选择【不使用顶级语句】选项,系统会自动生成全局using指令。