当前位置: 首页 > news >正文

C# 从控制台应用程序入门

总目录


前言

从创建并运行第一个控制台应用程序,快速入门C#。


一、新建一个控制台应用程序

控制台应用程序是C# 入门时,学习基础语法的最佳应用程序。

  • 打开VS2022,选择【创建新项目】
    在这里插入图片描述
  • 搜索【控制台】,选择控制台应用(.NET Framework) ,点击下一步
    在这里插入图片描述
  • 配置新项目:输入项目名称 和位置,点击【创建】即可。
    在这里插入图片描述
  • 创建完毕,得到如下项目结构和代码
    在这里插入图片描述
  • 编写代码
        static void Main(string[] args){Console.Write("Hello World");}
  • 点击运行按钮,运行程序
    在这里插入图片描述

  • 运行结果
    在这里插入图片描述

二、不要完美主义,带着疑问前进

你可能很好奇Console.Write("Hello World");这句代码的运行原理是什么?
甚至好奇 static void Main(string[] args) 是什么意思?
甚至好奇Program.cs 这个文件有什么用?

初学阶段,不要过多的纠结于某一行代码的原理或意义(指太纠结于底层的实现原理),只需要记住,在static void Main(string[] args) 的 那对 大括号{ } 中输入Console.Write("Hello World"); 就可以在‘黑框框’ 内输出 Hello World 即可。学会带着疑问前进,随着代码瞧得多了,敲得多了,有些疑问也会在实践中得到答案。

二、C# 注释

注释:顾名思义就是注解,解释的意思,一般用于解释某一段代码的逻辑或作用。
不参与代码的编译,对运行结果不产生影响。

  • C# 单行注释以 // 开头,持续到当前行的末尾。
        static void Main(string[] args){// 这是一行注释Console.WriteLine("你好!");}

运行结果只会打印出 你好!,而不会将 // 后的内容进行输出

  • C# 还支持多行注释。 多行注释以 /* 开头,以 */ 结尾。
        static void Main(string[] args){/*这是多行注释可以一次性注释多行             */Console.WriteLine("你好!");}

运行结果只会打印出 你好!,而不会将 /**/ 内的内容进行输出

三、编写代码注意事项

这是相较于其他的编程语言来对比的结果

  • 大括号 {} 是建议独占一行的
  • C# 代码是区分大小写的
  • 所有的语句和表达式必须以分号(;)结尾。
		// 区分大小写,如果 staic 该成 Static 就会无法运行static void Main(string[] args){   //大括号独占一行Console.WriteLine("你好!");  //这里 以 ; 结束}   //大括号独占一行

四、控制台常用代码

控制台应用程序是入门级的应用程序,一般常用的代码如下:

//输出
Console.Write("你好");//换行输出
Console.WriteLine("你好");
//以上代码主要用于在控制台输出信息//读取控制台输入的信息
Console.Read();
//读取控制台当前行输入的信息
Console.ReadLine();
//读取字符
Console.ReadKey();
//以上代码主要用于在控制读取输入的信息//接受用户输入的字符串,以换行结束
string s=Console.ReadLine();
  • 建议控制台应用程序代码以Console.ReadLine()Console.ReadKey()等结束
  • 因为早先的时候,控制台不以Console.ReadLine()Console.ReadKey()等结束否则代码走完,控制台的窗体就会关闭。如今变成了可以配置的项。
    在这里插入图片描述

五、程序结构

1. 概述

C# 程序由一个或多个文件组成。 每个文件均包含零个或多个命名空间。 一个命名空间包含类、结构、接口、枚举、委托等类型或其他命名空间。

  • C# 程序
    • 一个或多个文件
      • 零个或多个命名空间
        • 类、结构、接口、枚举、委托等类型或其他命名空间

下面的案例代码,展示了 基本的C# 程序结构

// A skeleton of a C# program
using System;
namespace YourNamespace
{class YourClass{}struct YourStruct{}interface IYourInterface{}delegate int YourDelegate();enum YourEnum{}namespace YourNestedNamespace{struct YourStruct{}}class Program{static void Main(string[] args){//Your program starts here...Console.WriteLine("Hello world!");}}
}
  • Main 就是方法,并且是个静态方法, 是程序的入口点,即程序从这里开始执行你所编写的代码
  • namespace 就是命令空间
  • using 在这里 表示 引用命名空间,如 using System; 表示引入System 命名空间
  • class 就是 类,class Program 就是 名为 Program 的类

2. Main 方法

  • Main 方法是 C# 应用程序的入口点。 Main 方法是应用程序启动后调用的第一个方法。

  • C# 程序中只能有一个入口点。如果多个类包含 Main 方法,必须使用 StartupObject 编译器选项来编译程序,以指定将哪个 Main 方法用作入口点。具体操作如下图所示:

在这里插入图片描述

六、C# 程序编译过程

1. .NET 与CLR

在这里插入图片描述

  • .NET 提供了一个称为公共语言运行时的运行时环境,它运行代码并提供使开发过程更轻松的服务。
  • CLR 是.NET 实现的一个组成部分。

2. CLR

  • CLR :全称 Common Language Runtime,公共语言运行时
  • CLR是通用语言架构(简称CLI)的微软实现版本
  • CLR是一个类似于JVM的虚拟机,为微软的.Net产品提供运行环境。CLR运行一种称为“通用中间语言”的字节码,这个是微软的通用中间语言实现版本。
  • 运行时提供如下优点:
    • 性能得到了改进。
    • 能够轻松使用用其他语言开发的组件。
    • 类库提供的可扩展类型。
    • 语言功能,如面向对象的编程的继承、接口和重载。
    • 允许创建多线程的可缩放应用程序的显式自由线程处理支持。
    • 结构化异常处理支持。
    • 自定义特性支持。
    • 垃圾回收(Garbage Collector),它能为你自动管理内存。
      • GC自动从内存中删除程序不再访问的对象
      • GC是程序员不再操心许多以前必须执行的任务,比如释放内存和检查内存泄漏。这可不是小特性,因为检查内存泄漏可能非常困难而且耗时。
    • 使用委托取代函数指针,从而增强了类型安全和安全性。

3. MSIL / CIL / IL

  • IL :中间语言
  • CIL:通用中间语言
  • MSIL:微软的通用中间语言实现版本

4. 托管代码和非托管代码

  • 使用面向运行时的语言编译器开发的代码称为托管代码。 托管代码具有许多优点,例如:跨语言集成、跨语言异常处理、增强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。
  • 在公共语言运行库环境的外部,由操作系统直接执行的代码。 非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;

在这里插入图片描述

托管代码:为.NET框架编写的代码称为托管代码,需要CLR。
非托管代码:不在CLR控制之下运行的代码,比如Win32C/C++ DLL

5. 扩展

  • CLR上实际运行的并不是我们通常所用的编程语言(例如C#、VB等),而是一种字节码形态的“中间语言”。这意味着只要能将代码编译成这种特定的“中间语言”(MSIL),任何语言的产品都能运行在CLR上。

  • 微软已经为多种语言开发了基于CLR的编译器,这些语言包括:C++/CLI、C#、Visual Basic、F#、Iron Python、 Iron Ruby和IL。除此之外,其他的一些公司和大学等机构也位一些语言开发了基于CLR的编译器,例如Ada、APL、Caml、COBOL、Eiffel、Forth、Fortran、Haskell、Lexicon、LISP、LOGO、Lua、Mercury、ML、Mondrian、Oberon、Pascal、Perl、PHP、Prolog、RPG、Scheme、Smaltak、Tcl/Tk。

  • CLR为不同的编程语言提供了统一的运行平台,在很大程度上对上层开发者屏蔽了语言之间才特性差异。对于CLR来说,不同语言的编译器(Compiler)就相当于一个这种语言的代码审查者(Checker),所做的工作就是检查源码语法是否正确,然后将源码编译成CLR所需要的中间语言(IL)。所以编程语言对于CLR是透明的,也就是说CLR只知道IL的存在,而不知道IL是由哪种语言编译而来。

  • 有了公共语言运行时,就可以很容易地设计出对象能够跨语言交互的组件和应用程序。 CLR的这种“公共语言”的特性使得“多语言混合编程”成为可能,让APL开发人员可以使用自己熟悉的语言和语法来开发基于.Net的项目。当然,更重要的是,这种特性允许用不同的语言来开发同一个项目的不同模块,比如在一个项目中用Visual Basic开发UI、用APL开发财务相关的模块,而与数学计算有关的模块使用F#,充分利用这些语言的特性,将会得到意想不到的效果。

4. 编译过程

本结所用示例图来自 C#、.NET Framework、CLR的关系

  • (1)编译成CIL:.NET语言的编译器接受源代码文件,并生成名为程序集的输出文件。程序集可以是 exedll
    • 程序集里的代码并不是本机代码,而是一种名称为CIL(Common Intermediate Language,公共中间语言)的中间代码。
    • 程序集包含的信息中,包含下列项目:程序的CIL、程序中使用的类型的元数据、对其他程序集引用的元数据
      在这里插入图片描述
  • (2)编译成本机代码并执行:程序的CIL直到它被调用运行时才会被编译成本机代码。在运行时,CLR执行下面的步骤(如下图)
    • 检查程序集的安全特性
    • 在内存中分配空间
    • 把程序集中的可执行代码发送给实时(Just-in-Time)编译器,把其中的一部分编译成本机代码。

在这里插入图片描述

  • (3)编译和执行综述:无论原始源文件的语言是什么,懂遵循同样的编译和执行过程。
    在这里插入图片描述

结语

回到目录页: C# 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。


参考资料:
官方 - C#文档
官方 - .NET 文档
C#、.NET Framework、CLR的关系

相关文章:

C# 从控制台应用程序入门

总目录 前言 从创建并运行第一个控制台应用程序,快速入门C#。 一、新建一个控制台应用程序 控制台应用程序是C# 入门时,学习基础语法的最佳应用程序。 打开VS2022,选择【创建新项目】 搜索【控制台】,选择控制台应用(.NET Framew…...

怿星科技联合赛力斯举办workshop活动,进一步推动双方合作

12月18日,由怿星科技与赛力斯汽车联合举办的workshop活动在赛力斯五云湖总部展开,双方嘉宾围绕智能汽车发展趋势、行业前沿技术、汽车电子网络与功能测试等核心议题展开了深度对话与交流,并现场参观演示了多套前沿产品。怿星科技CEO潘凯、汽车…...

JVM和数据库面试知识点

JVM内存结构 主要有几部分:堆、栈、方法区和程序计数器 堆是JVM中最大的一块内存区域,用于存储对象实例,一般通过new创建的对象都存放在堆中。堆被所有的线程共享,但是它的访问时线程不安全的,通常通过锁的机制来保证线…...

批量提取zotero的论文构建知识库做问答的大模型(可选)——含转存PDF-分割统计PDF等

文章目录 提取zotero的PDF上传到AI平台保留文件名代码分成20个PDF视频讲解 提取zotero的PDF 右键查看目录 发现目录为 C:\Users\89735\Zotero\storage 写代码: 扫描路径‘C:\Users\89735\Zotero\storage’下面的所有PDF文件,全部复制一份汇总到"C:\Users\89735\Downl…...

Codeforces Round 993 (Div. 4)个人训练记录

Codeforces Round 993 (Div. 4) 只选择对我有价值的题目记录 E. Insane Problem 题目描述 给定五个整数 k k k, l 1 l_1 l1​, r 1 r_1 r1​, l 2 l_2 l2​ 和 r 2 r_2 r2​,Wave 希望你帮助她计算满足以下所有条件的有序对 …...

【优选算法---分治】快速排序三路划分(颜色分类、快速排序、数组第K大的元素、数组中最小的K个元素)

一、颜色分类 题目链接: 75. 颜色分类 - 力扣(LeetCode) 题目介绍: 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序…...

Spring Cloud OpenFeign

概述 Feign是一个声明式web服务客户端。可以像写接口一样定义http客户端。Feign还支持可插拔的编码器和解码器。Spring Cloud增加了对Spring MVC注释和使用Spring Web中默认使用的HttpMessageConverter的支持。Spring Cloud集成了Ribbon和Eureka,以及Spring Cloud L…...

Oracle 数据库函数的用法(一)

Oracle数据库提供了大量的内置函数,可以用于完成各种操作,如字符串操作,数学计算,日期时间处理,条件判断,序列生成,聚合统计等。以下是一些常用的Oracle数据库函数: 一、oracle 使用…...

【C2C+GRCC】Exploring Disentangled Content Information for Face Forgery Detection

文章目录 Exploring Disentangled Content Information for Face Forgery Detection背景key points研究贡献方法增强解纠缠特性的独立性实验数据内评估跨方法评估跨数据集评估消融实验总结Exploring Disentangled Content Information for Face Forgery Detection 会议/期刊:…...

springboot461学生成绩分析和弱项辅助系统设计(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装学生成绩分析和弱项辅助系统软件来发挥其高效地信息处理的作…...

Unity复刻胡闹厨房复盘 模块一 新输入系统订阅链与重绑定

本文仅作学习交流,不做任何商业用途 郑重感谢siki老师的汉化教程与代码猴的免费教程以及搬运烤肉的小伙伴 版本:Unity6 模板:3D 核心 渲染管线:URP ------------------------------…...

使用“NodeMCU”、“红外模块”实现空调控制

项目思路 空调遥控器之所以能够实现对空调的控制,是因为它能够向空调发射出特定的红外信号。从理论上来说,任何能够发射出这种相同红外信号的红外发射器,都可以充当空调遥控器(这也正是手机能够控制多种不同品牌空调的原因所在&a…...

2023年西南大学数学建模C题天气预报解题全过程文档及程序

2023年西南大学数学建模 C题 天气预报 原题再现: 天气现象与人类的生产生活、社会经济、军事活动等方方面面都密切相关,大到国家,小到个人,都受到极端天气的影响。2022年6月,全球陆地地区出现了自1850年代末人类有系…...

【大模型】使用DPO技术对大模型Qwen2.5进行微调

前言 定义 DPO(Direct Preference Optimization)即直接偏好优化算法,是一种在自然语言处理领域,特别是在训练语言模型时使用的优化策略。它的主要目的是使语言模型的输出更符合人类的偏好。 背景和原理 在传统的语言模型训练中&a…...

Maven 生命周期

文章目录 Maven 生命周期- Clean 生命周期- Build 生命周期- Site 生命周期 Maven 生命周期 Maven 有以下三个标准的生命周期: Clean 生命周期: clean:删除目标目录中的编译输出文件。这通常是在构建之前执行的,以确保项目从一个…...

网络不通该如何手动下载torch

如果遇到pip install torch2.5.0 下载不了的情况,大部分是网络的问题.可以考虑下载wheel文件在去安装 查看对应的cuda版本(举个例子:cuda为12.4,找到这个版本的 复制到服务器上下载): 有conda和pip下载的两种方式,二者选其一:如果没有安装anaconda,就直接使用pip的方式下载 如…...

基础电路的学习

1、戴维南定理 ①左边的图可简化为一个电阻+一个电压源。② ③电压源可相当于开路。将R2移到左边,R1和R2相当于并联。RR1//R2 Rx和Rt相等时,灵敏度最大,因此使Rt10K。 104电容是0.1uf。 三位数字的前两位数字为标称容量的有效数…...

对 MYSQL 架构的了解

MySQL 是一种广泛使用的关系型数据库管理系统,其架构主要包括以下几个关键部分: 一、连接层 客户端连接管理:MySQL 服务器可以同时处理多个客户端的连接请求。当客户端应用程序(如使用 Java、Python 等语言编写的程序)…...

C#中方法参数传值和传引用的情况

对于引用类型 - 传类类型的具体值时 此时传的是引用 - 单纯传类类型 此时传的是个test引用的副本,在方法内修改的是这个副本的指向 传string,集合同理,只要是指向新对象,就是引用副本在指向 对于值类型 - 传普通值类型 …...

获取显示器(主/副屏)友好名称(FriendlyName)

在开发涉及多显示器的应用程序时,获取显示器的友好名称(Friendly Name)是一个常见需求。本文将深入探讨GetMonitorFriendlyName 方法,了解其实现细节和工作原理。 方法签名 public static string GetMonitorFriendlyName(bool i…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...