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

C#从“Hello World!“开始

是时候一览C#的庐山真面目了。现在,让我们从"Hello World"开始吧,出发!

1. 一个简单的C#程序

先来看一段最简单的示例代码,如代码清单2-1所示。

代码清单2-1 HelloWorldClass.cs

using System;namespace ProgrammingCSharp4
{class HelloWorldClass{static void Main(){Console.WriteLine("Hello World!");}}
}

俗话说,实践是最好的老师。本文的所有代码示例都可以直接输入和运行。养成勤于动手,并对程序的运行过程和结果进行仔细观察和分析的习惯,对于学习一门编程语言是大有裨益的。言归正传,先来看看这段代码存在于哪里?没错,它位于HelloWorldClass.cs文件中,这是一个代码文件,如果是Visual Basic.NET代码则位于*.vb文件中。在Visual Studio的新建文件对话框中,可以选择新建一个空白的代码文件,或者一个空白的类文件,后者具备了基本的代码框架,类似于代码清单2-1。

提示:在ASP.NET应用中,C#代码位于*.aspx.cs文件中。虽然*.aspx中也可以通过<%......%>加入代码,但不推荐。

代码清单2-1的运行结果如图2-1所示。

接下来,我们分析一下这段代码是如何编译和运行的。

2. 编译和运行程序

.NET程序在运行前要经过两次编译:第一次编译生成CIL代码的DLL或EXE文件,第二次编译(JIT)生成机器码。有两种方式可将代码编译并生成CIL代码:

  1. 直接在Visual Studio 2010中编译和运行

  2. 通过命令行编译和运行

2.1 在Visual Studio 2010中编译和运行

在Visual Studio 2010中,编译和运行分别在两个不同的一级菜单里。其中,编译位于"生成"菜单,运行和调试位于"调试"菜单。

运行程序的方法有两种:

  1. 调试

  2. 运行而不启动调试

这两种方法的区别是,前者需要加载调试符号,允许在运行过程中中断,并单步执行,还可以对某些变量进行监控,甚至改变其代码并重新计算;后者仅仅编译并运行,无法对程序进行调试,仅适合在需要查看运行效果时使用。

在Visual Studio 2010中,可以通过三种途径来编译和运行一段程序:

  1. 菜单:展开"调试"菜单,点击"启动调试"菜单项,或者点击"开始执行(不调试)",如图2-2所示。

  2. 工具栏:点击工具栏上的相关按钮直接运行,如图2-3所示。

  3. 快捷键:按F5键启动调试运行,如果按Ctrl+F5键,运行但不调试。

提示:一般不需要特意去编译,当你修改了源代码,再次运行的时候Visual Studio也会先保存并编译,然后开始运行。

2.2 通过命令行编译和运行

首先启动Visual Studio 2010的命令提示应用程序,方法是:单击"开始",依次指向"所有程序"→"Microsoft Visual Studio 2010"→"Visual Studio Tools",最后单击"Visual Studio命令提示(2010)"。在弹出的命令行窗口中输入csc.exe/?并回车,如果显示如图2-4所示的信息,则表示环境变量已配置正确。

csc.exe的语法为csc [options] sourceFiles,其中sourceFiles表示一个或者多个C#源文件。

我们输入如下命令对代码进行编译:

D:\>csc /out:D:\HelloWorld.exe D:\ProgrammingCSharp4\Chapter3\HelloWorldClass.cs

现在已经在D盘根目录下生成了HelloWorld.exe文件。大家回顾下第这里生成的HelloWorld.exe文件是CIL代码而非本机码。

上述命令行的示意图如图2-6所示。

3. 详细介绍

接下来,我们将对代码清单2-1进行详细说明。代码虽然简单,但涉及几个重要的知识点。在后面的章节中,我们也将使用很多的示例代码进行辅助说明,这里先提前介绍一些基础知识。

第1行使用了System命名空间(Namespace)。什么是命名空间呢?如果你以前学习过Java,那么这里的命名空间就相当于Java中的"包(Package)",形象表示如图2-7所示。

可见命名空间中有一个或多个类,当然也可以包含其他类型,例如接口、结构等。这里以类和命名空间的关系为例,一个类可以不在任何命名空间中,一个命名空间也可以没有任何类,但是一旦将类声明于一个命名空间,则最多只能属于一个命名空间,而一个命名空间可以包含多个类。为什么要引入命名空间这样一个概念呢?主要起分类和限定的作用,假如有两个名叫C的类,那么编译器怎么知道我们需要使用的是哪个呢?这时命名空间的作用就显示出来了,可以将它们放置于两个不同的命名空间中:例如N7和N8,那么就可以使用N7.C和N8.C(全限定名)来对它们进行区分,如图2-8所示。

当大家了解了什么是命名空间以及它的作用后,我们就来分析一下代码清单2-1中有哪些部分与命名空间有关。

  • 第1行:using关键字的作用就是使用System命名空间,也就是告诉编译器,当碰到未知的类时到哪里去找。或者换句话说,使用了using关键字引入了System命名空间,那么当使用该空间中的Console类时,就不需要使用System.Console这样的名称,而直接使用Console即可。

  • 第3行:namespace关键字是定义一个命名空间,从第4行开始一直到第12行,大括号({})中所有的内容都位于该命名空间之中。

  • 第5行:class关键字定义了一个类。什么是类(class)?类是一种类型,它封装了一些数据和一些方法。从面向对象的观点来看,类就是一个责任和数据的综合体。代码的第5行到第11行定义了一个类,类名叫做HelloWorldClass,它只有一个静态的入口方法Main()

  • 第7行:这里定义的是一个Main方法,它是类HelloWorldClass的唯一方法成员。方法体从第8行开始,一直到第10行结束。Main方法不是一个普通的方法,它是一个类的入口,所谓入口就是说执行过程开始时,它由CLR自动调用,因此Main方法必须遵循一定的定义规则。Main()方法是执行过程的开始,当方法执行结束也就意味着执行过程结束。

  • 第9行:C#语言本身没有类库,因此它需要.NET框架提供的类库,也就是在第1章中讲的BCL。这里的Console类就是我们经常使用的控制台对象,使用该类可以将数据输出到控制台。其中,WriteLineConsole对象的静态方法,负责输出内容到控制台。Console类位于System命名空间,它的全限定名是:System.Console,这里之所以没有使用全限定名,秘密就在第一行的代码:"using System;",所以CLR会自动在System命名空间中查找Console类。

我们可以尝试删掉第1行代码,此时CLR将不知道去哪里寻找Console类,这将产生编译错误。但Visual Studio 2010的代码提示功能(IntelliSense)可以协助我们导入正确的命名空间,如果选择不导入命名空间,也可以选择使用类的全限定名——"System.Console",如图2-9所示。

提示:如果你的Visual Studio没有代码提示,请打开Visual Studio的Options选项窗口,依次定位到"Text Editor"→"C#"→"Statement completion"选项,然后选中"Auto list members"。

图2-10演示了Main方法,并给出了Main方法的4种不同形式。

如图2-9所示,Main()方法的4种形式体现在它有4种不同的签名。从是否有返回值的角度来分,A、B为一组,C、D为一组;从是否有参数的角度来分,A、C为一组,B、D为一组。如果使用C、D的形式,返回值是一种运行结果的状态提示。一般情况,返回值为0表示程序正常结束,为1则表示非正常结束。Main()方法的args参数是一个字符串数组,存储的是该应用程序执行时后面所带的参数,如图2-11所示。

如图2-11所示,此时args字符串数组有两个元素:

  1. args[0]的值为localhost

  2. args[1]的值为Message

注意Main()方法为静态方法,注意不要写作main()方法,C#语言对大小写敏感。

4. 小结

本章给大家展示了一段简单的C#程序——HelloWorld,它展现了C#的方方面面,从命名空间到类,再到类的方法,以及类的编译及运行,最后还介绍了Visual Studio 2010代码提示的一些基本使用技巧。

相关文章:

C#从“Hello World!“开始

是时候一览C#的庐山真面目了。现在&#xff0c;让我们从"Hello World"开始吧&#xff0c;出发&#xff01; 1. 一个简单的C#程序 先来看一段最简单的示例代码&#xff0c;如代码清单2-1所示。 代码清单2-1 HelloWorldClass.cs using System;namespace Programmi…...

LVS 支持 UDP 协议代理

在现代网络架构中,负载均衡技术是保证高可用性和高性能的关键组成部分。Linux Virtual Server(LVS)作为一个高效、稳定的负载均衡解决方案,广泛应用于处理 TCP 流量的场景。然而,随着实时通信、视频流和在线游戏等应用的不断发展,UDP 协议的支持成为了 LVS 负载均衡的重要…...

【C++经典例题】求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a; 期待您的关注 题目描述&#xff1a; 原题链接&#xff1a; 求123...n_牛客题霸_牛客网 (nowcoder.com) 解题思路&#xff1a; …...

Rabbitmq 具体怎么做到削峰的,是丢弃部分消费吗,有的实际场景是不允许丢弃

在高并发场景中&#xff0c;RabbitMQ 可以通过几种策略来实现 削峰&#xff08;缓解瞬时负载激增&#xff09;&#xff0c;而这些策略并不一定需要丢弃消息。在一些业务场景下&#xff0c;丢弃消息显然是不允许的&#xff0c;因此在这种情况下&#xff0c;可以使用以下方法来确…...

Linux渗透实战之Nullbyte靶场提权

0x1 前言 一、浅谈 哈喽师傅们&#xff0c;这次又到了给师傅们分享文章的时候了&#xff0c;这篇文章呢主要是给师傅们以vulnhub中的Nullbyte靶场来给师傅们演示下通过Hydra表单暴力破解等操作拿到账户密码&#xff0c;然后中间以四种sql注入的方式给大家非常详细的操作了sql…...

(STM32笔记)十二、DMA的基础知识与用法 第三部分

我用的是正点的STM32F103来进行学习&#xff0c;板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话&#xff0c;用的也是这个板子和教程。 DMA的基础知识与用法 三、DMA程序验证1、DMA 存储器到存储器模式实验&#xff08;1&#xff09;DMA结构体解释&#xff08;2…...

品牌账号矩阵如何打造?来抄作业

在讲究全域营销的当下&#xff0c;目前企业都在各自搭建品牌矩阵号&#xff0c;以提升自己在不同渠道上的影响力。虽然不同平台之间有诸多细节值得深究&#xff0c;但也不妨碍我们先了解如何搭建品牌矩阵。接下来&#xff0c;就让我们一同来了解下该如何搭建。 一、一个主账号 …...

基于vue的商城小程序的毕业设计与实现(源码及报告)

环境搭建 ☞☞☞ ​​​Vue入手篇(一)&#xff0c;防踩雷(全网最详细教程)_vue force-CSDN博客 目录 一、功能介绍 二、登录注册功能 三、首页 四、项目截图 五、源码获取 一、功能介绍 用户信息展示&#xff1a;页面顶部设有用户头像和昵称展示区&#xff0c;方便用户识别…...

NineData云原生智能数据管理平台新功能发布|2024年12月版

本月发布 7 项更新&#xff0c;其中重点发布 2 项、功能优化 5 项。 重点发布 数据库 Devops - Oracle 非表对象支持可视化创建与管理 Oracle 非表对象&#xff0c;包括视图&#xff08;View&#xff09;、包&#xff08;Package&#xff09;、存储过程&#xff08;Procedur…...

【Vue.js 组件化】高效组件管理与自动化实践指南

文章目录 摘要引言组件命名规范与组织结构命名规范目录组织 依赖管理工具自动化组件文档生成构建自动引入和文档生成的组件化体系代码结构自动引入组件配置使用 Storybook 展示组件文档自动生成 代码详解QA 环节总结参考资料 摘要 在现代前端开发中&#xff0c;组件化管理是 V…...

Clojure语言的并发编程

Clojure语言的并发编程 引言 在现代软件开发中&#xff0c;并发编程成为了处理多个任务、提高应用效率和响应速度的重要手段。尤其是在多核处理器逐渐成为主流的今天&#xff0c;如何高效利用这些计算资源是每个开发者面临的挑战。Clojure作为一种函数式编程语言&#xff0c;…...

RabbitMQ-SpringAMQP使用介绍

RabbitMQ 1. Spring AMQP1.1 引入依赖1.2 消息发送1.3 消息接收1.4 WorkQueue模型1.4.1 实例代码1.4.2 能者多劳1.4.3 总结 1.5交换机1.6 Fanout交换机&#xff08;广播&#xff09;1.7 Direct交换机&#xff08;订阅&#xff09;1.8 Topic交换机&#xff08;通配符订阅&#x…...

ASP.NET Core 中服务生命周期详解:Scoped、Transient 和 Singleton 的业务场景分析

前言 在 ASP.NET Core 中&#xff0c;服务的生命周期直接影响应用的性能和行为。通过依赖注入容器 (Dependency Injection, DI)&#xff0c;我们可以为服务定义其生命周期&#xff1a;Scoped、Transient 和 Singleton。本文将详细阐述这些生命周期的区别及其在实际业务中的应用…...

c语言----------小知识

1 system函数的使用 #include <stdlib.h> int system(const char *command); 功能&#xff1a;在已经运行的程序中执行另外一个外部程序 参数&#xff1a;外部可执行程序名字 返回值&#xff1a; 成功&#xff1a;0 失败&#xff1a;任意数字示例代码&#xff1a; #inc…...

React Context用法总结

1. 基本概念 1.1 什么是 Context Context 提供了一种在组件树中共享数据的方式&#xff0c;而不必通过 props 显式地逐层传递。它主要用于共享那些对于组件树中许多组件来说是"全局"的数据。 1.2 基本用法 // 1. 创建 Context const ThemeContext React.createC…...

[笔记] 使用 Jenkins 实现 CI/CD :从 GitLab 拉取 Java 项目并部署至 Windows Server

随着软件开发节奏的加快&#xff0c;持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;已经成为确保软件质量和加速产品发布的不可或缺的部分。Jenkins作为一款广泛使用的开源自动化服务器&#xff0c;为开发者提供了一个强大的平台来实施这些实践。然而…...

腾讯云AI代码助手编程挑战赛-如意

作品简介 《如意》是一款结合腾讯云AI代码助手生成的、集智能问答、知识学习和生活助手功能于一体的应用&#xff0c;在通过先进的AI技术提升用户的工作效率、学习效果和生活质量。无论是解答疑难问题、提供专业建议&#xff0c;还是帮助规划日程、提升技能&#xff0c;它都能…...

TAS测评倍智题库 | 益丰大药房2025年中高层测评BA商业推理测评真题考什么?

您好&#xff01;您已被邀请参加360评估。您的评估与反馈将有助于被评估人更深入地了解个人情况&#xff0c;发现个人优势和潜在风险。请您秉持公正、开放的心态进行评估。请尽快完成评估&#xff0c;在此衷心感谢您的配合与支持&#xff01; ​ 相关事宜&#xff1a; 请您在…...

2025 First LOOK! CnosDB 新版本 2.4.3.1 发布

&#x1f539; 版本号&#xff1a;2.4.3.1 &#x1f539; 发布日期&#xff1a;2024年11月05日 功能优化 简化编解码器错误定义 #2368 删除不必要的const DEFAULT_* #2378 添加 wal 压缩检查 #2377 移除 page reader #2380 创建配额 #2367 减少内存复制和计算 #2384 构…...

PyMysql 01|(包含超详细项目实战)连接数据库、增删改查、异常捕获

目录 一、数据库操作应用场景 二、安装PyMysql 三、事务的概念 四、数据库的准备 五、PyMysql连接数据库 1、建立连接方法 2、入门案例 六、PyMysql操作数据库 1、数据库查询 1️⃣查询操作流程 2️⃣cursor游标 ​3️⃣查询常用方法 4️⃣案例 5️⃣异常捕获 …...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...