【C#基础】C# 程序通用结构

简介: 编程语言C# 程序结构的介绍 。
序号 系列文章
0 【C#基础】初识编程语言C#

前言

:smile:hello大家好,我是writer桑,前面的章节了解了编程语言C#和.NET平台,那么本章就开始学习C#中的程序结构的相关内容,希望看完大家能够有所收获,感谢支持!

程序结构

C# 中的关键组织结构概念包括 程序命名空间类型成员程序集。 程序声明类型,而类型则包含成员,并被整理到命名空间中。 类型示例包括 类、结构和接口成员示例包括 字段、方法、属性和事件。 编译完的 C# 程序实际上会打包到程序集中。程序集的文件扩展名通常为 .exe 或 .dll,具体视其分别实现的是应用程序还是库而定。

1. 程序实例

接下来我们看一个数据结构堆栈程序的实例,请思考包含以下代码的程序集:

using System;       // using 指令的用法 

namespace Acme.Collections      // namespace 命名空间的用法 
{
    // Stack栈类的声明 
    public class Stack<T>
    {
        Entry _top;

        // 推入元素操作 
        public void Push(T data)
        {
            _top = new Entry(_top, data);
        }

        // 删除并抛出元素
        public T Pop()
        {
            if (_top == null)
            {
                throw new InvalidOperationException();      // 如果栈为空,直接抛出无效操作的异常
            }

            T result = _top.Data;       // 取出顶部的元素赋给result
            _top = _top.Next;           // 使其指针指向下一个元素 
            return result;
        }

        // 嵌套类Entry 
        class Entry
        {
            public Entry Next { get; set; }
            public T Data { get; set; }
            public Entry(Entry next, T data)
            {
                Next = next;
                Data = data;
            }
        }
    }
    
       // 需要被其它文件引用,这里 Main方法加上注释。
    /*
    public class Program
    {
        // 程序开始和结束的地方,Main方法
        static void Main(string[] args)
        {
            Stack<int> s = new Stack<int>();
            s.Push(1);
            s.Push(10);                     // 堆栈包括1, 10 
            Console.WriteLine(s.Pop());
            Console.WriteLine(s.Pop());
            Console.WriteLine(s.Pop());     // InvalidOperationException: 堆栈为空 
        }
    }
    */
}
  • 程序的第一行 using Systemusing 指令的用法,即在程序中引用 System 命名空间;一个程序允许有多个 using 关键字的存在,注意在C#程序中 using 指令的用法还有两种,分别是为类型创建别名和释放资源。
  • 程序的第三行使用 namespace 关键字创建命名空间,即此程序的命名空间名为 Acme.Collections ;在C#程序中,命名空间在两个方面被大量使用分别为: .NET使用命名空间来组织它的许多类、 控制类和方法名称的范围空间
  • 接下来几行即 class 类的声明; 此类的完全限定的名称为Acme.Collections.Stack。 类中包含多个成员:一个 _top 字段、两个方法 PushPop 和一个 Entry 嵌套类。
  • Entry 类还包含三个成员:一个名为 Next 的属性、一个名为 Data 的属性和一个构造函数。Stack 是泛型类。它具有一个类型参数 T,在使用时替换为具体类型。
  • 接下来使用 class 关键字声明 Program 类,并且定义了 Main 方法;Main 方法是可执行程序的入口点,也是程序控制开始和结束的位置。其中 Main 方法的参数 string[] args 表示接收控制台命令的参数,不需要时也可不写。
  • // 在 C# 程序中表示单行注释,此外还有 /.../ 表示多行注释、XML注释方式 /// 用来解释代码块的具体含义,便于开发者理解。

堆栈的解释:

堆栈是一个“ 先进后出”(FILO) 集合。 添加到堆栈顶部的新元素。 删除元素时,将从堆栈顶部删除该元素。 前面的示例声明定义堆栈的存储和行为的 Stack 类型。 可以声明一个引用 Stack 类型的实例的变量来使用该功能。

2. 程序集

程序集包含中间语言 (IL) 指令形式的可执行代码和元数据形式的符号信息。 执行前,.NET 公共语言运行时的实时 (JIT) 编译器会将程序集中的 IL 代码转换为特定于处理器的代码。

由于程序集是包含代码和元数据的自描述功能单元,因此无需在 C# 中使用 #include 指令和头文件。 只需在编译程序时引用特定的程序集,即可在 C# 程序中使用此程序集中包含的公共类型和成员。 例如,此程序使用 acme.dll 程序集中的 Acme.Collections.Stack 类, 示例代码如下:

using Acme.Collections;     //  引用 Acme.Collections 命名空间 

class Example
{
    public static void Main()
    {
        var s = new Acme.Collections.Stack<int>();      // 生成一个堆栈s 
        s.Push(1);              // 堆栈包含 1
        s.Push(10);             // 堆栈 1, 10
        s.Push(100);            // 堆栈 1, 10, 100
        Console.WriteLine(s.Pop()); // 堆栈 1, 10
        Console.WriteLine(s.Pop()); // 堆栈 1
        Console.WriteLine(s.Pop()); // 堆栈是空的
    }
} 
  • 若要编译此程序,需要引用包含前面示例中定义的堆栈类的程序集。 (using Acme.Collections; )
  • C# 程序可以存储在多个源文件中。在编译 C# 程序时,将同时处理所有源文件,并且源文件可以自由地相互引用。从概念上讲,就好像所有源文件在被处理之前都连接到一个大文件。
  • 在 C# 中永远都不需要使用前向声明,因为声明顺序无关紧要(极少数例外情况除外)。 C# 并不限制源文件只能声明一种公共类型,也不要求源文件的文件名必须与其中声明的类型相匹配。

3. 顶级语句

顶级语句也即不使用 Main 方法的程序,从 C# 9 开始,无需在控制台应用程序项目中显式包含 Main 方法。 相反,可以使用顶级语句功能 最大程度地减少必须编写的代码。 在这种情况下,编译器将为应用程序生成类和 Main 方法入口点。

也就是从 C# 9 开始,在程序中直接写出以下代码即可运行:

Console.WriteLine("Hello World!");

注意:

  • 一个应用程序只能有一个入口点,也就是一个项目只能有一个包含顶级语句的文件。 在项目中的多个文件中放置顶级语句会导致编译器错误:只有一个编译单元可具有顶级语句
  • 可以显式编写 Main 方法,但它不能作为入口点。 编译器将发出以下警告:程序的入口点是全局代码;忽略“Main()”入口点

结语

:heavy_check_mark: 以上就是C#程序结构的介绍,希望能够对大家有所帮助。请大家多多支持,你们的支持就是笔者创作最大的动力!
目录
相关文章
|
29天前
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
|
5月前
|
存储 安全 Java
程序与技术分享:C#值类型和引用类型的区别
程序与技术分享:C#值类型和引用类型的区别
43 0
|
19天前
|
设计模式 程序员 C#
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
|
1月前
|
XML 存储 安全
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
C#开发的程序如何良好的防止反编译被破解?ConfuserEx .NET混淆工具使用介绍
47 0
|
1月前
|
安全 API C#
C# 如何让程序后台进程不被Windows任务管理器强制结束
C# 如何让程序后台进程不被Windows任务管理器强制结束
59 0
|
2月前
|
C# 容器
C#中的命名空间与程序集管理
在C#编程中,`命名空间`和`程序集`是组织代码的关键概念,有助于提高代码的可维护性和复用性。本文从基础入手,详细解释了命名空间的逻辑组织方式及其基本语法,展示了如何使用`using`指令访问其他命名空间中的类型,并提供了常见问题的解决方案。接着介绍了程序集这一.NET框架的基本单位,包括其创建、引用及高级特性如强名称和延迟加载等。通过具体示例,展示了如何创建和使用自定义程序集,并提出了针对版本不匹配和性能问题的有效策略。理解并善用这些概念,能显著提升开发效率和代码质量。
94 4
|
1月前
|
API C#
C#实现Winform程序右下角弹窗消息提示
C#实现Winform程序右下角弹窗消息提示
70 0
|
2月前
|
Linux C# 开发者
Uno Platform 驱动的跨平台应用开发:从零开始的全方位资源指南与定制化学习路径规划,助您轻松上手并精通 C# 与 XAML 编程技巧,打造高效多端一致用户体验的移动与桌面应用程序
【9月更文挑战第8天】Uno Platform 的社区资源与学习路径推荐旨在为初学者和开发者提供全面指南,涵盖官方文档、GitHub 仓库及社区支持,助您掌握使用 C# 和 XAML 创建跨平台原生 UI 的技能。从官网入门教程到进阶技巧,再到活跃社区如 Discord,本指南带领您逐步深入了解 Uno Platform,并提供实用示例代码,帮助您在 Windows、iOS、Android、macOS、Linux 和 WebAssembly 等平台上高效开发。建议先熟悉 C# 和 XAML 基础,然后实践官方教程,研究 GitHub 示例项目,并积极参与社区讨论,不断提升技能。
76 2
|
6月前
|
C#
C#的基本语法结构学习
【5月更文挑战第17天】C#基础语法包括变量(如`int x = 10`)、常量(`const int MAX_VALUE = 100`)、运算符(如算术和比较运算符)、控制语句(if、for、while等)和函数声明(`int Add(int x, int y) { return x + y; }`)。这些构成C#程序的基本元素。
75 0