导图社区 CSharp
CSharp,如using 关键字,用于引入命名空间,一个程序可以引入多个命名空间,一起来学习吧。
编辑于2023-06-08 10:17:27 四川省C#
基本程序语法
using
关键字,用于引入命名空间,一个程序可以引入多个命名空间
class
关键字,类,用于声明一个类
基类
array类
namespace
关键字,命名空间,用于声明一个空间名称
成员变量
类中声明的要使用到的变量
成员函数
也称成员方法,类中声明的函数
标识符
用来对类,变量,函数或其它自定义内容命名
只能以大写或小写字母开头
除_外,不能使用其它特殊字符或空格
不能使用关键字
关键字
保留关键字
this
使用 this 表示当前类的对象
使用 this 关键字串联构造函数
使用 this 关键字作为类的索引器
使用 this 关键字作为原始类型的扩展方法
static:静态成员
注意:索引器和析构函数不能是静态的。
static 关键字声明属于类型本身而不是属于特定对象的静态成员,因此不需要使用对象来访问静态成员。在类、接口和结构体中可以使用 static 关键字修饰变量、函数、构造函数、类、属性、运算符和事件。
若在定义某个成员时使用 static 关键字,则表示该类仅存在此成员的一个实例,也就是说当我们将一个类的成员声明为静态成员时,无论创建多少个该类的对象,静态成员只会被创建一次,这个静态成员会被所有对象共享。
静态属性
使用 static 定义的成员属性称为“静态属性”,静态属性可以直接通过类名.属性名的形式直接访问,不需要事先创建类的实例。静态属性不仅可以使用成员函数来初始化,还可以直接在类外进行初始化。
静态函数
除了可以定义静态属性外,static 关键字还可以用来定义成员函数,使用 static 定义的成员函数称为“静态函数”,静态函数只能访问静态属性。
上下文关键字
当需要强制使用关键字时,关键字前加@符号,如@if
常量
定义:与变量相对,不同的是常量在编译防阶段已经确定
定义常量的语法格式
const data_type constant_name = value;
data_type 为常量的数据类型;constant_name 为常量名(类似于变量名);value 为常量的值。
整型常量
前缀
0x或0X表示十六进制,0表示八进制,没有前缀则表示十进制
后缀
U 和 L 分别表示 unsigned 和 long。后缀既可以大写也可以小写,而且可以以任意顺序进行组合,但是不能重复。
浮点常量
字符常量
字符串常量
数据类型
数据类型分类
值类型(value types)
nullable
可空类型
意味着当前变量可存储原本类型的值外,也可以存储null值
语法格式
data_type? variable_name = null;
data_type 为要声明的数据类型,后面紧跟一个?;variable_name 则为变量的名称
枚举类型
解释
枚举类型(也可以称为“枚举器”)由一组具有独立标识符(名称)的整数类型常量构成
声明
enum enum_name{ enumeration list; }
num_name 为枚举类型变量的名称;enumeration list 为枚举类型中的成员列表,其中包含若干使用逗号分隔的标识符,每个标识符都代表了一个整数值。默认情况下枚举类型中成员的默认值是从 0 开始的,然后逐一递增
在 C# 中枚举类型不仅可以在类或结构体的内部声明,也可以在类或结构体的外部声明
默认情况下,枚举类型中的每个成员都为 int 类型,它们的值从零开始,并按定义顺序依次递增。但是我们也可以显式的为每个枚举类型的成员赋值
结构体
定义
结构体中不仅可定义属性也可以定义函数
结构体函数
引用类型(reference types)
引用类型的变量存储的数据是对象在内存中的位置
对象类型(object)
对象类型是 C# 通用类型系统(Common Type System:CTS)中所有数据类型的最终基类,Object 是 System.Object 类的别名。
任何类型的值都可以分配给对象类型,但是在分配值之前,需要对类型进行转换。
动态类型(dynamic)
可以在动态类型的变量中存储任何类型的值,这些变量的类型检查是在程序运行时进行的
声明语法
dynamic <variable_name> = value;
动态类型与对象类型类似,但对象类型变量的类型检查是在编译时进行的,而动态类型变量的类型检查则是在程序运行时进行的。
字符串类型(string)
字符串类型的变量允许将一个字符串赋值给这个变量,字符串类型需要通过 String 类来创建,String 类是 System.String 类的别名,它是从对象(Object)类型中派生的。在 C# 中有两种定义字符串类型的方式,分别是使用" "和@" "。
声明语法
使用引号的声明方式 String str = "http://c.biancheng.net/";
使用 @ 加引号的声明形式 @"http://c.biancheng.net/";
使用@" "形式声明的字符串称为“逐字字符串”,逐字字符串会将转义字符\当作普通字符对待,例如string str = @"C:\Windows";等价于string str = "C:\\Windows";
在@" "形式声明的字符串中可以任意使用换行,换行符及缩进空格等都会计算在字符串的长度之中。
创建方式
为 String 类型的变量赋值一个字符串;
使用 String 类的构造函数;
使用字符串串联运算符+;
通过检索属性或调用返回字符串的方法;
通过调用格式化方法将值或对象转换为其字符串表示形式。
属性
.Length
获取当前 String 对象中的字符数
.[i]
方法
.Trim()
返回一个从当前字符串删除了所有前导匹配项和尾随匹配项的新字符串
.touppr()
返回一个将当前字符串转换为大写形式的字符串
.tolower()
返回一个将当前字符串转换为小写形式的字符串
.Split()
Split 用于将带分隔符的字符串拆分为子字符串
数组
一维数组
声明语法
data_type[] array_name;
data_type 用来指定数组中元素的类型; [ ]用来指定数组的维度; array_name 为数组的名称
初始化(两种)
int[] array1 // 声明一个整型数组 array1 = new int[10] // 初始化数组 array1
int[] array1 = new int[10] // 初始化一个长度为 10 的整型数组
double[] arr1 = new double[]{96.5, 98.0, 99.5, 90.0};//数组长度省略与否均可
因为数组是引用类型的,所以您需要使用 new 关键字来对数组进行初始化
数组
也可以像变量一样,使用一个数组为另一个数组赋值
多维数组
声明语法
int[,] arr=new int[3,3]; // 声明一个二维数组 int[,,] arr=new int[3,3,3]; // 声明一个三维数组
初始化
// 第一种方式 int[,] arr = new int[3,4]{ {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };
// 第二种方式 int[,] arr = new int[,]{ {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };
// 第三种方式 int[,] arr = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };
交错数组
就是元素为数组的数组,其中作为元素的数组也可以是多维数组
声明语法
data_type[][] array_name;
第一个[]为外层维度,为一维,第二个[]为作为元素的数组的维度,可以多维
初始化
int[][] jaggedArray = new int[3][]; // 定义一个交错数组 jaggedArray[0] = new int[5]; // 对数组的第一个元素初始化 jaggedArray[1] = new int[4]; // 对数组的第二个元素初始化 jaggedArray[2] = new int[2]; // 对数组的第三个元素初始化
nt[][] jaggedArray = new int[3][]; // 定义一个交错数组 jaggedArray[0] = new int[] {1, 2, 3, 4, 5}; jaggedArray[1] = new int[] {6, 7, 8, 9}; jaggedArray[2] = new int[] {10, 11};
int[][] jaggedArray = new int[][]{ new int[] {1, 2, 3, 4, 5}, new int[] {6, 7, 8, 9}, new int[] {10, 11} };
int[][] jaggedArray = { new int[] {1, 2, 3, 4, 5}, new int[] {6, 7, 8, 9}, new int[] {10, 11} };
不能从元素初始化中省略 new 运算符,因为不存在元素的默认初始化。
类
委托
指针类型(point types)
数据类型转换
分类
隐形转换
转换过程不会导致数据丢失的转换叫做隐式转换,如int转double
如: int a; double b-a;
显形转换
可能造成数据丢失的转换,如double转int
使用的格式为:(type)value
使用内置的类型转换方法:
变量
变量声明
变量声明语法格式
data_type variable_list;
data_type为数据类型
variable_list为变量名称(标识符),可包含一个或多个变量名称,多个变量名称时,名称之间用,号隔开。
变量声明时的初始化的语法格式
data_type variable_list = value;
函数/方法
函数声明
语法格式
Access_Specifier Return_Type FunctionName(Parameter List) { Function_Body Return_Statement }
说明
Access_Specifier 为访问权限修饰符(可选)
Return_Type 为返回值类型
FunctionName 为函数名称
Parameter List 为参数列表(可选)(也可称形参,与之相对的有实参)
Function_Body 为函数主体
Return_Statement 为返回语句,用来返回数据(可选),在Return以后不可再写语句,写了也不会执行。
根据语法格式中要素的可选情况存在的函数种类
没有参数和返回值的函数
有参数但没有返回值的函数
有参数且有返回值的函数
参数数组
语法格式
访问权限修饰符 返回值类型 函数名(params 类型名称[] 数组名称)
函数名(参数1, 参数2, ..., 参数n)
当参数有多个参数时,参数数组仅放在参数表的最后位置
当需要将数组类型作为参数传递时,参数数组是一种方式,另一种为数组参数,在函数调用时数组参数需要数组声明,参数数组则可以无需数组声明。数组参数与参数数组两者的调用方式共同补全了一个类型应该支持的所用调用方式。
函数调用
调用方式
将函数所在的类实例化为对象
通过对象.函数名() 的形式即可调用指定的函数
概要
调用时实参与形参的数量与数据类型应该一致
函数没有形参在调用时也没实参
使用类型相同的变量接收函数调用时的返回值
C# 中的静态函数指的是,在一个类中使用 static 修饰的函数,调用静态函数比调用普通函数要简单很多,只需要函数名即可
函数调用时的参数传递(实参赋值形参的过程)
值传递
实参与形参使用两个不同的内存位置,传递过程为复制实参的值赋于形参,实参是安全的
引用传递
是对实参的内存位置的引用,可以导致实参的值被修改,使用关键字ref表示
输出传递
仅将数据从函数中传出去,使用关键字out
递归函数
为防止溢栈,函数内应该当写入条件判断,适时退出递归执行
构造函数
构造函数就是与类(或结构体)具有相同名称的成员函数,并且没有返回值
不需要我们主动调用,当创建一个类的对象时会自动调用类中的构造函数。
在程序开发的过程中,我们通常使用类中的构造函数来初始化类中的成员属性。
在类中必须存在构造函数,即使没有人为创建构造函数,系统也会提供一个无参的构造函数。
当创建了多个形参不同的构造函数,调用时遵守函数的重载规则。
当构造函数的形参与更高级作用域变量同名,高级作用域变量采用this.name的方式书写。
分类
实例构造函数
静态构造函数
特性
静态构造函数不使用访问权限修饰符修饰或不具有参数;
类或结构体中只能具有一个静态构造函数;
静态构造函数不能继承或重载;
静态构造函数不能直接调用,仅可以由公共语言运行时 (CLR) 调用;
用户无法控制程序中静态构造函数的执行时间;
在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数以初始化类;
静态构造函数会在实例构造函数之前运行。
私有构造函数
忻构函数
析构函数(也被称作“终结器”)同样是类中的一个特殊成员函数,主要用于在垃圾回收器回收类实例时执行一些必要的清理操作。
面向对象语言三大特性
封装
封装是将一个或多个成员(变量,函数,常量)集合到一个单元内,这个单元即为类
类中成员的范围和可见性需要访问权限修饰符来设定,访问权限修饰符有
public
所修饰的成员可以从类的外部访问
private
所修饰的成员只能在同一类内被访问
protected
internal
所修饰的成员可以在同一命名空间内被访问
protected internal
继承
在创建一个新类时,我们可以使用这个新定义的类继承一个已有的类,通过继承可以在创建新类时重用、扩展和修改被继承类中定义的成员。被继承的类称为“基类(父类)”,继承基类的类称为“派生类(子类)”。
需要注意的是,C# 中只支持单继承,也就是说一个派生类只能继承一个基类,但是继承是可以传递的,例如 ClassC 继承了 ClassB,而 ClassB 继承了 ClassA,那么 ClassC 将继承 ClassB 和 ClassA 中的所有成员。
基类和派生类
基本格式
class 派生类 : 基类{ ... ... }
多重继承
多重继承则是指一个类可以同时继承多个基类,C# 并不支持多重继承,但是可以借助接口来实现多重继承。
函数重载
在同一个作用域中,可以定义多个同名的函数,但是这些函数彼此之间必须有所差异,比如参数个数不同或参数类型不同等等,返回值类型不同除外。
运算符重载
多态
编译时多态:通过 C# 中的方法重载和运算符重载来实现编译时多态,也称为静态绑定或早期绑定;
运行时多态:通过方法重载实现的运行时多态,也称为动态绑定或后期绑定。
属性
注释
//,单选注释
/* */,多行注释,/*在开头,*/在结尾
快捷键:生成注释Ctrl+k Ctrl+c,取消注释 Ctrl+v
转义字符 \
\n为换行符
\t为制表符
运算符
算术运算符
关系运算符
逻辑运算符
位运算符
赋值运算符
其它运算行
VS操作
快捷键
自动缩进
CTRL+K,CTRL+F
注释
生成注释Ctrl+k Ctrl+c,取消注释 Ctrl+v
断点
F9
子主题