编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN
一、C#与运行环境:
1. C#的特点:
C#是一种从C和C++派生出的书写简洁、类型安全的面向对象的编程语言,开发人员可以使用来构建在.NET Framework上运行的各种安全、可靠的应用程序。使用C#,可以创建传统的Window客户端应用程序、XML Web Service、分布式组件、客户端/服务器应用程序、数据库应用程序等。
C#简化了C++的诸多复杂性,并提供了强大的功能,可以使熟悉C、C++或Java的编程者在很短的时间内就可以使用。C#是一种面向对象的编程语言,支持封装、继承和多态,所有的变量和方法,包括Main方法都封装在类定义中,类只能从一个父类继承,但可以实现任意数量的接口;重写父类中的虚方法需要使用Override避免意外重定义。
C#的生成过程比C和C++简单,比Java灵活。C#没有单独的头文件,也不需要按顺序声明方法和类型。
2. C#的运行环境:
用C#编写的源代码,被编译为一种符合通用语言框架CLI(Common Language Infrastructure)规范的中间语言IL,IL代码与资源(位图等)一起作为一种称为程序集的可执行文件存储在磁盘上,通常扩展名为exe或dll。程序集包含的清单提供有关程序集的类型、版本、区域性和安全要求等信息。
执行C#程序时,程序集加载到公共语言运行库CLR(Common Language Runtime)中,并根据清单中的信息执行不同的操作。如果符合安全要求,CLR就会执行实时编译已将IL代码转换成本地机器码指令。CLR还提供与自动垃圾回收、异常处理和资源管理有关的其他服务。
CLR执行的代码有时也称为托管代码,与编译为面向特定系统的本地机器语言的非托管代码相对应。下图展示了C#源程序、.NET Framework类库、托管程序集和CLR的编译时与运行时的关系。
3. .NET Framework类库:
.NET Framework是支持生成和运行下一代Web应用程序和XML Web Service的内部Windows组件,提供了一致的面向对象的编程环境和代码执行环境,语言的互操作性是.NET Framework的一项主要功能。.NET Framework主要有公共语言运行库和.NET Framework类库。
由C#编译器生成的IL代码符合通用类型系统CTS(Common Type System)规范,因此生成的代码可以与Visual Basic、Visual C++、Visual J#的.NET版本或者其他20多种符合CTS规范的语言生成的代码进行交互。单一程序集可能包含用不同.NET语言编写的多个模块,并且类型之间可以互相引用,就像它们是用同一种语言编写的一样。
早期的开发中,各种应用的开发人员使用各自平台提供的工具类库,开发适用于不同平台的应用,因此开发人员要掌握多种类库的使用方法,降低了工作效率。而.NET Framework提供了丰富的接口集合,以及抽象与非抽象类,包含由4000多个类组成的内容详尽的库,曾经难以实现或者需要第三方组件支持的应用程序,通过使用.NET Framework后使用少量代码即可实现。这些类库被组织为命名空间,为文件输入环绕输出、字符串操作、XML分析和Windows窗体控件提供了各种有用的功能。
4. .NET:
公共语言运行库是.NET Framework的基础,可以看作是一个在执行时管理代码的代理,提供内存管理、线程管理、远程处理等核心任务,并且强制进行类型安全以及可提高安全性和可靠性的代码保障。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。
.NET Framework是符合工业标准的通用语言框架CLI。CLI是一种为虚拟机环境而制订的规范,使得各种高级语言所编写的程序可以在不同的系统环境中执行,而不必更改或重新编译源代码。公共语言运行库CLR是微软对CLI的一种实现,可以在Windows操作系统下执行。
公共语言运行库的使用,简化了应用程序的开发,可以支持多语言,开发人员可以用他们熟悉的编程语言编写应用程序,并能利用其他开发人员用其他语言编写的运行库、类库和组件,提高了开发效率。
二、Visual Studio集成开发环境:
Visual Studio是微软推出的Windows平台应用程序的开发环境,可以支持多种编程语言。Visual Studio C#集成开发环境是与其他编程语言共享的,但也有一些工具是C#特有的。
1. 代码编辑器:
Visual Studio的中间部分的用户编辑区域就是Windows窗体设计器和代码编辑器,用户可以打开某个文件并对文件进行修改。有设计视图和代码视图两种视图,并可在两种之间切换。设计视图用来实现程序外观,允许用户在界面上指定控件和其他项的位置,还可以从工具箱中拖动控件放置设计视图中,实现所见即所得的效果;代码视图用来显示程序源代码,并支持编写帮助,并以不同的颜色显示代码中的不同内容,默认情况下用蓝色显示关键字、棕色显示字符串、蓝绿显示类名、绿色显示注释等,当然这些设置可以用户自定义。
代码编辑器会自动将命名空间、类、方法视为可折叠区域,以便于查找和读取源代码文件的其他部分。
2. 工具箱:
设计区左侧为工具箱,其中放置了各种控件,用于绘制程序界面。工具箱由多个选项卡组成,每个选项卡包含一组控件,可以展开或者折叠。
开发者可以将工具箱中的控件拖动到设计视图上,也可以通过双击鼠标实现,操作后就会由Visual Studio自动添加代码。
在设计视图中自定义一个控件,可以将已配置的控件拖回工具箱,作为一个模板以便重用。
3. 解决方案资源管理器:
一个大型项目会用到很多资源,包括源代码、图片、文件、数据库等,有可能包括很多功能模块,Visual Studio使用解决方案资源管理器来进行组织管理。
解决方案就是要创建的应用程序,其下各个模块对应一个个项目,还可以包含一些项,表示创建应用程序所需的引用、数据连接、文件夹和文件。项目和项目以及项目和解决方案之间的连接可以通过解决方案管理器和命名空间来管理。
一个Visual Studio项目中,会包含多种后缀的文件类型:
· sln:Visual Studio的解决方案文件,提供显示管理文件的图形接口所需的信息。打开此文件能快速打开整个项目的所有文件。
· csproj:Visual C#项目文件,一种特殊的XML文档,主要用来控制项目的生成。
· cs:Visual C#源代码文件,是C#的源程序文件,包括Windows窗体文件、控件文件、类文件、接口文件等。
· resx:资源文件,包括Windows窗体、Web窗体等文件的资源信息。
· aspx:Web窗体文件,表示Web窗体,由HTML标记、Web控件、脚本等组成。
· asmx:XML Web服务文件,链接一个特定的cs文件,cs文件中包含了供Internet调用的方法代码。
4. 属性窗口:
Visual Studio中的每个对象都有自己的特征集,用来唯一标识自己,这个特征集称为属性。属性窗口位于设计区域右下角,列出了当前选中内容的各种属性,可以对这些属性进行修改。属性窗口最上部是一个下列列表框,显示当前选中的内容,也可以从中选择其他项。
5. 任务列表:
6. 快捷键:
· F5:调试运行程序
· Ctrl+F5:不调试运行程序
· F11:逐句调试程序
· F10:逐过程调试程序
7. 获得帮助:
Visual Studio帮助文档在MSDN Library中,可以将其安装在本地计算机上,也可通过网络获取。F1键提供区分大小写的搜索功能,在代码编辑器中用鼠标指针定位于关键字或类成员上或紧随按F1键,即可访问C#关键字和相关类的帮助文档。当控件获得焦点,按F1键可获取控件的帮助。
三、C#程序基本结构:
一个控制台应用程序示例:
using System;
using System.Collections.Generic;
using System.Ling;
using System.Text;
using System.Threading.Tasks;
namespace Hello
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("欢迎使用控制台程序");
Console.Read();
}
}
}
1. namespace:
namespace命令定义了一个命名空间。命名空间是一个类的集合,其中包含按照某种关系组织在一起的类。命名空间的引入是为了避免类的命名冲突。比如TextBox类,有Windows窗体上和Web窗体上两种,没有命名空间就会产生歧义。
把类放在命名空间中,类名就自动具有了一个与命名空间名字相同的前缀,可以有效避免命名冲突,比如TextBox类,一个在Windows.Forms命名空间中,一个在System.Web.UI. WebControls命名空间中,编程时指定“命名空间.类名”形式的完整类名,就可以明确无歧义地确定唯一的类。
代码中,使用namespace定义一个命名空间,紧跟其后就是命名空间的名字,然后是一对大括号,大括号中定义的所有类都属于这个命名空间。示例代码中,命名空间为Hello,其中定义了类Program,完整类名为Hello.
在实际软件开发中,为了避免所编写的类与其他人员或者其他公司编写的类发生冲突,一般会把类放在一个不容易重名的命名空间中,如以公司名作为顶层命名空间,以部门名作为第二层命名空间,以项目名作为第三层命名空间。
2. using:
使用命名空间,在使用一个类时需要把类的命名空间放在类名的前面为前缀,增加了编码工作量,在命名空间层次很多的情况下更是如此。Using命令可以很好地解决上述问题,其作用是导入一个命名空间,这样可以直接通过类名使用这个命名空间中的类,而不必写完整的类名。示例代码中,Console类是定义在System命名空间中,如果不使用using System,那么使用Console类时需要写成System.Console。
3. 程序注释:
在程序中加入注释是为了使程序清晰可读。注释不会被编译,更不会产生可执行代码。C#的注释与C语言注释一致,有/*...*/和//两种注释方式,其中/*...*/为多行注释,双斜线//为行内注释。
4. Main函数:
Main函数是C#程序的入口点,C#程序运行时,不管是Windows窗体程序还是控制台程序,都将从Main函数开始执行。Main函数必须声明为静态的。
根据返回类型和入口参数不同,Main函数分为以下几种形式:
static void Main()
static void Main(string[] args)
static int Main()
static int Main(string[] args)
可以看出,Main函数有void和int两种返回类型,可以没有入口参数,也可以接受字符串组作为参数。
5. Console类的用法:
Console类位于System命名空间,为控制台提供了最基本的输入、输出方法,最常用的包括WriteLine、Write、ReadLine、Read。
⑴ReadLine和Read:
Console.ReadLine方法用于从标准输入设备输入一行字符,以回车表示结束,返回的结果是字符串string类型的数据。示例:
string s=Console.ReadLine();
上面语句将从键盘输入一行字符赋值给字符串string型变量s。如果要输入数值,需要将字符串s通过Convert类的方法转换为相应的数值。
Console.Read方法也是从标准输入设备输入字符,不过只接收一个字符,并且返回结果是一个int型数值,即该字符的ASCII码。示例:
int n=Console.Read();
char c=Convert.ToChar(n);
上面的代码,先将输入字符的ASCII码赋值给int型变量n,再通过Convert.ToChar()进行转换,最终将输入字符赋值给char型变量c。
⑵WriteLine和Write:
Console.WriteLine和Console.Write方法均用于在标准输出设备上输出字符串,区别在于Console.WriteLine输出后自动加一个回车换行,而Console.Write不自动换行。
这两种方法可输出的数据包括字符、字符串、整型数据和实型数据等。示例:
int a=10;
string s="hello";
Console.WriteLine(a);
Console.WriteLine(s);
Console.WriteLine(s+a); //进行字符串连接后再输出
6. 简单的程序调试:
在应用程序开发过程中,尤其在出现错误或未达到预期效果时,经常需要进行调试,以便找出问题所在。Visual Studio的调试器以可视化方式显示调试中的信息,还可以设置断点。
四、C#基本语法:
1. 标识符:
程序中会用到各种对象,如常量、变量、数组、方法、类型等,为了识别这些对象,必须赋予每个对象一个名字,称为标识符。
所有标识符只能由字母、数字和下划线组成,而且第一个字符必须为字母或下划线;标识符中不能包含空格、逗号、运算符等其他符号;标识符区分大小写;标识符不能与C#关键字相同;标识符不能与C#中的类库名相同。
C#关键字,也称保留字,是由系统预先定义好的标识符,在C#中有特定含义。关键字见下表:
abstract | enum | long | stackalloc | as | event | namespace |
static | base | explicit | new | string | bool | extern |
null | struct | break | false | object | switch | byte |
finally | operaror | this | case | fixed | out | throw |
catch | float | override | true | char | for | params |
try | checked | foreach | private | typeof | class | goto |
protected | uint | const | if | public | ulong | continue |
implicit | readonly | unchecked | decimal | in | ref | unsafe |
default | int | return | ushort | delegate | interface | sbyte |
using | do | internal | sealed | virtual | double | is |
short | void | else | lock | sizeof | while |
2. 变量和常量:
1)变量:
程序需要对数据进行读、写、运算等操作,当保存特定的值或计算结果时,就需要用到变量。变量是计算机内存中被命名的存储单元,其中存储的值是可以改变的。变量名实际上是一个符号地址,在对程序编译时由系统给每个变量分配一个真正的内存地址。在程序中通过变量取值,实际上就是通过变量名找到相应的内存地址,再从中读取数据或存入数据。
为变量命名要遵循C#标识符命名规范,除此之外,使用时的一般性建议:变量名最好以小写字母开头;变量名应具有描述性,即选取有意义的字符序列作为变量名,便于理解所标识的对象;在包含多个单词的变量名中,从第二个单词开始都采用首字母大写。
C#中,变量必须先定义后使用,定义一个变量必须指定存储的数据类型。示例:
int count;
byte a,b,c;
程序运行中,可以通过表达式给变量赋值。示例:
a=b+5;
在程序中,可以给一个变量多次赋值,变量的当前值等于最后一次给该变量赋的值。也可以在定义变量时为其赋值,称为变量初始化。示例:
int count=5;
byte a=3,b=4,c=5;
2)常量:
常量是在程序执行过程中其值不能改变的量。常量也用来存储数据,但常量一旦初始化就不能再改变。
常量的声明需要指定数据类型、常量名以及初始值,并以const关键字定义。示例:
const double PI=3.1415;
3. 数据类型:
数据类型定义了数据的性质、表示和存储空间的结构。C#的数据类型分为值类型和引用类型。值类型用来存储实际的值,表示该数据类型存储的是一个数值;引用类型用来存储对实际数据的引用,即表示该数据类型不是直接存储数据值而是指向它所引用的值的地址。
1)值类型:
C#的值类型分为三种,简单类型、结构类型struct和枚举类型enum。见下表:
简单类型 | 有符号整数:sbyte、short、int、long |
---|---|
无符号整数:byte、ushort、uint、ulong | |
Unicode字符:char | |
IEEE浮点数:float、double | |
十进制数:decimal | |
布尔值:bool | |
枚举类型Enum | enum E{...} |
结构类型Struct | struct S{...} |
C#中有8种整数类型,包括4种有符号类型和4种无符号类型,在内存中占用的位数及取值范围见下表:
有符号整数 | sbyte | 8bit | -128~127 |
---|---|---|---|
short | 16bit | -32768~32767 | |
int | 32bit | -2147483648~2147483647 | |
long | 64bit | -9223372036854775808~9223372036854775807 | |
无符号整数 | byte | 8bit | 0~255 |
ushort | 16bit | 0~65535 | |
uint | 32bit | 0~4294967295 | |
ulong | 64bit | 0~18446744073709551615 |
C#中浮点类型包含单精度浮点型float和双精度浮点型double,精度为小数位数,差别在于取值范围和精度不同。计算机中浮点数取值范围见下表:
单精度浮点型 | float | 32bit | 1.5×10-45~3.4×1038,7位精度 |
---|---|---|---|
双精度浮点型 | double | 64bit | 5.0×10-324~1.7×10308,15位精度 |
float f1=2.3f;
⑶ 十进制类型:
十进制类型decimal主要用于金融和货币方面的计算,精度是位数而不是小数位,使用decimal可以避免浮点计算误差。对十进制类型的数据,使用后缀m,如0.1m、123.6m等。如果省略了m,数据将被C#编译器当作双精度浮点型处理。十进制类型在计算机中取值范围见下表:
十进制类型 | decimal | 128bit | 1.0×10-28~7.9×1028,29位精度 |
---|
布尔类型表示现实中的真和假,主要用来进行逻辑判断,C#中采用true和false来表示。
⑸ 字符类型:
字符类型用来表示单个字符,包括数字字符、英文字母、表达符号、中文等。C#提供的字符类型采用unicode标准字符集,一个unicode标准字符长度为16bit,以双字节编码表示任意符号。
C#的字符类型必须是单引号括起来的单个字符,如’A’、’O’等。赋值示例:
char s=’A’;
使用char关键字只能定义一个unicode字符。Unicode字符是目前计算机上通用的字符编码,它针对不同语言的字符设定了统一的二进制编码,用于跨语言、跨平台的文本转换和处理要求。
C#中还有一种特殊的字符常量,是以反斜线开头的字符序列,称为转义字符。转义字符具有特定的含义,不使用原有的意义,故称转义。见下表:
\n | \t | \” | \’ | \b | \r | \f | \\ |
回车换行 | 横向跳到下一个制表位置 | 双引号 | 单引号 | 退格 | 回车 | 换页 | 反斜线 |
当在程序设计中需要一些可以用有限个常量来表示的变量时,如星期、月份等,可以用枚举类型来定义。枚举类型将变量所能赋的值一一列举出来,给出一个具体的范围,用关键字enum来声明。示例:
enum season {Sping,Summer,Autumn,Winter};
为枚举类型的变量所赋值的数据类型限于long、int、short、byte等整数类型。枚举类型定义中的整型常数可以省略,如果省略,则枚举常量的值依次为0、1、2、...、n-1,依次递增。上例中,Spring对应整数0,Summer对应整数1,Autumn对应整数2,Winter对应整数3。
定义了枚举类型变量后,可以给枚举类型变量赋值,但只能为枚举类型变量赋值枚举常量,或把相应的整数强制转换为枚举类型再赋值。示例:
enum season {Sping,Summer,Autumn,Winter};
Season currentSeason=Senson.Winter;
currentSeason=(Senson)2;
⑺ 结构类型:
结构体是一种复合数据类型,允许由其他数据类型构成,一个结构体类型变量内的所有数据可以作为一个整体进行处理。示例:
struct Cube
{
public int length;
public int width;
public int height;
};
Cube cb1;
上面代码中,cb1是一个名为Cube的结构类型变量。
结构体成员的引用通过“.”运算符进行。示例:
cb1.length=15;
2)引用类型:
在内存中不直接存储引用类型的数据,而是存储该数据的地址,由此可以索引到所需的数据。由于引用类型仅仅存储数据的索引,所以两个引用类型可能同时指向一个数据,修改任何一个引用类型都会改变该数据。
引用类型包括类class、接口interface、数组array、字符串string、委托delegate等。
3)隐含类型:
C#是一种强类型语言,以前的版本,在声明变量的同时,必须显式指出变量的类型,否则会出现编译错误。从C# 3.0开始,可以不具体说明变量的类型,而是声明为var类型。用var来声明任何类型的局部变量时,只告诉编译器该变量需要初始化表达来推断变量的类型,并且只能是局部变量。示例:
var i=2;
var h=23.56;
var name="Good";
var numbers=new int[]{1,2,3};
C#在编译时,根据var变量的初始值来确定其类型,因此有一定的约束规则:声明者必须包含一个构造者,构造者必须是一个表达式,不能是一个对象或者构造者集合的自身,但是可以是一个新的包含一个对象或者构造者集合的表达式;在编译时,构造者表达式的类型不能为null类型;如果本地变量声明包含多个声明者,那么构造者必须具有相同的编译时类型。
也就是说,使用var声明局部变量时一定要赋值;使用var声明局部变量后,仍然是强类型,不能进行类型转换;关键字var只能在本地范围内使用,声明的变量仅限于局部变量。
4. 类型转换:
在表达式中,当混合使用不同类型的数据时,需要对数据类型进行转换。C#中的数据类型转换分为自动类型转换和强制类型转换。
1)自动类型转换:
在运算时,C#会对数据类型自动进行转换。自动类型转换是系统默认的,不需要任何声明就可以进行,由编译器根据不同类型数据间的转换规则自动完成,又称隐式类型转换。
自动类型转换遵循由低级类型向高级类型转换,结果为高级类型的原则,从而保证计算精度。
从 | 到 |
---|---|
sbyte | short、int、long、float、double、decimal |
byte | short、ushort、int、uint、long、ulong、float、double、decimal |
short | int、long、float、double、decimal |
ushort | int、uint、long、ulong、float、double、decimal |
int | long、float、double、decimal |
uint | long、ulong、float、double、decimal |
long | float、double、decimal |
ulong | float、double、decimal |
char | ushort、int、uint、long、ulong、float、double、decimal |
float | double |
2)强制类型转换:
强制类型转换就是强制执行从一种数据类型到另一种数据类型的转换,也称显式类型转换,一般使用强制类型转换符来实现。C#提供了一个类型转换运算符,用于对数据类型进行强制转换。类型转换运算符用圆括号()表示。示例:
int i;
float j=4.5f;
i=(int)j;
类型转换运算符在对变量进行强制转换时,仅对变量值的类型进行转换,而不会转换变量本身的类型。
从 | 到 |
---|---|
sbyte | byte、ushort、uint、ulong、char |
byte | sbyte、char |
short | sbyte、byte、ushort、uint、ulong、char |
ushort | sbyte、byte、short、char |
int | sbyte、byte、short、ushort、uint、ulong、char |
uint | sbyte、byte、short、ushort、int、char |
long | sbyte、byte、short、ushort、int、uint、ulong、char |
ulong | sbyte、byte、short、ushort、int、uint、ulong、char |
char | sbyte、byte、short |
float | sbyte、byte、short、ushort、int、uint、long、ulong、char、decimal |
double | sbyte、byte、short、ushort、int、uint、long、ulong、char、float、decimal |
decimal | sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double |
System.Convert类位于System命名空间,为数据类型转换提供了一整套方法,可以将一个基本数据类型转换为另一个基本数据类型。常用方法:
Equals | 确定两个Object实例是否相等 |
GetTypeCode | 返回指定对象的数据类型 |
IsDBNull | 指定对象是否为DBNull类型 |
ToBoolean | 将指定的值转换为等效的布尔值 |
ToByte | 将指定的值转换为8位无符号整数 |
ToChar | 将指定的值转换为Unicode字符 |
ToDateTime | 将指定的值转换为DateTime |
ToDecimal | 将指定的值转换为Decimal数字 |
ToDouble | 将指定的值转换为双精度浮点型数字 |
ToInt16 | 将指定的值转换为16位有符号整数 |
ToInt32 | 将指定的值转换为32位有符号整数 |
ToInt64 | 将指定的值转换为64位有符号整数 |
ToSByte | 将指定的值转换为8位有符号整数 |
ToSingle | 将指定的值转换为单精度浮点型数字 |
ToString | 将指定的值转换为String表示形式 |
ToUInt16 | 将指定的值转换为16位无符号整数 |
ToUInt32 | 将指定的值转换为32位无符号整数 |
ToUInt64 | 将指定的值转换为64位无符号整数 |
char c='A';
int a=Convert.ToInt16(c);
string s="12.43";
float f=Convert.ToSingle(s);
5. 字符串:
Char类型只能表示单个字符。C#中,字符串作为对象来处理,可以通过string类型来创建字符串对象。示例:
string s="Hello";
在C#中,字符串必须包含在一对双引号之内,输出时双引号内的内容原样输出。可以使用“+”运算符完成多个字符串的连接,也可以实现字符串常量和变量的连接。String对象与基本数据类型的数据可以进行“+”运算,运算结果为一个string类型的对象,即字符串。
1)字符串比较:
比较字符串并非比较字符串的长度,而是比较字符串在英文字典中的位置。
最常见的比较字符串的方法有Compare、CompareTo、Equals等,这些方法都属于string类。除此之外,还可以使用比较运算符“=”。
⑴ Compare方法:
Compare方法用来比较两个字符串是否相等,有多个重载方法,最常用的两个方法为:
int Compare(string strA,string strB)
int Compare(string strA,string strB,bool ignoreCase)
其中,strA和strB代表要比较的两个字符串;ignoreCase是一个布尔类型参数,如果为true,比较时会忽略大小写的差别。Compare是静态方法,使用时可以直接引用。
如果两字符串相等,返回0;strA的值大于strB,返回1;否则返回-1。
⑵ CompareTo方法:
与Compare方法类似,但是以实例对象与指定字符串比较,语法为:
int CompareTo(string strB)
对字符串strA和字符串strB进行比较使用:
strA.CompareTo(strB)
返回值含义与Compare相同。
⑶ Equals方法:
Equals方法主要用于比较字符串是否相同,如果相同返回true,否则为false。两种语法:
bool Equals(string value)
static bool Equals(string strA,string strB)
使用时使用:
strA.Equals(strB)
string.Equals(strA,strB)
2)操作字符串:
⑴ 截取字串:
String类提供了SubString方法,可以截取字符串中指定位置和指定长度的子字符串。语法:
public string SubString(int startIndex,int length)
其中,startIndex为子字符串在原始字符串的起始位置索引;length为子字符串长度。
⑵ 插入字符串:
String类提供了一个Insert方法,用于向字符串的任意位置插入新的字符串。语法格式:
public string Insert(int startIndex,string value)
其中,startIndex为指定要插入的位置;value为指定要插入的字符串。
⑶ 删除字符串:
String类提供了一个Remove方法,用于从一个字符串的指定位置开始,删除指定数量的字符。语法格式:
public string Remove(int startIndex)
public string Remove(int startIndex,int count)
其中,startIndex为指定开始删除的位置;count为要删除字符串的长度。前面一种格式是删除字符串中从指定位置到最后位置的所有字符,后一种格式是从字符串中的指定位置开始删除指定数目的字符。
⑷ 替换字符串:
String类提供了一个Replace方法,用于将字符串中的某个字符串替换为其他字符串。语法格式:
public string Replace(int oldvalue,string newvalue)
其中,oldvalue为待替换的字符串,newvalue为替换的新字符串。
3)StringBuilder类与String类:
创建成功的String对象的长度是固定的,内容不能被改变。每次使用String类中的方法时,都会在内存中创建一个新的字符串对象,需要为该新对象分配新的空间。如果只修改字符串而不创建新的对象,可以使用StringBuilder类。
6. 运算符:
运算符又称操作符,是数据进行运算的符号。表达式就是按照一定规则,将运算对象用运算符连接起来的算式。运算对象可以是常量、变量、函数,也可以是其他表达式。在构成表达式时,运算符具有不同的优先级,还有不同的结合方式。
C#运算符可分为赋值运算符、算术运算符、逻辑运算符、关系运算符、位运算符、指针运算符、取成员运算符等,也可按照运算对象个数分为一元运算符、二元运算符和三元运算符。因为C#的运算符绝大多数与C语言等编程语言类似,故只作简单陈述。
1)运算符的优先级:
优先级决定不同级别的运算符参与运算时的运算顺序,结合方式决定运算时的方向和相同优先级的运算符在运算时的先后次序。当一个表达式包含多个运算符时,编译器就会根据默认的运算符优先级来控制各个运算符求值的顺序。C#运算符按从高到低的优先级排列见下表:
初级运算符 | x.y, f(x), a[x], x++, x--, new, typeof, checked, unchecked |
一元运算符 | !, ~, ++, --, (T)x |
乘法、除法、取模运算符 | *, /, % |
增量运算符 | +, - |
移位运算符 | <<, >> |
关系运算符 | <, >, <=, >=, is, as |
等式运算符 | ==, != |
逻辑与运算符 | & |
逻辑异或运算符 | ^ |
逻辑或运算符 | | |
条件与运算符 | && |
条件或运算符 | || |
条件运算符 | ?: |
赋值运算符 | =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |= |
在复杂的表达式中,用圆括号括住的部分要优先运算,其优先级高于任何运算符。如果无法确定表达式中运算符的优先顺序,可以增加圆括号来明确求值的顺序,使表达式更具可读性。
2)算术运算符:
算术运算符包括加+、减-、乘*、除/、求余%双目运算符和自增++、自减--单目运算符,用于实现数值运算,运算结果也是数值型。除法运算符“/”,当参与运算的两个操作数均为整数时,计算结果为商的整数部分。运算符“%”用来求余,C#中的求余运算既适用于整数类型,又适用于浮点数类型,运算结果为两个操作数相除的余数。
单目运算符自增++和自减--的作用是以一种紧凑格式使变量的值增1或减1,这两种运算符都有前置和后置两种形式,结合性是自右到左。前置表示变量值加/减1,然后返回变量的新值;后置表示变量值加/减1,然后返回之前的旧值。运算符+和-也可以作为单目运算符,表示符号的运算。
3)赋值运算符:
除了简单的赋值运算符“=”外,C#还提供了多个复合赋值运算符,是将一个其他运算符加上简单赋值运算符组成,包括+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=,含义是将左操作数和右操作数按该运算符进行运算,再将结果的值赋给左操作数。
4)关系运算符:
用于比较两个操作数的大小,包括>、<、>=、<=、==、!=,比较结果是一个布尔类型的值。
5)位运算符:
位运算符是对操作数按其二进制形式逐位进行运算,包括按位与&、按位或|、按位异或^、按位求反~、按位左移<<、按位右移>>,参加运算的操作数必须为整型或者是可以转换为整型的类型。为逻辑运算能够方便地设置或屏蔽内存中某个字节的一位或几位,也可以对两个数按位相加,移位运算则可对内存中某个二进制数左移或右移几位。
6)逻辑运算符:
用于将多个关系表达式或逻辑量组成一个逻辑表达式,包括逻辑与&&、逻辑或||、逻辑非!,结果是一个布尔值。
7)typeof:
返回其参数的System.Type对象。使用Type t=typeof(A),那么对象t分别调用GetFields()和GetMethods()方法就可以获取到类A的所有公有字段与方法。
8)三目条件运算符:
由?和:两个符号组成,3个操作数都是表达式。语法:
<exp1>?<exp2>:<exp3>
其中,表达式exp1是可以产生真假结果的表达式,如果表达式1的值为true,则执行表达式2,条件表达式的运算结果为表达式2的值;否则执行表达式3,运算结果为表达式3的值。三目条件运算符的结合性为由右到左。
9)运算符的重载:
C#的运算符重载只能用于结构或类,通常使用关键字operator后加运算符,一般是对算术运算符、关系运算符进行重载。赋值运算符不能重载。示例:
struct point
{
public int x;
public int y;
public static point operator+(point p1, point p2)
{
point p;
p.x=p1.x+p2.x;
p.y=p1.y+p2.y;
return p;
}
}
上述代码中定义了结构struct point的加运算方法,使用了对算术运算符+的重载。以后对结构体类型point的+运算,就会使用代码中的方法。
五、流程控制语句:
程序有三种基本结构,分别为顺序结构、分支结构和循环结构。顺序结构是指程序按语句顺序执行,不发生转移的程序结构;分支结构体现了程序的判断能力,即在程序中能根据某些条件是否成立,从若干条语句或语句组中选择一条或一组来执行;程序段需要重复执行若干次的结构称为循环结构。因为C#的流程控制语句绝大多数与C语言等编程语言类似,故只作简单陈述。
1. if语句:
If是最常用的条件语句,在条件成立时执行一些指定的操作,而在条件不成立时执行另外一些操作。If语句有三种形式,if、if...else...、if...else if...,分别实现单分支、双分支和多分支结构。If语句可以嵌套,即if语句中又包含一个或多个if语句。
2. switch语句:
C#中要实现多分支结构,也可以使用switch语句。switch中的表达式只能为整数类型、字符类型或枚举类型;每个case后面的常量表达式的值必须互不相同,从而保证分支选择的唯一性;case后面可以有多个语句,程序顺序执行,也可以没有任何语句;default语句总数放在最后面,也可以缺省。
任何switch语句均可用if条件语句来实现,但并不是任何if条件语句均可用switch语句来实现,这是由于switch语句限定了表达式的取值类型,而且switch语句只能做值是否相等的判断,不能在case语句中使用条件。
3. while语句:
while语句实现当型循环,该类循环先测试循环条件再执行循环体。
while(循环条件表达式)
{
语句块;
}
循环条件表达式一般为关系表达式或逻辑表达式,必须使用圆括号括起来;循环体可以是单个语句或复合语句,复合语句要用大括号括起来;通常进入循环时,括号内表达式的值为true,但循环最终要退出,因此循环体中应有使循环趋于结束的语句,即能使表达式的值由true变为false,否则会形成死循环;由于是先判断后执行,也有可能循环体一次也不执行。
4. do...while语句:
do
{
语句块;
}
while(循环条件表达式);
这个循环先执行循环体再测试循环条件,因此循环体至少执行一次。
5. for语句:
for语句将循环变量初始化、循环条件以及循环变量的改变放在同一行语句中。在循环次数已知情况下,用for语句实现循环比较容易,也称计数循环语句。格式:
for(exp1;exp2;exp3)
{
......
}
其中,exp1称为循环初始化表达式,为循环变量赋初值;exp2称为循环条件表达式,通常为关系表达式或逻辑表达式,为循环结束条件;exp3称为循环变量表达式,通常为赋值表达式,用于改变循环变量的值。循环体可以是单个语句,或复合语句。
6. foreach语句:
是对集合或数组元素访问的只读循环,不能修改元素,也不知元素索引。格式:
foreach(迭代类型 迭代变量名 in 集合)
{
语句块;
}
foreach循环每次从集合中访问一个元素,全部访问结束就退出循环。
7. break和continue语句:
在循环过程中,若希望循环强制结束,可使用break语句;若希望本次循环结束并开始下一次循环,可使用continue语句。