数据类型

整数类型

类型 范围
sbyte 8位有符号整数
short 16位有符号整数
int 32位有符号整数
long 64位有符号整数
byte 8位无符号整数
ushort 16位无符号整数
uint 32位无符号整数
ulong 64位无符号整数

浮点类型

类型 范围
float 精确到6~9位数
double 精确到15~17位数
decimal 精确到28~29位数

一般情况包含小数点的数值会被默认为double类型,在数值后面添上f或F 可以强制类型转化为float

在c#中布尔类型的值只能是true和false(和java类似),不能将其他值指定给布尔类型变量,也不能将它转化为其他类型,如下面这个语句就是错误的

  • bool x = 520;

枚举类型

1
2
3
4
5
enum{
枚举值的标识名称 = 对应的整数数值,
...
枚举值的标识名称 = 对应的整数数值
}

强制类型转化

这个和java基本类似,(强制转换类型)对象

运算符

  • “按位与”运算 &
  • “按位或”运算 |
  • “按位取反”运算 ~
  • “按位异或”运算 ^
  • “移位操作” >> << 用来进行2的乘除运算挺好用的
  • is 运算符 判断变量是否为指定类型
  • 条件运算符 (条件式?成立执行:不成立执行) 这个还是很好用的
  • typeof 运算符 获取对象类型

Char类 字符

常用方法及其说明

方法 说明
IsControl() Unicode字符是否为控制字符类别
IsDigit() Unicode字符是否为十进制数字类别
IsHighSurrogate() 指定的 Char 对象是否为高代理项
IsLetter() 指定的 Unicode 字符是否属于字母类别
IsLetterOrDigit() 指定的 Unicode 字符是属于字母类别还是属于十进制数字类别
IsLower() 指定的 Unicode 字符是否属于小写字母类别
IsLowSurrogate() 指定的 Char 对象是否为低代理项
IsNumber() 指定的 Unicode 字符是否属于数字类别
IsPunctuation() 指定的 Unicode 字符是否属于标点符号
IsSeparator() 指定的 Unicode 字符是否属于分隔符类别
IsSurrogate() 指定的 Unicode 字符是否属于代理项字符类别
IsSurrogatePair() 两个指定的 Char 对象是否形成代理项对
IsSymbol() 指定的 Unicode 字符是否属于符号字符类别
IsUpper() 指定的 Unicode 字符是否属于大写字母类别
IsWhiteSpace() 指定的 Unicode 字符是否属于空白类别
Parse() 将指定字符串的值转换为它的等效 Unicode 字符
ToLower() 将 Unicode 字符的值转换为它的小写等效项
ToUpper() 将 Unicode 字符的值转换为它的大写等效项
ToLowerInvariant() 使用固定区域性的大小写规则,将 Unicode 字符的值转换为其小写等效项
ToString() 将此实例的值转换为等效的字符串表示
ToUpperInvariant() 使用固定区域性的大小写规则,将 Unicode 字符的值转换为其大写等效项
TryParse() 将指定字符串的值转换为它的等效 Unicode 字符

转义字符

转义字符 作用
\n 回车换行
\t 横向跳到下一制表位
\b 退格
\r 按回车建
\f 换页

String 类 字符串

使用 == 可以判断两个字符串是否完全一致。是否相同,不是是否相等

这个和java是完全不一样的,在java中要使用equals(),当然在C#中也可以使用这个函数去判断是否相同

Compare(String A,String B,bool ignorCase) 比大小

比较两个字符串的大小,若A>B,return 1;反之 return -1,二者相等,return 0。ignorCase 表示比较时是否忽略大小写

CompareTo(String B) 比大小

和上面差不多

Format() 格式化输出

  • Format(String format,object obj);
格式符(大小写都可以) 名称
c 货币
d 整型
e 科学计数法
f 定点
n 数字
p 百分比
x 十六进制
  • 日期控制
格式符(注意大小写) 说明
d YYYY-MM-DD
D YYYY年MM月dd日
t hh:mm
T hh:mm:ss
f YYYY-MM-DD hh:mm
F YYYY年MM月dd日 hh:mm:ss
g YYYY-MM-DD hh:mm (可排序)
G YYYY-MM-DD hh:mm:ss (可排序)
M或m MM月dd日
Y或y YYYY年MM月

Substring(int start,int length) 截取字符串

若 length大于字符串本身的长度,则从start的位置开始截取全部

Split(params char[] a ) 分割字符串

用过py的应该都知道

Insert(int start,String value) 插入字符串

指定位置插入字符串

PadLeft(int totalWidth,char paddingChar) 左侧填充字符串

左侧填充字符串到你指定的长度,但是切记这个长度是总长度。
将 Left -> Right 就是右侧

Remove(int start,int count) 删除指定位置字符串

count可以不写,不写默认在指定位置后全删
count > 0

Copy(String str) 复制字符串

a = String.Copy(str);
将str复制给a

CopyTo(int start, char[]destination,int destinationIndex,int count)

举一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
static void Main(string[] args)
{
string str1 = "举一个栗子";
char[] str = new char[5];
str1.CopyTo(3, str, 0,2);
Console.WriteLine(str);
Console.ReadLine();
}
3 表示从str1的下标3开始复制
str 表示要复制给的对象
0 表示复制的值从char数组的0号位置开始
2 表示复制str1的长度为2

Replace(a,b) 替换字符

将 a -> b

StringBuilder 可变字符串类

要是学过java对这两个的区别就很熟悉了,都大差不差
当你需要频繁改变字符串时,stringBuilder的效率明显高于string,string是不可变长的。

正则表达式

  • 爬虫必学,十分好用

行定位符

  • ^ 表示行的开始, $ 表示行的结束

元字符

元字符 说明
. 匹配除了换行符以外的任意字符
\w 匹配字母,数字,下划线或者汉字
\s 匹配任意空白字符
\d 匹配数字
\b 匹配单词的开始或者结束

限定符

限定符 说明
? 匹配前面的字符零次或者一次
+ 匹配前面的字符一次或者多次
* 匹配前面的字符零次或者一次
{n} 匹配前面的字符n次
{n,} 匹配前面的字符最少 n次
{n,m} 匹配前面的字符最少 n次,最多 m次

如果想要匹配任意一个 汉字,可以使用[\u4e00-\u9fa5]
如果想要匹配连续多个 汉字,可以使用[\u4e00-\u9fa5]+

排除字符

  • ^ 也可以表示排除

如:[^a-zA-Z] 匹配非字母字符

举一个综合例子

  • 身份证号码匹配
1
2
3
(^\d{15}$)|(^\d{18}$)|(^\d{17})(\d|X|x)$

| 表示或,在正则表达式中可以使用逻辑符号

C#中使用正则表达式

名称 说明
IsMatch() 正则表达式是否找到匹配项
Match() 返回正则表达式查找对象
Matchs() 多次匹配
Replace() 按照正则表达式替换
Split() 按照正则表达式分割

数组

  • 一维数组的定义和java大差不差,关键在于二维数组的定义
  • type[,] name = new type[,]
  • type[][] name = new type[][] java用的这个
  • 初始化数组和java一样通过 " { } " 就可以完成初始化

遍历数组

1
2
3
4
foreach(type a in arrName){
Console.WriteLine(a);
}
这是特殊遍历方式,java的是-->foreach(type a : arrName)

ArrayList 类

  • 构造方法: ArrayList name = new ArrayList();
  • 和java一样的方法,大部分用法也类似
函数名 作用
add() 末尾添加元素
Instert(int index,object obj) 指定位置插入元素obj
Clear() 删除所有元素
Remove(Object obj) 移除obj
RemoveAt(int index) 指定位置移除元素
RemoveRange(int index,int count) 从index开始移除count个元素
Contains(Object obj) 查找obj

哈希表

  • 构造方法: Hashtable name = new Hashtable();
  • 和java一样的方法
函数名 作用
add(key,value) 添加键值对
Clear() 删除所有元素
Remove(key) 移除键值
Contains(Object key) 查找键值
ContainsValue(value) 查找特定值

遍历数组

1
2
3
4
foreach(DictionaryEntry a in HashtableName){
Console.WriteLine(a);
}
哈希表的特殊遍历

类与对象

  • 类的修饰符
修饰符 作用
new 仅在嵌套类声明时使用,表明类中隐藏了由基类继承而来、与基类成员同名的成员
public 不限制对该类的访问
protected 只能从其所在类和所在类的子类(派生类)进行访问
internal 同一程序集的任何代码都可以访问
private 只有其所在类才能访问
abstract 抽象类,不允许建立类的实例
sealed 密封类,不允许被继承
  • 类的基本操作和c++大同小异,其实和java也差不多,但是java一般不写析构函数。

访问器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
namespace hello
{
internal class Program
{
static void Main(string[] args)
{
student a = new student("小米", 1024);
Console.WriteLine(a.Id);

}

}
}
class student
{
private string name;
private int age;
public student(string name, int age)
{
this.name = name;
this.age = age;
}
public String Id
{
get { return name; }
set { name = value; }

}
}

其中的get和set就是访问器,一旦出现,必须成对出现

方法的参数类型

  1. params: 用来指定在参数数目可变时采取的方法参数,必须是一维数组。
  2. ref: 按引用方式传递参数。参数必须初始化。
  3. out: 关键字来定义输出参数,也是引用传递。但是不要求参数初始化。
    代码展示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
namespace hello
{
internal class Program
{
static void Main(string[] args)
{
string[] lists = new string[] { "1", "2", "3" };
print(lists);

}
static void print(params string[] lists)
{
foreach (string a in lists)
{
Console.WriteLine(a);
}

}
}
}
输出:
1
2
3

namespace hello
{
internal class Program
{
static void Main(string[] args)
{
int val = 0;
print(ref val);
Console.WriteLine(val);

}
public static void print(ref int i)
{
i = 44;
}
}
}
输出:44

namespace hello
{
internal class Program
{
static void Main(string[] args)
{
int val;
print(out val);
Console.WriteLine(val);

}
public static void print(out int i)
{
i = 44;
}
}
}
输出:44

类的继承

继承类时,需要使用冒号加类名。当对一个类应用sealed修饰符时,此修饰符会阻止其他类从该类继承

base 关键字

  • 当子类重写了父类的方法时,可以通过base调用原有父类方法。使用方法和this类似。

访问父类成员只能在构造函数、实例方法或者实例属性中进行,因此,从静态方法中使用base是错误的。

重写虚方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class people
{
public virtual void Say(String name)
{
Console.WriteLine(name);
}
}
class Chinese : people
{
public override void Say(String name)
{
base.Say(name + "讲中文捏");
}
}
class English : people
{
public override void Say(String name)
{
base.Say(name + "讲英文~( ̄▽ ̄)~*");
}
}
static void Main(string[] args)
{
Console.WriteLine("输入名字name:");
String name = Console.ReadLine();
people[] peoples = new people[2];
peoples[0] = new Chinese();
peoples[1] = new English();
for (int i = 0; i < peoples.Length; i++)
{
peoples[i].Say(name);
}
}

运行结果如下
输入名字name:
梨花
梨花讲中文捏
梨花讲英文~( ̄▽ ̄)~*

结构struct

  • 和c艹一模一样