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

3、C 入门:“Hello World” 程序详解

C# 入门:“Hello World” 程序详解

1. 类、对象和类型基础

在 C# 中,类型通常由类来定义,类的单个实例被称为对象。虽然 C# 中除了类还有其他类型,如枚举、结构体和委托,但这里我们主要关注类。

“Hello World” 程序声明了一个单一类型——类。要定义一个 C# 类型,需使用class关键字声明它为类,给它命名(例如Hello),然后定义其属性和行为。C# 类的属性和行为定义必须包含在花括号{}内。

2. 方法

类具有属性和行为,行为通过成员方法定义。方法(有时称为函数)是类所拥有的一组操作,成员方法定义了类能做什么或如何行为。通常,方法会有动作名称,如WriteLine()AddNumbers()。在“Hello World”程序中,类方法有一个特殊名称Main(),它不描述具体动作,但向公共语言运行时(CLR)表明这是类的主方法或第一个方法。

CLR 在程序启动时调用Main()方法,它是程序的入口点,每个 C# 程序都必须有一个Main()方法。虽然技术上 C# 中可以有多个Main()方法,但这种情况很少见,此时需使用/main命令行开关来指定哪个类的Main()方法作为程序的入口点。

方法声明是方法创建者和使用者之间的契约。方法创建者和使用者可能是同一个程序员,也可能是开发团队中的不同成员。

程序由方法相互调用组成。当一个方法调用另一个方法时,它可以向被调用方法传递值,这些值称为参数。被调用方法可以返回一个值给调用它的方法,返回的值称为返回值。

方法声明时,需指定返回值类型,后跟标识符,再跟一对括号,括号内可以为空或包含参数。例如:

int myMethod(int size)

此代码声明了一个名为myMethod()的方法,它接受一个整数参数size

参数是传递给方法的值,通常该值会在方法中被操作。传递参数有两种方式:按值传递和按引用传递。按值传递时,传递的是参数的副本,方法执行完后,调用方法中的原始值不变;按引用传递时,传递的是参数本身,方法返回后,传入的值可能会改变。

方法可以返回一个单一值,返回值类型告诉方法使用者方法执行完后将返回的数据类型。有些方法不返回值,这些方法被称为返回void,用void关键字指定。例如:

void myVoidMethod();

声明了一个不返回值且不接受参数的方法。

3. 注释

C# 程序可以包含注释,注释是给程序员的备注,不影响程序运行。C# 支持三种类型的注释:
-C++ 风格注释:以两个正斜杠//开头,表明从注释标记右侧到行尾的所有文本都被视为注释。例如:

// Use the system console object
  • C 风格注释:以/*开头,以*/结尾,允许注释跨越多行,无需在每行注释开头都加//。例如:
class Hello { static void Main() { /* Use the system console object as explained in the text */ System.Console.WriteLine("Hello World"); } }

也可以在“活动”代码中间放置 C 风格注释,但这不是一个好的做法,因为会使代码难以阅读和维护。
-XML 注释:用于将基于 XML 的外部文档与代码关联。

4. 控制台应用程序

“Hello World” 是一个控制台程序的示例。控制台应用程序通常没有图形用户界面(GUI),文本输入和输出通过标准控制台(如 PC 上的命令提示符或 DOS 窗口)处理。专注于控制台应用程序有助于简化早期示例,使我们更关注语言本身。

在这个简单示例中,Main()方法的作用是将文本 “Hello World” 写入标准输出(通常是命令提示符窗口)。标准输出由Console对象管理,Console对象有一个WriteLine()方法,它接受一个字符串并将其写入标准输出。调用方法使用点运算符.,例如调用ConsoleWriteLine()方法:

Console.WriteLine("Hello World");
5. 命名空间

Console只是 .NET 框架类库(FCL)中众多有用类型之一。FCL 包含数千个类名,如ArrayListHashtableFileDialog等。开发人员不可能记住 .NET 框架使用的所有名称,因此可能会创建与已有名称冲突的对象。

为解决这个问题,引入了命名空间。命名空间限制了名称的作用域,使其仅在定义的命名空间内有意义。例如,说 “Jim 是一名工程师”,“工程师” 这个词在英语中有多种含义,容易引起混淆。但如果指定 “他是一名科学工程师” 或 “他是一名火车工程师”,就明确了其具体含义。在 C# 中,命名空间也起到类似的作用。

假设 .NET 在System.Collections命名空间中有一个Hashtable类,而我们在ProgCSharp.DataStructures命名空间中也创建了一个Hashtable类,由于它们存在于不同的命名空间,不会产生冲突。

在代码中,使用点运算符.来指定类所属的命名空间。例如:

System.Console.WriteLine();

表明Console类属于System命名空间。

命名空间通常是分层的,例如System命名空间包含许多子命名空间,如DataConfigurationCollections等。命名空间可以帮助组织和划分类型,编写复杂的 C# 程序时,可以创建自己的命名空间层次结构,且层次深度没有限制。

6.using指令

为避免每次使用System命名空间中的类型时都写System前缀,可以在代码顶部使用using指令:

using System;

Visual Studio 2008 在每个控制台应用程序中默认包含四个using语句:SystemSystem.Collections.GenericSystem.LinqSystem.Text

需要注意的是,using指令只能用于命名空间,不能用于指定使用某个对象,例如下面的代码不会编译:

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

常见的做法是对内置命名空间和自己的公司命名空间使用using指令,但对于第三方组件可能不使用。

7. 大小写敏感性

C# 是区分大小写的,writeLineWriteLineWRITELINE是不同的。与 VB 不同,C# 开发环境不会自动修正大小写错误,如果同一单词使用不同大小写,可能会引入难以发现的错误。

一个实用技巧是将鼠标悬停在除大小写外其他都正确的名称上,然后按Ctrl - Space,IntelliSense 的自动完成功能会修正大小写。

为避免这种浪费时间和精力的错误,应制定变量、函数、常量等的命名约定。常见的做法是使用驼峰命名法(如someVariableName)命名变量,使用帕斯卡命名法(如SomeFunction)命名类、命名空间、函数、常量和属性。微软也开发了代码风格指南,可从 这里 下载。

8.static关键字

在“Hello World”程序的Main()方法声明中,返回类型void前有static关键字:

static void Main()

static关键字表明可以在不创建Hello类型对象的情况下调用Main()方法。这个概念在后续会详细讨论,目前可以将Main()方法的声明视为一种特殊用法。

9. 开发 “Hello World” 程序

有两种方式来输入、编译和运行 C# 程序:使用 Visual Studio 2008 集成开发环境(IDE),或使用文本编辑器和命令行编译器。

使用 Visual Studio 2008 IDE 有很多优势,如缩进支持、IntelliSense 单词补全、代码颜色编码以及与帮助文件集成,还包含强大的调试器和其他工具。

若使用 Visual Studio 2008 IDE 创建 “Hello World” 程序,可按以下步骤操作:
1. 从开始菜单或桌面图标选择 Visual Studio 2008。
2. 从菜单工具栏选择File ➝ New ➝ Project,打开“新建项目”窗口。
3. 在“项目类型”窗口中选择Visual C#,在“模板”窗口中选择Console Application(如果使用 Visual C# 速成版,可直接选择控制台应用程序)。
4. 输入项目名称(如HelloWorld),选择存储文件的目录,也可输入包含项目的解决方案名称,并选择是否让 Visual Studio 2008 为新解决方案创建目录。
5. 点击OK,会出现一个新窗口,可在其中输入代码。
6. Visual Studio 2008 会根据项目名称创建一个命名空间,并添加using指令。它还会创建一个名为Program的类,可对其重命名。重命名类时,最好同时重命名文件,可通过点击文件名等待片刻或右键选择Rename来操作。

以下是创建“Hello World”程序的流程图:

graph TD; A[打开 Visual Studio 2008] --> B[选择 File ➝ New ➝ Project]; B --> C[选择 Visual C# 和 Console Application]; C --> D[输入项目名称和目录等信息]; D --> E[点击 OK]; E --> F[输入代码]; F --> G[重命名类和文件];

通过以上步骤,你可以成功创建并运行一个简单的 C# “Hello World” 程序,同时了解 C# 中的类、方法、注释、命名空间等重要概念。

C# 入门:“Hello World” 程序详解

10. 方法参数传递方式对比

在前面提到方法参数有按值传递和按引用传递两种方式,下面通过具体例子来详细对比这两种方式的差异。

按值传递示例:

using System; class Program { static void ChangeValue(int num) { num = 10; Console.WriteLine("方法内部 num 的值: " + num); } static void Main() { int original = 5; Console.WriteLine("调用方法前 original 的值: " + original); ChangeValue(original); Console.WriteLine("调用方法后 original 的值: " + original); } }

在这个例子中,ChangeValue方法接受一个int类型的参数num。在Main方法中,将original的值5传递给ChangeValue方法。在ChangeValue方法内部,将num的值修改为10,但这并不会影响Main方法中original的值。因为按值传递时,传递的是参数的副本。程序运行结果如下:
| 操作 | 值 |
| ---- | ---- |
| 调用方法前 original 的值 | 5 |
| 方法内部 num 的值 | 10 |
| 调用方法后 original 的值 | 5 |

按引用传递示例:

using System; class Program { static void ChangeValue(ref int num) { num = 10; Console.WriteLine("方法内部 num 的值: " + num); } static void Main() { int original = 5; Console.WriteLine("调用方法前 original 的值: " + original); ChangeValue(ref original); Console.WriteLine("调用方法后 original 的值: " + original); } }

这里使用ref关键字实现按引用传递。在ChangeValue方法中对num的修改会直接影响Main方法中的original。程序运行结果如下:
| 操作 | 值 |
| ---- | ---- |
| 调用方法前 original 的值 | 5 |
| 方法内部 num 的值 | 10 |
| 调用方法后 original 的值 | 10 |

11. 命名空间的实际应用

命名空间在实际项目中非常重要,它可以帮助我们更好地组织代码。下面通过一个简单的示例来说明如何使用命名空间。

// 定义一个命名空间 namespace MyNamespace { public class MyClass { public void PrintMessage() { Console.WriteLine("这是 MyNamespace 中的 MyClass 类的消息。"); } } } // 另一个命名空间 namespace AnotherNamespace { public class AnotherClass { public void PrintAnotherMessage() { Console.WriteLine("这是 AnotherNamespace 中的 AnotherClass 类的消息。"); } } } class Program { static void Main() { // 使用 MyNamespace 中的类 MyNamespace.MyClass myObj = new MyNamespace.MyClass(); myObj.PrintMessage(); // 使用 AnotherNamespace 中的类 AnotherNamespace.AnotherClass anotherObj = new AnotherNamespace.AnotherClass(); anotherObj.PrintAnotherMessage(); } }

在这个示例中,我们定义了两个命名空间MyNamespaceAnotherNamespace,每个命名空间中都有一个类。在Main方法中,我们通过完整的命名空间路径来实例化并使用这些类。如果使用using指令,代码可以更简洁:

using MyNamespace; using AnotherNamespace; class Program { static void Main() { MyClass myObj = new MyClass(); myObj.PrintMessage(); AnotherClass anotherObj = new AnotherClass(); anotherObj.PrintAnotherMessage(); } }
12. 注释的最佳实践

注释虽然不影响程序的运行,但良好的注释习惯可以提高代码的可读性和可维护性。以下是一些注释的最佳实践建议:
-为复杂逻辑添加注释:当代码中存在复杂的算法或逻辑时,使用注释解释其工作原理。例如:

// 计算斐波那契数列的第 n 项 int Fibonacci(int n) { if (n <= 1) return n; return Fibonacci(n - 1) + Fibonacci(n - 2); }
  • 为公共方法和类添加文档注释:使用 XML 注释为公共方法和类提供详细的文档,方便其他开发者使用。例如:
/// <summary> /// 计算两个整数的和 /// </summary> /// <param name="a">第一个整数</param> /// <param name="b">第二个整数</param> /// <returns>两个整数的和</returns> public int Add(int a, int b) { return a + b; }
  • 避免使用无意义的注释:不要为过于简单的代码添加注释,例如:
// 将 1 赋值给 x int x = 1;

这种注释没有提供额外的价值,反而会使代码显得臃肿。

13. 总结与拓展

通过以上对 “Hello World” 程序的详细分析,我们学习了 C# 中的许多重要概念,包括类、方法、注释、命名空间、using指令、大小写敏感性和static关键字等。这些概念是进一步学习 C# 编程的基础。

在实际开发中,我们可以基于这些知识构建更复杂的应用程序。例如,可以创建更多的类和方法,使用不同的命名空间来组织代码,利用using指令简化代码编写。同时,要养成良好的代码注释和命名习惯,提高代码的质量和可维护性。

以下是一个简单的拓展示例,创建一个包含多个类和命名空间的程序:

// 定义一个工具命名空间 namespace Utility { public class MathUtils { public static int Multiply(int a, int b) { return a * b; } } } // 主命名空间 using Utility; namespace MainApp { class Program { static void Main() { int result = MathUtils.Multiply(3, 4); Console.WriteLine("3 和 4 相乘的结果是: " + result); } } }

这个示例展示了如何在不同的命名空间中定义类和方法,并在主程序中使用它们。通过不断实践和学习,我们可以逐渐掌握 C# 编程的更多技巧和方法。

以下是整个开发过程的总结流程图:

graph LR; A[学习基础概念] --> B[编写 Hello World 程序]; B --> C[了解方法和参数传递]; C --> D[掌握命名空间和 using 指令]; D --> E[养成良好注释习惯]; E --> F[拓展开发复杂应用];

希望通过本文的介绍,能帮助你更好地入门 C# 编程,开启你的编程之旅。

http://www.jsqmd.com/news/136347/

相关文章:

  • 语音风格迁移实验:用GPT-SoVITS模仿新闻播报与讲故事语气
  • 优必选拟11.6亿控股A股企业锋龙股份 刚完成31亿定增 Walker人形机器人全年拿单13亿
  • python智慧社区医院医疗 挂号服务导诊平台_087z7 功能多_pycharm django vue flask
  • python榆林特色旅游纪念品商城网站的设计与实现_8f7p0_pycharm django vue flask
  • 博迈医疗冲刺创业板:上半年营收3亿,拟募资17亿 腾讯是股东
  • 41、Git Hooks 深度解析与应用指南
  • GPT-SoVITS能否用于生成体育赛事解说语音?
  • Java SpringBoot+Vue3+MyBatis 协同过滤算法黔醉酒业白酒销售系统系统源码|前后端分离+MySQL数据库
  • vLLM-ascend 下的 PD 分离实战:从DeepSeek-V3-w8a8模型到压测,一次把坑踩完
  • 中文语音合成首选:GPT-SoVITS优化适配本地化发音习惯
  • Qwen2.5VL的token演化规律探究
  • PythoC:利用Python生成C代码的新方法
  • 昇腾平台多模态微调与推理实战,从理论到落地的完整探索
  • Proteus8.16下载安装教程:操作指南+补丁使用详解
  • 前后端分离web物流管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • ChatGPT也上线了个人年度报告!
  • 24、Windows 环境下 Drupal 开发环境搭建指南
  • 幽冥大陆(六十五) PHP6.x SSL 文字解密—东方仙盟古法结界
  • C#文件读取
  • SpringBoot+Vue web网上村委会业务办理系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • GSV5600@ACP#5600产品规格详解及产品应用分享
  • SpringBoot+Vue 协同过滤算法私人诊所管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • Go 性能分析的“新范式”:用关键路径分析破解高并发延迟谜题
  • Java Web 篮球联盟管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • vivado2023.2下载与配置实战案例:项目应用必备
  • 手把手教你调用Proteus元器件库进行AC分析
  • 如何开始你的数据科学职业之旅
  • SpringBoot+Vue Web课程设计选题管理abo平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • GPT-SoVITS语音克隆在语音社交APP中的个性化功能
  • 跨平台上位机串口通信模块开发实战记录