C# 教程 | 菜鸟教程
C# 教程C# 是一个简单的、现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的。 本教程将告诉您基础的 C# 编程,同时将向您讲解 C# 编程语言相关的各种先进理念。
谁适合阅读本教程?本教程有助于初学者理解基础的 C# 编程。在学习完本教程后,您将到达一个中级的 C# 编程水平。 阅读本教程前,您需要了解的知识:C# 编程是基于 C 和 C++ 编程语言的,因此如果您对 C 和 C++ 编程有基本的了解,将有助于您学习 C# 编程语言。 编译/执行 C# 程序菜鸟教程提供了在线的 C# 在线编译环境,您只需进行简单的点击动作,即可在高端的服务器上体验真实的编程经验。这是完全免费的在线工具。 实例using System;
namespace HelloWorldApplication
{
/* 类名为 HelloWorld */
class HelloWorld
{
/* main函数 */
static void Main(string[] args)
{
/* 我的第一个 C# 程序 */
Console.WriteLine("Hello World!");
Console.ReadKey();
}
}
}
C# 有用的资源本教程列出了 C# 网站、书籍和文章。 C# 有用的网站
C# 简介C# 是一个现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的,由 Ecma 和 ISO 核准认可的。 C# 是由 Anders Hejlsberg 和他的团队在 .Net 框架开发期间开发的。 C# 是专为公共语言基础结构(CLI)设计的。CLI 由可执行代码和运行时环境组成,允许在不同的计算机平台和体系结构上使用各种高级语言。 下面列出了 C# 成为一种广泛应用的专业语言的原因: - 现代的、通用的编程语言。
- 面向对象。
- 面向组件。
- 容易学习。
- 结构化语言。
- 它产生高效率的程序。
- 它可以在多种计算机平台上编译。
- .Net 框架的一部分。
C# 强大的编程功能虽然 C# 的构想十分接近于传统高级语言 C 和 C++,是一门面向对象的编程语言,但是它与 Java 非常相似,有许多强大的编程功能,因此得到广大程序员的青睐。 下面列出 C# 一些重要的功能: - 布尔条件(Boolean Conditions)
- 自动垃圾回收(Automatic Garbage Collection)
- 标准库(Standard Library)
- 组件版本(Assembly Versioning)
- 属性(Properties)和事件(Events)
- 委托(Delegates)和事件管理(Events Management)
- 易于使用的泛型(Generics)
- 索引器(Indexers)
- 条件编译(Conditional Compilation)
- 简单的多线程(Multithreading)
- LINQ 和 Lambda 表达式
- 集成 Windows
C# 环境在这一章中,我们将讨论创建 C# 编程所需的工具。我们已经提到 C# 是 .Net 框架的一部分,且用于编写 .Net 应用程序。因此,在讨论运行 C# 程序的可用工具之前,让我们先了解一下 C# 与 .Net 框架之间的关系。 .Net 框架(.Net Framework).Net 框架是一个创新的平台,能帮您编写出下面类型的应用程序: - Windows 应用程序
- Web 应用程序
- Web 服务
.Net 框架应用程序是多平台的应用程序。框架的设计方式使它适用于下列各种语言:C#、C++、Visual Basic、Jscript、COBOL 等等。所有这些语言可以访问框架,彼此之间也可以互相交互。 .Net 框架由一个巨大的代码库组成,用于 C# 等客户端语言。下面列出一些 .Net 框架的组件: - 公共语言运行库(Common Language Runtime - CLR)
- .Net 框架类库(.Net Framework Class Library)
- 公共语言规范(Common Language Specification)
- 通用类型系统(Common Type System)
- 元数据(Metadata)和组件(Assemblies)
- Windows 窗体(Windows Forms)
- ASP.Net 和 ASP.Net AJAX
- ADO.Net
- Windows 工作流基础(Windows Workflow Foundation - WF)
- Windows 显示基础(Windows Presentation Foundation)
- Windows 通信基础(Windows Communication Foundation - WCF)
- LINQ
如需了解每个组件的详细信息,请参阅微软(Microsoft)的文档。 C# 的集成开发环境(Integrated Development Environment - IDE)微软(Microsoft)提供了下列用于 C# 编程的开发工具: 这些工具和服务共同构成了微软支持C#开发的强大生态系统,使得开发者可以高效地进行C#程序的开发、测试、部署和维护。 在 Linux 或 Mac OS 上编写 C# 程序虽然 .NET 框架是运行在 Windows 操作系统上,但是也有一些运行于其它操作系统上的版本可供选择。 Mono 是 .NET 框架的一个开源版本,它包含了一个 C# 编译器,且可运行于多种操作系统上,比如各种版本的 Linux 和 Mac OS。如需了解更多详情,请访问 Go Mono。 Mono 的目的不仅仅是跨平台地运行微软 .NET 应用程序,而且也为 Linux 开发者提供了更好的开发工具。Mono 可运行在多种操作系统上,包括 Android、BSD、iOS、Linux、OS X、Windows、Solaris 和 UNIX。
C# 程序结构在我们学习 C# 编程语言的基础构件块之前,让我们先看一下 C# 的最小的程序结构,以便作为接下来章节的参考。 C# Hello World 实例一个 C# 程序主要包括以下部分: - 命名空间声明(Namespace declaration)
- 一个 class
- Class 方法
- Class 属性
- 一个 Main 方法
- 语句(Statements)& 表达式(Expressions)
- 注释
C# 文件的后缀为 .cs。 以下创建一个 test.cs 文件,文件包含了可以打印出 "Hello World" 的简单代码: test.cs 文件代码:using System;
namespace HelloWorldApplication
{
class HelloWorld
{
static void Main(string[] args)
{
/* 我的第一个 C# 程序*/
Console.WriteLine("Hello World");
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果: Hello World让我们看一下上面程序的各个部分: 以下几点值得注意: - C# 是大小写敏感的。
- 所有的语句和表达式必须以分号(;)结尾。
- 程序的执行从 Main 方法开始。
- 与 Java 不同的是,文件名可以不同于类的名称。
编译 & 执行 C# 程序如果您使用 Visual Studio.Net 编译和执行 C# 程序,请按下面的步骤进行: - 启动 Visual Studio。
- 在菜单栏上,选择 File -> New -> Project。
- 从模板中选择 Visual C#,然后选择 Windows。
- 选择 Console Application。
- 为您的项目制定一个名称,然后点击 OK 按钮。
- 新项目会出现在解决方案资源管理器(Solution Explorer)中。
- 在代码编辑器(Code Editor)中编写代码。
- 点击 Run 按钮或者按下 F5 键来运行程序。会出现一个命令提示符窗口(Command Prompt window),显示 Hello World。
您也可以使用命令行代替 Visual Studio IDE 来编译 C# 程序: - 打开一个文本编辑器,添加上面提到的代码。
- 保存文件为 helloworld.cs。
- 打开命令提示符工具,定位到文件所保存的目录。
- 键入 csc helloworld.cs 并按下 enter 键来编译代码。
- 如果代码没有错误,命令提示符会进入下一行,并生成 helloworld.exe 可执行文件。
- 接下来,键入 helloworld 来执行程序。
- 您将看到 "Hello World" 打印在屏幕上。
C# 基本语法C# 是一种面向对象的编程语言。在面向对象的程序设计方法中,程序由各种相互交互的对象组成。相同种类的对象通常具有相同的类型,或者说,是在相同的 class 中。 例如,以 Rectangle(矩形)对象为例。它具有 length 和 width 属性。根据设计,它可能需要接受这些属性值、计算面积和显示细节。
让我们来看看一个 Rectangle(矩形)类的实现,并借此讨论 C# 的基本语法: 实例using System;
namespace RectangleApplication
{
class Rectangle
{
// 成员变量
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.5Width: 3.5Area: 15.75using 关键字在任何 C# 程序中的第一条语句都是: using System;using 关键字用于在程序中包含命名空间。一个程序可以包含多个 using 语句。 class 关键字class 关键字用于声明一个类。 C# 中的注释注释是用于解释代码。编译器会忽略注释的条目。在 C# 程序中,多行注释以 /* 开始,并以字符 */ 终止,如下所示: /* 这个程序演示C# 的注释使用 */单行注释是用 // 符号表示。例如: // 这一行是注释 成员变量变量是类的属性或数据成员,用于存储数据。在上面的程序中,Rectangle 类有两个成员变量,名为 length 和 width。 成员函数函数是一系列执行指定任务的语句。类的成员函数是在类内声明的。我们举例的类 Rectangle 包含了三个成员函数: AcceptDetails、GetArea 和 Display。 实例化一个类在上面的程序中,类 ExecuteRectangle 是一个包含 Main() 方法和实例化 Rectangle 类的类。 标识符标识符是用来识别类、变量、函数或任何其它用户定义的项目。在 C# 中,类的命名必须遵循如下基本规则: - 标识符必须以字母、下划线或 @ 开头,后面可以跟一系列的字母、数字( 0 - 9 )、下划线( _ )、@。
- 标识符中的第一个字符不能是数字。
- 标识符必须不包含任何嵌入的空格或符号,比如 ? - +! # % ^ & * ( ) [ ] { } . ; : " ' / \。
- 标识符不能是 C# 关键字。除非它们有一个 @ 前缀。 例如,@if 是有效的标识符,但 if 不是,因为 if 是关键字。
- 标识符必须区分大小写。大写字母和小写字母被认为是不同的字母。
- 不能与C#的类库名称相同。
C# 关键字关键字是 C# 编译器预定义的保留字。这些关键字不能用作标识符,但是,如果您想使用这些关键字作为标识符,可以在关键字前面加上 @ 字符作为前缀。 在 C# 中,有些关键字在代码的上下文中有特殊的意义,如 get 和 set,这些被称为上下文关键字(contextual keywords)。 下表列出了 C# 中的保留关键字(Reserved Keywords)和上下文关键字(Contextual Keywords): | 保留关键字 | | abstract | as | base | bool | break | byte | case | | catch | char | checked | class | const | continue | decimal | | default | delegate | do | double | else | enum | event | | explicit | extern | false | finally | fixed | float | for | | foreach | goto | if | implicit | in | in (generic
modifier) | int | | interface | internal | is | lock | long | namespace | new | | null | object | operator | out | out
(generic
modifier) | override | params | | private | protected | public | readonly | ref | return | sbyte | | sealed | short | sizeof | stackalloc | static | string | struct | | switch | this | throw | true | try | typeof | uint | | ulong | unchecked | unsafe | ushort | using | virtual | void | | volatile | while | | | | | | | 上下文关键字 | | add | alias | ascending | descending | dynamic | from | get | | global | group | into | join | let | orderby | partial
(type) | partial
(method) | remove | select | set | | | | 顶级语句(Top-Level Statements)在 C# 9.0 版本中,引入了顶级语句(Top-Level Statements)的概念,这是一种新的编程范式,允许开发者在文件的顶层直接编写语句,而不需要将它们封装在方法或类中。 特点: 无需类或方法:顶级语句允许你直接在文件的顶层编写代码,无需定义类或方法。 文件作为入口点:包含顶级语句的文件被视为程序的入口点,类似于 C# 之前的 Main 方法。 自动 Main 方法:编译器会自动生成一个 Main 方法,并将顶级语句作为 Main 方法的主体。 支持局部函数:尽管不需要定义类,但顶级语句的文件中仍然可以定义局部函数。 更好的可读性:对于简单的脚本或工具,顶级语句提供了更好的可读性和简洁性。 适用于小型项目:顶级语句非常适合小型项目或脚本,可以快速编写和运行代码。 与现有代码兼容:顶级语句可以与现有的 C# 代码库一起使用,不会影响现有代码。
传统 C# 代码 - 在使用顶级语句之前,你必须像这样编写一个 C# 程序: 实例using System;
namespace MyApp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
}
使用顶级语句的 C# 代码 - 使用顶级语句,可以简化为: 实例using System;
Console.WriteLine("Hello, World!");
顶级语句支持所有常见的 C# 语法,包括声明变量、定义方法、处理异常等。 实例using System;
using System.Linq;
// 顶级语句中的变量声明
int number = 42;
string message = "The answer to life, the universe, and everything is";
// 输出变量
Console.WriteLine($"{message} {number}.");
// 定义和调用方法
int Add(int a, int b) => a + b;
Console.WriteLine($"Sum of 1 and 2 is {Add(1, 2)}.");
// 使用 LINQ
var numbers = new[] { 1, 2, 3, 4, 5 };
var evens = numbers.Where(n => n % 2 == 0).ToArray();
Console.WriteLine("Even numbers: " + string.Join(", ", evens));
// 异常处理
try
{
int zero = 0;
int result = number / zero;
}
catch (DivideByZeroException ex)
{
Console.WriteLine("Error: " + ex.Message);
}
a + b;Console.WriteLine($"Sum of 1 and 2 is {Add(1, 2)}.");// 使用 LINQvar numbers = new[] { 1, 2, 3, 4, 5 };var evens = numbers.Where(n => n % 2 == 0).ToArray();Console.WriteLine("Even numbers: " + string.Join(", ", evens));// 异常处理try{ int zero = 0; int result = number / zero;}catch (DivideByZeroException ex){ Console.WriteLine("Error: " + ex.Message);}" style="font-family: HELVETICA, sans-serif; -webkit-font-smoothing: antialiased; font-size: 0.8em; outline: 0px; display: block; border-width: 1px; border-style: solid; border-color: rgb(90, 98, 114); background: none 0px 0px repeat scroll rgb(32, 39, 70); border-radius: 4px; cursor: pointer; text-transform: uppercase; font-weight: 500; line-height: 1.42rem; padding: 2px 2px 4px 4px; box-sizing: inherit; color: rgb(241, 242, 243) !important; position: absolute !important; top: 4px !important; right: 2px !important;">
注意事项- 文件限制:顶级语句只能在一个源文件中使用。如果在一个项目中有多个使用顶级语句的文件,会导致编译错误。
- 程序入口:如果使用顶级语句,则该文件会隐式地包含 Main 方法,并且该文件将成为程序的入口点。
- 作用域限制:顶级语句中的代码共享一个全局作用域,这意味着可以在顶级语句中定义的变量和方法可以在整个文件中访问。
顶级语句在简化代码结构、降低学习难度和加快开发速度方面具有显著优势,特别适合于编写简单程序和脚本。
C# 数据类型在 C# 中,变量分为以下几种类型: - 值类型(Value types)
- 引用类型(Reference types)
- 指针类型(Pointer types)
值类型(Value types)值类型变量可以直接分配给一个值。它们是从类 System.ValueType 中派生的。 值类型直接包含数据。比如 int、char、float,它们分别存储数字、字符、浮点数。当您声明一个 int 类型时,系统分配内存来存储值。 下表列出了 C# 2010 中可用的值类型: 类型 | 描述 | 范围 | 默认值 | | bool | 布尔值 | True 或 False | False | | byte | 8 位无符号整数 | 0 到 255 | 0 | | char | 16 位 Unicode 字符 | U +0000 到 U +ffff | '\0' | | decimal | 128 位精确的十进制值,28-29 有效位数 | (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 | 0.0M | | double | 64 位双精度浮点型 | (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 | 0.0D | | float | 32 位单精度浮点型 | -3.4 x 1038 到 + 3.4 x 1038 | 0.0F | | int | 32 位有符号整数类型 | -2,147,483,648 到 2,147,483,647 | 0 | | long | 64 位有符号整数类型 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0L | | sbyte | 8 位有符号整数类型 | -128 到 127 | 0 | | short | 16 位有符号整数类型 | -32,768 到 32,767 | 0 | | uint | 32 位无符号整数类型 | 0 到 4,294,967,295 | 0 | | ulong | 64 位无符号整数类型 | 0 到 18,446,744,073,709,551,615 | 0 | | ushort | 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引用类型(Reference types)引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。 换句话说,它们指的是一个内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。内置的 引用类型有:object、dynamic 和 string。 对象(Object)类型对象(Object)类型 是 C# 通用类型系统(Common Type System - CTS)中所有数据类型的终极基类。Object 是 System.Object 类的别名。所以对象(Object)类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。 当一个值类型转换为对象类型时,则被称为 装箱;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱。 object obj;obj = 100; // 这是装箱动态(Dynamic)类型您可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。 声明动态类型的语法: dynamic <variable_name> = value;例如: dynamic d = 20;动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。 字符串(String)类型字符串(String)类型 允许您给变量分配任何字符串值。字符串(String)类型是 System.String 类的别名。它是从对象(Object)类型派生的。字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号。 例如: String str = "runoob.com";一个 @引号字符串: @"runoob.com";C# string 字符串的前面可以加 @(称作"逐字字符串")将转义字符(\)当作普通字符对待,比如: string str = @"C:\Windows";等价于: string str = "C:\\Windows";@ 字符串中可以任意换行,换行符及缩进空格都计算在字符串长度之内。 string str = @"<script type=""text/javascript""> <!-- --></script>";用户自定义引用类型有:class、interface 或 delegate。我们将在以后的章节中讨论这些类型。 指针类型(Pointer types)指针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针有相同的功能。 声明指针类型的语法: type* identifier;例如: char* cptr;int* iptr;我们将在章节"不安全的代码"中讨论指针类型。
C# 类型转换在 C# 中,类型转换是将一个数据类型的值转换为另一个数据类型的过程。 C# 中的类型转换可以分为两种:隐式类型转换和显式类型转换(也称为强制类型转换)。 隐式类型转换隐式转换是不需要编写代码来指定的转换,编译器会自动进行。 隐式转换是指将一个较小范围的数据类型转换为较大范围的数据类型时,编译器会自动完成类型转换,这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。 例如,从 int 到 long,从 float 到 double 等。 从小的整数类型转换为大的整数类型,从派生类转换为基类。将一个 byte 类型的变量赋值给 int 类型的变量,编译器会自动将 byte 类型转换为 int 类型,不需要显示转换。 实例byte b = 10;
int i = b; // 隐式转换,不需要显式转换
将一个整数赋值给一个长整数,或者将一个浮点数赋值给一个双精度浮点数,这种转换不会导致数据丢失: 实例int intValue = 42;
long longValue = intValue; // 隐式转换,从 int 到 long
显式转换显式类型转换,即强制类型转换,需要程序员在代码中明确指定。 显式转换是指将一个较大范围的数据类型转换为较小范围的数据类型时,或者将一个对象类型转换为另一个对象类型时,需要使用强制类型转换符号进行显示转换,强制转换会造成数据丢失。 例如,将一个 int 类型的变量赋值给 byte 类型的变量,需要显示转换。 实例int i = 10;
byte b = (byte)i; // 显式转换,需要使用强制类型转换符号
强制转换为整数类型: 实例double doubleValue = 3.14;
int intValue = (int)doubleValue; // 强制从 double 到 int,数据可能损失小数部分
强制转换为浮点数类型: 实例int intValue = 42;
float floatValue = (float)intValue; // 强制从 int 到 float,数据可能损失精度
强制转换为字符串类型: 实例int intValue = 123;
string stringValue = intValue.ToString(); // 将 int 转换为字符串
下面的实例显示了一个显式的类型转换: 实例using System;
namespace TypeConversionApplication
{
class ExplicitConversion
{
static void Main(string[] args)
{
double d = 5673.74;
int i;
// 强制转换 double 为 int
i = (int)d;
Console.WriteLine(i);
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果: 5673C# 类型转换方法C# 提供了下列内置的类型转换方法: 序号 | 方法 & 描述 | | 1 | ToBoolean
如果可能的话,把类型转换为布尔型。 | | 2 | ToByte
把类型转换为字节类型。 | | 3 | ToChar
如果可能的话,把类型转换为单个 Unicode 字符类型。 | | 4 | ToDateTime
把类型(整数或字符串类型)转换为 日期-时间 结构。 | | 5 | ToDecimal
把浮点型或整数类型转换为十进制类型。 | | 6 | ToDouble
把类型转换为双精度浮点型。 | | 7 | ToInt16
把类型转换为 16 位整数类型。 | | 8 | ToInt32
把类型转换为 32 位整数类型。 | | 9 | ToInt64
把类型转换为 64 位整数类型。 | | 10 | ToSbyte
把类型转换为有符号字节类型。 | | 11 | ToSingle
把类型转换为小浮点数类型。 | | 12 | ToString
把类型转换为字符串类型。 | | 13 | ToType
把类型转换为指定类型。 | | 14 | ToUInt16
把类型转换为 16 位无符号整数类型。 | | 15 | ToUInt32
把类型转换为 32 位无符号整数类型。 | | 16 | ToUInt64
把类型转换为 64 位无符号整数类型。 |
这些方法都定义在 System.Convert 类中,使用时需要包含 System 命名空间。它们提供了一种安全的方式来执行类型转换,因为它们可以处理 null值,并且会抛出异常,如果转换不可能进行。 例如,使用 Convert.ToInt32 方法将字符串转换为整数: string str = "123";int number = Convert.ToInt32(str); // 转换成功,number为123如果字符串不是有效的整数表示,Convert.ToInt32 将抛出 FormatException。 下面的实例把不同值的类型转换为字符串类型: 实例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();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果: 7553.0052345.7652True在进行类型转换时需要注意以下几点: - 隐式转换只能将较小范围的数据类型转换为较大范围的数据类型,不能将较大范围的数据类型转换为较小范围的数据类型;
- 显式转换可能会导致数据丢失或精度降低,需要进行数据类型的兼容性检查;
- 对于对象类型的转换,需要进行类型转换的兼容性检查和类型转换的安全性检查。
类型转换方法C# 提供了多种类型转换方法,例如使用 Convert 类、Parse 方法和 TryParse 方法,这些方法可以帮助处理不同的数据类型之间的转换。 使用 Convert 类Convert 类提供了一组静态方法,可以在各种基本数据类型之间进行转换。 实例string str = "123";
int num = Convert.ToInt32(str);
使用 Parse 方法Parse 方法用于将字符串转换为对应的数值类型,如果转换失败会抛出异常。 实例string str = "123.45";
double d = double.Parse(str);
使用 TryParse 方法TryParse 方法类似于 Parse,但它不会抛出异常,而是返回一个布尔值指示转换是否成功。 实例string str = "123.45";
double d;
bool success = double.TryParse(str, out d);
if (success) {
Console.WriteLine("转换成功: " + d);
} else {
Console.WriteLine("转换失败");
}
自定义类型转换C# 还允许你定义自定义类型转换操作,通过在类型中定义 implicit 或 explicit 关键字。 实例using System;
public class Fahrenheit
{
public double Degrees { get; set; }
public Fahrenheit(double degrees)
{
Degrees = degrees;
}
// 隐式转换从Fahrenheit到double
public static implicit operator double(Fahrenheit f)
{
return f.Degrees;
}
// 显式转换从double到Fahrenheit
public static explicit operator Fahrenheit(double d)
{
return new Fahrenheit(d);
}
}
public class Program
{
public static void Main()
{
Fahrenheit f = new Fahrenheit(98.6);
Console.WriteLine("Fahrenheit object: " + f.Degrees + " degrees");
double temp = f; // 隐式转换
Console.WriteLine("After implicit conversion to double: " + temp + " degrees");
Fahrenheit newF = (Fahrenheit)temp; // 显式转换
Console.WriteLine("After explicit conversion back to Fahrenheit: " + newF.Degrees + " degrees");
}
}
以上例子中,我们定义了一个 Fahrenheit 类,并实现了从 Fahrenheit 到 double 的隐式转换和从 double 到 Fahrenheit 的显式转换。 输出结果将显示如下: Fahrenheit object: 98.6 degreesAfter implicit conversion to double: 98.6 degreesAfter explicit conversion back to Fahrenheit: 98.6 degrees 总结在 C# 中,内置的类型转换方法主要通过以下几种方式实现:隐式转换、显式转换(强制转换)、使用 Convert 类的方法、Parse 方法和 TryParse 方法,这些方法广泛应用于不同数据类型之间的转换。 以下是 C# 内置类型转换方法的表格: 方法类别 方法 描述
隐式转换自动进行的转换无需显式指定,通常用于安全的类型转换,如从较小类型到较大类型
显式转换(强制转换)(type)value需要显式指定,通常用于可能导致数据丢失或转换失败的情况
Convert 类方法Convert.ToBoolean(value)将指定类型转换为 Boolean
Convert.ToByte(value)将指定类型转换为 Byte
Convert.ToChar(value)将指定类型转换为 Char
Convert.ToDateTime(value)将指定类型转换为 DateTime
Convert.ToDecimal(value)将指定类型转换为 Decimal
Convert.ToDouble(value)将指定类型转换为 Double
Convert.ToInt16(value)将指定类型转换为 Int16(短整型)
Convert.ToInt32(value)将指定类型转换为 Int32(整型)
Convert.ToInt64(value)将指定类型转换为 Int64(长整型)
Convert.ToSByte(value)将指定类型转换为 SByte
Convert.ToSingle(value)将指定类型转换为 Single(单精度浮点型)
Convert.ToString(value)将指定类型转换为 String
Convert.ToUInt16(value)将指定类型转换为 UInt16(无符号短整型)
Convert.ToUInt32(value)将指定类型转换为 UInt32(无符号整型)
Convert.ToUInt64(value)将指定类型转换为 UInt64(无符号长整型)
Parse 方法Boolean.Parse(string)将字符串解析为 Boolean
Byte.Parse(string)将字符串解析为 Byte
Char.Parse(string)将字符串解析为 Char
DateTime.Parse(string)将字符串解析为 DateTime
Decimal.Parse(string)将字符串解析为 Decimal
Double.Parse(string)将字符串解析为 Double
Int16.Parse(string)将字符串解析为 Int16
Int32.Parse(string)将字符串解析为 Int32
Int64.Parse(string)将字符串解析为 Int64
SByte.Parse(string)将字符串解析为 SByte
Single.Parse(string)将字符串解析为 Single
UInt16.Parse(string)将字符串解析为 UInt16
UInt32.Parse(string)将字符串解析为 UInt32
UInt64.Parse(string)将字符串解析为 UInt64
TryParse 方法Boolean.TryParse(string, out bool)尝试将字符串解析为 Boolean,返回布尔值表示是否成功
Byte.TryParse(string, out byte)尝试将字符串解析为 Byte,返回布尔值表示是否成功
Char.TryParse(string, out char)尝试将字符串解析为 Char,返回布尔值表示是否成功
DateTime.TryParse(string, out DateTime)尝试将字符串解析为 DateTime,返回布尔值表示是否成功
Decimal.TryParse(string, out decimal)尝试将字符串解析为 Decimal,返回布尔值表示是否成功
Double.TryParse(string, out double)尝试将字符串解析为 Double,返回布尔值表示是否成功
Int16.TryParse(string, out short)尝试将字符串解析为 Int16,返回布尔值表示是否成功
Int32.TryParse(string, out int)尝试将字符串解析为 Int32,返回布尔值表示是否成功
Int64.TryParse(string, out long)尝试将字符串解析为 Int64,返回布尔值表示是否成功
SByte.TryParse(string, out sbyte)尝试将字符串解析为 SByte,返回布尔值表示是否成功
Single.TryParse(string, out float)尝试将字符串解析为 Single,返回布尔值表示是否成功
UInt16.TryParse(string, out ushort)尝试将字符串解析为 UInt16,返回布尔值表示是否成功
UInt32.TryParse(string, out uint)尝试将字符串解析为 UInt32,返回布尔值表示是否成功
UInt64.TryParse(string, out ulong)尝试将字符串解析为 UInt64,返回布尔值表示是否成功
|