当前位置: 首页 > 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️⃣异常捕获 …...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...