- C# 基础教程
- C# - 主页
- C# - 概述
- C# - 环境
- C# - 程序结构
- C# - 基本语法
- C# - 数据类型
- C# - 类型转换
- C# - 变量
- C# - 常量
- C# - 运算符
- C# - 决策
- C# - 循环
- C# - 封装
- C# - 方法
- C# - 可空值
- C# - 数组
- C# - 字符串
- C# - 结构
- C# - 枚举
- C# - 类
- C# - 继承
- C# - 多态性
- C# - 运算符重载
- C# - 接口
- C# - 命名空间
- C# - 预处理器指令
- C# - 正则表达式
- C# - 异常处理
- C# - 文件 I/O
- C# 高级教程
- C# - 属性
- C# - 反射
- C# - 属性
- C# - 索引器
- C# - 委托
- C# - 事件
- C# - 集合
- C# - 泛型
- C# - 匿名方法
- C# - 不安全代码
- C# - 多线程
- C# 有用资源
- C# - 问题与解答
- C# - 快速指南
- C# - 有用的资源
- C# - 讨论
C# - 快速指南
C# - 概述
C# 是一种现代、通用、面向对象的编程语言,由 Microsoft 开发,并得到欧洲计算机制造商协会 (ECMA) 和国际标准组织 (ISO) 的批准。
C# 是由 Anders Hejlsberg 和他的团队在 .Net Framework 开发期间开发的。
C# 是为公共语言基础设施 (CLI) 设计的,它由可执行代码和运行时环境组成,允许在不同的计算机平台和体系结构上使用各种高级语言。
以下原因使 C# 成为广泛使用的专业语言 -
- 它是一种现代的通用编程语言
- 它是面向对象的。
- 它是面向组件的。
- 这很容易学习。
- 它是一种结构化语言。
- 它产生高效的程序。
- 它可以在多种计算机平台上编译。
- 它是.Net Framework 的一部分。
C# 强大的编程特性
尽管 C# 结构紧密遵循传统高级语言,但 C 和 C++ 是一种面向对象的编程语言。它与 Java 非常相似,具有许多强大的编程功能,使其受到全球许多程序员的喜爱。
以下是 C# 的一些重要功能的列表 -
- 布尔条件
- 自动垃圾收集
- 标准库
- 程序集版本控制
- 属性和事件
- 代表和活动管理
- 易于使用的泛型
- 索引器
- 条件编译
- 简单的多线程
- LINQ 和 Lambda 表达式
- 与 Windows 集成
C# - 环境
在线尝试选项
我们已经在线搭建了C#编程环境,以便您可以在线编译和执行所有可用的示例。它使您对所阅读的内容充满信心,并使您能够使用不同的选项验证程序。请随意修改任何示例并在线执行。
使用CodingGround上提供的在线编译器尝试以下示例
using System; namespace HelloWorldApplication { class HelloWorld { static void Main(string[] args) { /* my first program in C# */ Console.WriteLine("Hello World"); Console.ReadKey(); } } }对于本教程中给出的大多数示例,您将在我们网站右上角的代码部分中找到“试用”选项,该选项将带您进入在线编译器。因此,请充分利用它并享受学习的乐趣。
在本章中,我们将讨论创建 C# 编程所需的工具。我们已经提到,C# 是 .Net 框架的一部分,用于编写 .Net 应用程序。因此,在讨论运行 C# 程序的可用工具之前,让我们先了解一下 C# 与 .Net 框架的关系。
.Net框架
.Net 框架是一个革命性的平台,可以帮助您编写以下类型的应用程序 -
- Windows应用程序
- 网络应用程序
- 网页服务
.Net框架应用程序是多平台应用程序。该框架的设计方式使其可以从以下任何语言中使用:C#、C++、Visual Basic、Jscript、COBOL 等。所有这些语言都可以访问该框架并相互通信。
.Net 框架由 C# 等客户端语言使用的庞大代码库组成。以下是 .Net 框架的一些组件 -
- 公共语言运行时 (CLR)
- .Net Framework 类库
- 通用语言规范
- 通用类型系统
- 元数据和程序集
- Windows 窗体
- ASP.Net 和 ASP.Net AJAX
- ADO网络
- Windows 工作流基础 (WF)
- Windows 演示基础
- Windows 通信基础 (WCF)
- LINQ
有关每个组件执行的作业,请参阅ASP.Net - 简介,有关每个组件的详细信息,请参阅 Microsoft 的文档。
C# 集成开发环境 (IDE)
Microsoft 为 C# 编程提供以下开发工具 -
- Visual Studio 2010(VS)
- Visual C# 2010 Express (VCE)
- 可视化网络开发人员
最后两个可以从微软官方网站免费获得。使用这些工具,您可以编写各种 C# 程序,从简单的命令行应用程序到更复杂的应用程序。您还可以使用基本文本编辑器(如记事本)编写 C# 源代码文件,并使用命令行编译器将代码编译成程序集,命令行编译器也是 .NET Framework 的一部分。
Visual C# Express 和 Visual Web Developer Express 版本是 Visual Studio 的精简版本,具有相同的外观。它们保留了 Visual Studio 的大部分功能。在本教程中,我们使用了 Visual C# 2010 Express。
您可以从Microsoft Visual Studio下载它。它会自动安装在您的计算机上。
注意:您需要有效的互联网连接才能安装 Express 版本。
在 Linux 或 Mac OS 上编写 C# 程序
尽管 .NET Framework 在 Windows 操作系统上运行,但还有一些可在其他操作系统上运行的替代版本。Mono是 .NET Framework 的开源版本,其中包含 C# 编译器并可在多种操作系统上运行,包括各种版本的 Linux 和 Mac OS。请检查Go Mono。
Mono 宣称的目的不仅是能够跨平台运行 Microsoft .NET 应用程序,而且还为 Linux 开发人员带来更好的开发工具。Mono 可以在许多操作系统上运行,包括 Android、BSD、iOS、Linux、OS X、Windows、Solaris 和 UNIX。
C# - 程序结构
在我们学习 C# 编程语言的基本构建块之前,让我们看一下最基本的 C# 程序结构,以便我们可以将其作为后续章节的参考。
创建 Hello World 程序
AC# 程序由以下部分组成 -
- 命名空间声明
- 一类
- 类方法
- 类属性
- 主要方法
- 陈述和表达式
- 评论
让我们看一个打印“Hello World”字样的简单代码 -
using System; namespace HelloWorldApplication { class HelloWorld { static void Main(string[] args) { /* my first program in C# */ Console.WriteLine("Hello World"); Console.ReadKey(); } } }
当这段代码被编译并执行时,它会产生以下结果 -
Hello World
让我们看看给定程序的各个部分 -
程序第一行使用System;- using关键字用于在程序中包含系统命名空间。一个程序通常有多个using语句。
下一行有名称空间声明。命名空间是类的集合。HelloWorldApplication命名空间包含类HelloWorld。
下一行有一个类声明,类HelloWorld包含程序使用的数据和方法定义。类通常包含多个方法。方法定义类的Behave。但是,HelloWorld类只有一个方法Main。
下一行定义Main方法,它是所有 C# 程序的入口点。Main方法说明了该类在执行时执行的操作。
下一行 /*...*/ 会被编译器忽略,并在程序中添加注释。
Main 方法使用Console.WriteLine("Hello World"); 语句指定其Behave。
WriteLine是System命名空间中定义的Console类的方法。该语句产生消息“Hello, World!” 要显示在屏幕上。
最后一行Console.ReadKey(); 适用于 VS.NET 用户。这使得程序等待按键,并且当从 Visual Studio .NET 启动程序时,它会阻止屏幕快速运行和关闭。
值得注意的是以下几点 -
- C# 区分大小写。
- 所有语句和表达式都必须以分号 (;) 结尾。
- 程序的执行从Main方法开始。
- 与 Java 不同,程序文件名可以与类名不同。
编译并执行程序
如果您使用 Visual Studio.Net 编译和执行 C# 程序,请执行以下步骤 -
启动 Visual Studio。
在菜单栏上,选择“文件”->“新建”->“项目”。
从模板中选择 Visual C#,然后选择 Windows。
选择控制台应用程序。
为您的项目指定一个名称,然后单击“确定”按钮。
这将在解决方案资源管理器中创建一个新项目。
在代码编辑器中编写代码。
单击“运行”按钮或按 F5 键来执行该项目。将出现一个命令提示符窗口,其中包含“Hello World”行。
您可以使用命令行而不是 Visual Studio IDE 来编译 C# 程序 -
打开文本编辑器并添加上述代码。
将文件另存为helloworld.cs
打开命令提示符工具并转到保存文件的目录。
输入csc helloworld.cs并按 Enter 编译您的代码。
如果代码中没有错误,命令提示符会将您带到下一行并生成helloworld.exe可执行文件。
输入helloworld来执行您的程序。
您可以在屏幕上看到输出 Hello World。
C# - 基本语法
C# 是一种面向对象的编程语言。在面向对象的编程方法中,程序由通过动作相互交互的各种对象组成。对象可能采取的操作称为方法。同类对象被称为具有相同类型,或者被称为属于同一类。
例如,让我们考虑一个 Rectangle 对象。它具有长度和宽度等属性。根据设计,可能需要接受这些属性的值、计算面积和显示细节的方法。
让我们看看 Rectangle 类的实现并讨论 C# 基本语法 -
using System; namespace RectangleApplication { class Rectangle { // member variables double length; double width; public void Acceptdetails() { length = 4.5; width = 3.5; } public double GetArea() { return length * width; } public void Display() { Console.WriteLine("Length: {0}", length); Console.WriteLine("Width: {0}", width); Console.WriteLine("Area: {0}", GetArea()); } } class ExecuteRectangle { static void Main(string[] args) { Rectangle r = new Rectangle(); r.Acceptdetails(); r.Display(); Console.ReadLine(); } } }
当上面的代码被编译并执行时,它会产生以下结果 -
Length: 4.5 Width: 3.5 Area: 15.75
使用关键字_
任何 C# 程序中的第一条语句都是
using System;
using关键字用于在程序中包含名称空间。一个程序可以包含多个using 语句。
类关键字_
class关键字用于声明类。
C# 中的注释
注释用于解释代码。编译器会忽略注释条目。C# 程序中的多行注释以 /* 开头,以字符 */ 结尾,如下所示 -
/* This program demonstrates The basic syntax of C# programming Language */
单行注释由“//”符号表示。例如,
}//end class Rectangle
成员变量
变量是类的属性或数据成员,用于存储数据。在前面的程序中,Rectangle类有两个名为length和width的成员变量。
会员功能
函数是执行特定任务的语句集。类的成员函数是在类内部声明的。我们的示例类 Rectangle 包含三个成员函数:AcceptDetails、GetArea和Display。
实例化一个类
在前面的程序中,类ExecuteRectangle包含Main() 方法并实例化Rectangle类。
身份标识
标识符是用于标识类、变量、函数或任何其他用户定义项的名称。C# 中类命名的基本规则如下 -
名称必须以字母开头,后跟一系列字母、数字 (0 - 9) 或下划线。标识符中的第一个字符不能是数字。
它不得包含任何嵌入的空格或符号,例如?- + ! @#%^&*()[]{}。; : " ' / 和 \。但是,可以使用下划线 (_)。
它不应该是 C# 关键字。
C# 关键字
关键字是为 C# 编译器预定义的保留字。这些关键字不能用作标识符。但是,如果您想使用这些关键字作为标识符,则可以在关键字前添加 @ 字符。
在 C# 中,某些标识符在代码上下文中具有特殊含义,例如 get 和 set 称为上下文关键字。
下表列出了 C# 中的保留关键字和上下文关键字 -
保留关键字 | ||||||
---|---|---|---|---|---|---|
抽象的 | 作为 | 根据 | 布尔值 | 休息 | 字节 | 案件 |
抓住 | 字符 | 检查过 | 班级 | 常量 | 继续 | 小数 |
默认 | 代表 | 做 | 双倍的 | 别的 | 枚举 | 事件 |
明确的 | 外部的 | 错误的 | 最后 | 固定的 | 漂浮 | 为了 |
foreach | 去 | 如果 | 隐含的 | 在 | 在(通用修饰符) | 整数 |
界面 | 内部的 | 是 | 锁 | 长的 | 名称空间 | 新的 |
无效的 | 目的 | 操作员 | 出去 | out(通用修饰符) | 覆盖 | 参数 |
私人的 | 受保护的 | 民众 | 只读 | 参考 | 返回 | 斯字节 |
密封 | 短的 | 大小 | 堆栈分配 | 静止的 | 细绳 | 结构体 |
转变 | 这 | 扔 | 真的 | 尝试 | 类型 | 单位 |
乌龙 | 未经检查的 | 不安全 | 超短 | 使用 | 虚拟的 | 空白 |
易挥发的 | 尽管 | |||||
上下文关键词 | ||||||
添加 | 别名 | 上升 | 下降 | 动态的 | 从 | 得到 |
全球的 | 团体 | 进入 | 加入 | 让 | 订单比 | 部分(类型) |
部分 (方法) |
消除 | 选择 | 放 |
C# - 数据类型
C# 中的变量分为以下类型 -
- 值类型
- 参考类型
- 指针类型
值类型
值类型变量可以直接赋值。它们派生自System.ValueType类。
值类型直接包含数据。一些示例是int、char 和 float,它们分别存储数字、字母和浮点数。当您声明int类型时,系统会分配内存来存储该值。
下表列出了 C# 2010 中可用的值类型 -
类型 | 代表 | 范围 | 默认值 |
---|---|---|---|
布尔值 | 布尔值 | 对或错 | 错误的 |
字节 | 8 位无符号整数 | 0 至 255 | 0 |
字符 | 16 位 Unicode 字符 | U +0000 至 U +ffff | '\0' |
小数 | 128 位精确十进制值,有效数字 28-29 位 | (-7.9 x 10 28至 7.9 x 10 28 ) / 10 0至 28 | 0.0M |
双倍的 | 64位双精度浮点类型 | (+/-)5.0 x 10 -324至 (+/-)1.7 x 10 308 | 0.0D |
漂浮 | 32位单精度浮点型 | -3.4 x 10 38至 + 3.4 x 10 38 | 0.0F |
整数 | 32 位有符号整数类型 | -2,147,483,648 至 2,147,483,647 | 0 |
长的 | 64 位有符号整数类型 | -9,223,372,036,854,775,808 至 9,223,372,036,854,775,807 | 0升 |
斯字节 | 8 位有符号整数类型 | -128 至 127 | 0 |
短的 | 16 位有符号整数类型 | -32,768 至 32,767 | 0 |
单位 | 32 位无符号整数类型 | 0 至 4,294,967,295 | 0 |
乌龙 | 64 位无符号整数类型 | 0 至 18,446,744,073,709,551,615 | 0 |
超短 | 16 位无符号整数类型 | 0 至 65,535 | 0 |
要获取特定平台上类型或变量的确切大小,可以使用sizeof方法。表达式sizeof(type)生成对象或类型的存储大小(以字节为单位)。以下是在任何机器上获取int类型大小的示例-
using System; namespace DataTypeApplication { class Program { static void Main(string[] args) { Console.WriteLine("Size of int: {0}", sizeof(int)); Console.ReadLine(); } } }
当上面的代码被编译并执行时,它会产生以下结果 -
Size of int: 4
参考类型
引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。
换句话说,它们指的是内存位置。使用多个变量,引用类型可以引用内存位置。如果内存位置中的数据被其中一个变量更改,则另一个变量会自动反映这一值的变化。内置引用类型的示例有:object、dynamic和string。
对象类型
对象类型是 C# 通用类型系统 (CTS) 中所有数据类型的最终基类。Object 是 System.Object 类的别名。可以为对象类型分配任何其他类型、值类型、引用类型、预定义或用户定义类型的值。但在赋值之前,需要进行类型转换。
当值类型转换为对象类型时,称为装箱;另一方面,当对象类型转换为值类型时,称为拆箱。
object obj; obj = 100; // this is boxing
动态型
您可以在动态数据类型变量中存储任何类型的值。对这些类型变量的类型检查在运行时进行。
声明动态类型的语法是 -
dynamic <variable_name> = value;
例如,
dynamic d = 20;
动态类型与对象类型类似,只是对象类型变量的类型检查发生在编译时,而动态类型变量的类型检查发生在运行时。
字符串类型
字符串类型允许您将任何字符串值分配给变量。字符串类型是 System.String 类的别名。它源自对象类型。字符串类型的值可以使用两种形式的字符串文字进行赋值:quoted 和 @quoted。
例如,
String str = "Tutorials Point";
@quoted 字符串文字如下所示 -
@"Tutorials Point";
用户定义的引用类型是:类、接口或委托。我们将在后面的章节中讨论这些类型。
指针类型
指针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针具有相同的功能。
声明指针类型的语法是 -
type* identifier;
例如,
char* cptr; int* iptr;
我们将在“不安全代码”一章中讨论指针类型。
C# - 类型转换
类型转换是将一种类型的数据转换为另一种类型的数据。它也称为类型转换。在 C# 中,类型转换有两种形式 -
隐式类型转换- 这些转换由 C# 以类型安全的方式执行。例如,从较小的整数类型到较大的整数类型的转换以及从派生类到基类的转换。
显式类型转换- 这些转换是由用户使用预定义函数显式完成的。显式转换需要强制转换运算符。
以下示例显示了显式类型转换 -
using System; namespace TypeConversionApplication { class ExplicitConversion { static void Main(string[] args) { double d = 5673.74; int i; // cast double to int. i = (int)d; Console.WriteLine(i); Console.ReadKey(); } } }
当上面的代码被编译并执行时,它会产生以下结果 -
5673
C# 类型转换方法
C# 提供以下内置类型转换方法 -
先生。 | 方法与说明 |
---|---|
1 | 转换为布尔值 如果可能,将类型转换为布尔值。 |
2 | 东字节 将类型转换为字节。 |
3 | 托查尔 如果可能,将类型转换为单个 Unicode 字符。 |
4 | 至今时间 将类型(整数或字符串类型)转换为日期时间结构。 |
5 | 转十进制 将浮点或整数类型转换为小数类型。 |
6 | 至双倍 将类型转换为双精度类型。 |
7 | 转为Int16 将类型转换为 16 位整数。 |
8 | 转为Int32 将类型转换为 32 位整数。 |
9 | 转为Int64 将类型转换为 64 位整数。 |
10 | 至Sbyte 将类型转换为有符号字节类型。 |
11 | 至单身人士 将类型转换为小浮点数。 |
12 | 转字符串 将类型转换为字符串。 |
13 | 输入 将类型转换为指定类型。 |
14 | ToUInt16 将类型转换为 unsigned int 类型。 |
15 | ToUInt32 将类型转换为无符号长类型。 |
16 | 至 Int64 将类型转换为无符号大整数。 |
以下示例将各种值类型转换为字符串类型 -
using System; namespace TypeConversionApplication { class StringConversion { static void Main(string[] args) { int i = 75; float f = 53.005f; double d = 2345.7652; bool b = true; Console.WriteLine(i.ToString()); Console.WriteLine(f.ToString()); Console.WriteLine(d.ToString()); Console.WriteLine(b.ToString()); Console.ReadKey(); } } }
当上面的代码被编译并执行时,它会产生以下结果 -
75 53.005 2345.7652 True
C# - 变量
变量只不过是我们的程序可以操作的存储区域的名称。C# 中的每个变量都有一个特定的类型,它决定变量内存的大小和布局、可以存储在该内存中的值的范围以及可以应用于变量的操作集。
C# 中提供的基本值类型可分为:
类型 | 例子 |
---|---|
整体型 | sbyte、byte、short、ushort、int、uint、long、ulong 和 char |
浮点类型 | 浮动和双精度 |
小数类型 | 小数 |
布尔类型 | true 或 false 值,如指定的那样 |
可空类型 | 可空数据类型 |
C# 还允许定义其他值类型的变量(例如enum)和变量的引用类型(例如class),我们将在后续章节中介绍。
定义变量
C# 中变量定义的语法是 -
<data_type> <variable_list>;
这里,data_type 必须是有效的 C# 数据类型,包括 char、int、float、double 或任何用户定义的数据类型,variable_list 可以由一个或多个以逗号分隔的标识符名称组成。
这里显示了一些有效的变量定义 -
int i, j, k; char c, ch; float f, salary; double d;
您可以在定义时将变量初始化为 -
int i = 100;
初始化变量
变量通过等号后跟常量表达式来初始化(分配值)。初始化的一般形式是 -
variable_name = value;
变量可以在其声明中初始化。初始化器由一个等号后跟一个常量表达式组成,如下所示:
<data_type> <variable_name> = value;
一些例子是 -
int d = 3, f = 5; /* initializing d and f. */ byte z = 22; /* initializes z. */ double pi = 3.14159; /* declares an approximation of pi. */ char x = 'x'; /* the variable x has the value 'x'. */
正确初始化变量是一个很好的编程习惯,否则有时程序可能会产生意外的结果。
以下示例使用各种类型的变量 -
using System; namespace VariableDefinition { class Program { static void Main(string[] args) { short a; int b ; double c; /* actual initialization */ a = 10; b = 20; c = a + b; Console.WriteLine("a = {0}, b = {1}, c = {2}", a, b, c); Console.ReadLine(); } } }
当上面的代码被编译并执行时,它会产生以下结果 -
a = 10, b = 20, c = 30
接受用户的值
System命名空间中的Console类提供了一个函数ReadLine(),用于接受用户的输入并将其存储到变量中。
例如,
int num; num = Convert.ToInt32(Console.ReadLine());
函数Convert.ToInt32()将用户输入的数据转换为 int 数据类型,因为Console.ReadLine()接受字符串格式的数据。
C# 中的左值和右值表达式
C# 中有两种表达式 -
左值- 作为左值的表达式可以显示为赋值的左侧或右侧。
右值- 作为右值的表达式可以出现在赋值的右侧,但不能出现在左侧。
变量是左值,因此它们可能出现在赋值的左侧。数字文字是右值,因此它们可能不会被赋值并且不能出现在左侧。以下是有效的 C# 语句 -
int g = 20;
但以下不是有效的语句,会生成编译时错误 -
10 = 20;
C# - 常量和文字
常量是指程序在执行过程中不得更改的固定值。这些固定值也称为文字。常量可以是任何基本数据类型,例如整型常量、浮点常量、字符常量或字符串文字。还有枚举常量。
常量的处理方式与常规变量一样,只是它们的值在定义后不能修改。
整数文字
整数文字可以是十进制或十六进制常量。前缀指定基数或基数:十六进制为 0x 或 0X,十进制没有前缀 id。
整数文字还可以具有 U 和 L 的组合后缀,分别表示无符号和长整型。后缀可以是大写或小写,并且可以是任何顺序。
以下是整数文字的一些示例 -
212 /* Legal */ 215u /* Legal */ 0xFeeL /* Legal */
以下是各种类型整数文字的其他示例 -
85 /* decimal */ 0x4b /* hexadecimal */ 30 /* int */ 30u /* unsigned int */ 30l /* long */ 30ul /* unsigned long */
浮点文字
浮点文字具有整数部分、小数点、小数部分和指数部分。您可以用十进制形式或指数形式表示浮点文字。
以下是浮点文字的一些示例 -
3.14159 /* Legal */ 314159E-5F /* Legal */ 510E /* Illegal: incomplete exponent */ 210f /* Illegal: no decimal or exponent */ .e55 /* Illegal: missing integer or fraction */
以小数形式表示时,必须包含小数点、指数或两者;当使用指数形式表示时,必须包含整数部分、小数部分或两者。带符号指数由 e 或 E 引入。
字符常量
字符文字用单引号括起来。例如,“x”可以存储在 char 类型的简单变量中。字符文字可以是普通字符(例如“x”)、转义序列(例如“\t”)或通用字符(例如“\u02C0”)。
C# 中的某些字符前面有反斜杠。它们具有特殊含义,用于表示换行符 (\n) 或制表符 (\t)。这里是一些此类转义序列代码的列表 -
转义序列 | 意义 |
---|---|
\\ | \ 特点 |
\' | ' 特点 |
\" | “ 特点 |
\? | ?特点 |
\A | 警报或铃声 |
\b | 退格键 |
\F | 换页 |
\n | 新队 |
\r | 回车符 |
\t | 水平制表符 |
\v | 垂直标签 |
\xhh 。。。 | 一位或多位数字的十六进制数 |
以下是显示一些转义序列字符的示例 -
using System; namespace EscapeChar { class Program { static void Main(string[] args) { Console.WriteLine("Hello\tWorld\n\n"); Console.ReadLine(); } } }
当上面的代码被编译并执行时,它会产生以下结果 -
Hello World
字符串文字
字符串文字或常量用双引号“”或@“”括起来。字符串包含与字符文字类似的字符:普通字符、转义序列和通用字符。
您可以使用字符串文字将长行分成多行,并使用空格分隔各部分。
以下是字符串文字的一些示例。所有三种形式都是相同的字符串。
"hello, dear" "hello, \ dear" "hello, " "d" "ear" @"hello dear"
定义常量
常量是使用const关键字定义的。定义常量的语法是 -
const <data_type> <constant_name> = value;
以下程序演示了在程序中定义和使用常量 -
using System; namespace DeclaringConstants { class Program { static void Main(string[] args) { const double pi = 3.14159; // constant declaration double r; Console.WriteLine("Enter Radius: "); r = Convert.ToDouble(Console.ReadLine()); double areaCircle = pi * r * r; Console.WriteLine("Radius: {0}, Area: {1}", r, areaCircle); Console.ReadLine(); } } }
当上面的代码被编译并执行时,它会产生以下结果 -
Enter Radius: 3 Radius: 3, Area: 28.27431
C# - 运算符
运算符是告诉编译器执行特定数学或逻辑操作的符号。C# 拥有丰富的内置运算符,并提供以下类型的运算符 -
- 算术运算符
- 关系运算符
- 逻辑运算符
- 按位运算符
- 赋值运算符
- 杂项运算符
本教程一一讲解算术、关系、逻辑、位、赋值等运算符。
算术运算符
下表显示了 C# 支持的所有算术运算符。假设变量A为 10,变量B为 20,则 -
操作员 | 描述 | 例子 |
---|---|---|
+ | 添加两个操作数 | A + B = 30 |
- | 从第一个操作数中减去第二个操作数 | A - B = -10 |
* | 将两个操作数相乘 | A * B = 200 |
/ | 分子除以分子 | 乙/甲=2 |
% | 模数运算符和整数除法后的余数 | B % A = 0 |
++ | 自增运算符将整数值加一 | A++ = 11 |
-- | 自减运算符将整数值减一 | A-- = 9 |
关系运算符
下表显示了 C# 支持的所有关系运算符。假设变量A为 10,变量B为 20,则 -
操作员 | 描述 | 例子 |
---|---|---|
== | 检查两个操作数的值是否相等,如果相等则条件为真。 | (A == B) 不正确。 |
!= | 检查两个操作数的值是否相等,如果值不相等则条件成立。 | (A != B) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是,则条件为真。 | (A > B) 不正确。 |
< | 检查左操作数的值是否小于右操作数的值,如果是,则条件为真。 | (A < B) 为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是,则条件为真。 | (A >= B) 不正确。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是,则条件为真。 | (A <= B) 为真。 |
逻辑运算符
下表显示了 C# 支持的所有逻辑运算符。假设变量A持有布尔值 true,变量B持有布尔值 false,则 -
操作员 | 描述 | 例子 |
---|---|---|
&& | 称为逻辑与运算符。如果两个操作数都不为零,则条件为真。 | (A && B) 是错误的。 |
|| | 称为逻辑或运算符。如果两个操作数中的任何一个不为零,则条件为真。 | (A || B) 为真。 |
! | 称为逻辑非运算符。用于反转其操作数的逻辑状态。如果条件为真,则逻辑 NOT 运算符将为假。 | !(A && B) 为真。 |
按位运算符
位运算符作用于位并执行逐位运算。&、| 和 ^ 的真值表如下 -
p | q | 质与问 | p| q | p^q |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
假设A = 60;B=13;那么在二进制格式中它们如下 -
A = 0011 1100
B = 0000 1101
-------------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
〜A = 1100 0011
下表列出了 C# 支持的按位运算符。假设变量 A 为 60,变量 B 为 13,则 -
操作员 | 描述 | 例子 |
---|---|---|
& | 如果两个操作数中都存在,则二进制 AND 运算符会将一位复制到结果中。 | (A & B) = 12,即 0000 1100 |
| | 如果任一操作数中存在该位,则二元或运算符会复制该位。 | (A | B) = 61,即 0011 1101 |
^ | 如果在一个操作数中设置了该位,但不是在两个操作数中都设置了该位,则二进制 XOR 运算符会复制该位。 | (A^B)=49,即0011 0001 |
〜 | 二进制补码运算符是一元的,具有“翻转”位的效果。 | (~A ) = -61,由于有符号二进制数,其 2 的补码为 1100 0011。 |
<< | 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 | A << 2 = 240,即 1111 0000 |
>> | 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 | A >> 2 = 15,即 0000 1111 |
赋值运算符
C# 支持以下赋值运算符 -
操作员 | 描述 | 例子 |
---|---|---|
= | 简单赋值运算符,将右侧操作数的值分配给左侧操作数 | C = A + B 将 A + B 的值赋给 C |
+= | 添加AND赋值运算符,它将右操作数添加到左操作数并将结果分配给左操作数 | C += A 等价于 C = C + A |
-= | 减法AND赋值运算符,它从左操作数中减去右操作数,并将结果赋给左操作数 | C -= A 相当于 C = C - A |
*= | 乘法与赋值运算符,将右操作数与左操作数相乘,并将结果赋给左操作数 | C *= A 相当于 C = C * A |
/= | 除法与赋值运算符,它将左操作数与右操作数相除,并将结果赋给左操作数 | C /= A 相当于 C = C / A |
%= | 模数与赋值运算符,它使用两个操作数取模并将结果分配给左操作数 | C %= A 相当于 C = C % A |
<<= | 左移 AND 赋值运算符 | C <<= 2 与 C = C << 2 相同 |
>>= | 右移 AND 赋值运算符 | C >>= 2 与 C = C >> 2 相同 |
&= | 按位与赋值运算符 | C &= 2 与 C = C & 2 相同 |
^= | 按位异或和赋值运算符 | C ^= 2 与 C = C ^ 2 相同 |
|= | 按位 OR 和赋值运算符 | C |= 2 与 C = C | 相同 2 |
杂项运算符
还有一些其他重要的运算符,包括sizeof、typeof和? : 由 C# 支持。
操作员 | 描述 | 例子 |
---|---|---|
大小() | 返回数据类型的大小。 | sizeof(int),返回 4。 |
类型() | 返回类的类型。 | 类型(StreamReader); |
& | 返回变量的地址。 | &A; 返回变量的实际地址。 |
* | 指向变量的指针。 | *A; 创建名为“a”的指向变量的指针。 |
?: | 条件表达式 | 如果条件为真?然后值 X :否则值 Y |
是 | 确定对象是否属于某种类型。 | If( Ford is Car) // 检查 Ford 是否是 Car 类的对象。 |
作为 | 如果转换失败,则进行转换而不引发异常。 | 对象 obj = new StringReader("Hello");
StringReader r = obj 作为 StringReader; |
C# 中的运算符优先级
运算符优先级决定表达式中术语的分组。这会影响表达式的求值。某些运算符的优先级高于其他运算符;例如,乘法运算符的优先级高于加法运算符。
例如x = 7 + 3 * 2;此处,x 被分配为 13,而不是 20,因为运算符 * 的优先级高于 +,因此首先对 3*2 进行计算,然后将 7 添加到其中。
在这里,优先级最高的运算符出现在表的顶部,优先级最低的运算符出现在底部。在表达式中,首先计算优先级较高的运算符。
类别 | 操作员 | 关联性 |
---|---|---|
后缀 | () [] -> . ++ - - | 左到右 |
一元 | + - ! ~ ++ - - (类型)* & sizeof | 右到左 |
乘法 | * / % | 左到右 |
添加剂 | + - | 左到右 |
转移 | <<>> | 左到右 |
关系型 | <<=>>= | 左到右 |
平等 | ==!= | 左到右 |
按位与 | & | 左到右 |
按位异或 | ^ | 左到右 |
按位或 | | | 左到右 |
逻辑与 | && | 左到右 |
逻辑或 | || | 左到右 |
有条件的 | ?: | 右到左 |
任务 | = += -= *= /= %=>>= <<= &= ^= |= | 右到左 |
逗号 | , | 左到右 |
C# - 决策
决策结构要求程序员指定程序要评估或测试的一个或多个条件,以及如果确定条件为真则要执行的一个或多个语句,以及可选地如果条件确定则要执行的其他语句确定为假。
以下是大多数编程语言中典型决策结构的一般形式 -
C# 提供以下类型的决策语句。单击以下链接查看其详细信息。
先生。 | 声明及说明 |
---|---|
1 | if 语句
if语句由一个布尔表达式后跟一个或多个语句组成。 |
2 | if...else 语句
if语句后面可以跟一个可选的else 语句,该语句在布尔表达式为 false 时执行。 |
3 | 嵌套 if 语句
您可以在另一个if或else if语句中使用一个if或else if语句。 |
4 | switch语句
switch语句允许测试变量是否与值列表相等。 |
5 | 嵌套 switch 语句
您可以在另一个switch语句中使用一个switch语句。 |
这 ?: 操作员
我们已经介绍了条件运算符 ? :在上一章中可以用来替换if...else语句。它具有以下一般形式 -
Exp1 ? Exp2 : Exp3;
其中 Exp1、Exp2 和 Exp3 是表达式。注意冒号的使用和位置。
的值?表达式确定如下:计算 Exp1。如果为真,则计算 Exp2 并成为整个 ? 的值。表达。如果 Exp1 为 false,则计算 Exp3 并且其值成为表达式的值。
C# - 循环
可能存在一种情况,当您需要多次执行一段代码时。一般来说,语句是按顺序执行的:首先执行函数中的第一个语句,然后执行第二个语句,依此类推。
编程语言提供了各种控制结构,允许更复杂的执行路径。
循环语句允许我们多次执行一条语句或一组语句,以下是大多数编程语言中循环语句的一般形式 -
C# 提供以下类型的循环来处理循环需求。单击以下链接查看其详细信息。
先生。 | 循环类型和描述 |
---|---|
1 | while 循环
当给定条件为真时,它会重复一个语句或一组语句。它在执行循环体之前测试条件。 |
2 | for循环
它多次执行一系列语句并缩写管理循环变量的代码。 |
3 | do...while 循环
它类似于 while 语句,不同之处在于它测试循环体末尾的条件 |
4 | 嵌套循环
您可以在任何另一个 while、for 或 do..while 循环中使用一个或多个循环。 |
循环控制语句
循环控制语句改变其正常顺序的执行。当执行离开作用域时,在该作用域中创建的所有自动对象都将被销毁。
C# 提供了以下控制语句。单击以下链接查看其详细信息。
无限循环
如果条件永远不会变为假,则循环将成为无限循环。for循环传统上用于此目的。由于构成 for 循环的三个表达式都不是必需的,因此您可以通过将条件表达式留空来创建无限循环。
例子
using System; namespace Loops { class Program { static void Main(string[] args) { for (; ; ) { Console.WriteLine("Hey! I am Trapped"); } } } }
当条件表达式不存在时,假定为真。您可能有一个初始化和增量表达式,但程序员更常用 for(;;) 构造来表示无限循环。
C# - 封装
封装被定义为“将一个或多个项目封装在物理或逻辑封装内的过程”。在面向对象的编程方法中,封装阻止了对实现细节的访问。
抽象和封装是面向对象编程中的相关特征。抽象允许使相关信息可见,而封装使程序员能够实现所需的抽象级别。
封装是通过使用访问说明符来实现的。访问说明符定义类成员的范围和可见性。C# 支持以下访问说明符 -
- 民众
- 私人的
- 受保护
- 内部的
- 受保护的内部
公共访问说明符
公共访问说明符允许类将其成员变量和成员函数公开给其他函数和对象。任何公共成员都可以从类外部访问。
下面的例子说明了这一点 -
using System; namespace RectangleApplication { class Rectangle { //member variables public double length; public double width; public double GetArea() { return length * width; } public void Display() { Console.WriteLine("Length: {0}", length); Console.WriteLine("Width: {0}", width); Console.WriteLine("Area: {0}", GetArea()); } }//end class Rectangle class ExecuteRectangle { static void Main(string[] args) { Rectangle r = new Rectangle(); r.length = 4.5; r.width = 3.5; r.Display(); Console.ReadLine(); } } }
当上面的代码被编译并执行时,它会产生以下结果 -
Length: 4.5 Width: 3.5 Area: 15.75
在前面的示例中,成员变量 length 和 width 被声明为public ,因此可以使用名为r的 Rectangle 类实例从函数 Main() 访问它们。
成员函数Display()和GetArea()也可以直接访问这些变量,而不需要使用该类的任何实例。
成员函数Display()也声明为public ,因此也可以使用 Rectangle 类的实例(名为r )从Main()访问它。
私有访问说明符
私有访问说明符允许类向其他函数和对象隐藏其成员变量和成员函数。只有同一类的函数才能访问其私有成员。即使类的实例也无法访问其私有成员。
下面的例子说明了这一点 -
using System; namespace RectangleApplication { class Rectangle { //member variables private double length; private double width; public void Acceptdetails() { Console.WriteLine("Enter Length: "); length = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Enter Width: "); width = Convert.ToDouble(Console.ReadLine()); } public double GetArea() { return length * width; } public void Display() { Console.WriteLine("Length: {0}", length); Console.WriteLine("Width: {0}", width); Console.WriteLine("Area: {0}", GetArea()); } }//end class Rectangle class ExecuteRectangle { static void Main(string[] args) { Rectangle r = new Rectangle(); r.Acceptdetails(); r.Display(); Console.ReadLine(); } } }
当上面的代码被编译并执行时,它会产生以下结果 -
Enter Length: 4.4 Enter Width: 3.3 Length: 4.4 Width: 3.3 Area: 14.52
在前面的示例中,成员变量 length 和 width 被声明为private,因此无法从函数 Main() 访问它们。成员函数AcceptDetails()和Display()可以访问这些变量。由于成员函数AcceptDetails()和Display()被声明为 public ,因此可以使用 Rectangle 类的实例(名为r )从Main()访问它们。
受保护的访问说明符
受保护的访问说明符允许子类访问其基类的成员变量和成员函数。这样有助于实现继承。我们将在继承章节中更详细地讨论这一点。
内部访问说明符
内部访问说明符允许类将其成员变量和成员函数公开给当前程序集中的其他函数和对象。换句话说,任何具有内部访问说明符的成员都可以从任何定义的类或方法访问