第1章 初识C#及其开发环境
一. Visual Studio 2022
VS的快捷键总结
转载来自#Sunshine boy的VS快捷键大全(超详细)-CSDN博客
1、项目相关的快捷键
Ctrl+Shift+B=生成项目
Ctrl+Alt+L=显示Solution Explorer(解决方案资源管理器)
Shift+Alt+A=添加新项目到项目2、编辑相关的键盘快捷键
Ctrl+Enter=在当前行插入空行
Ctrl+Shift+Enter=在当前行下方插入空行
Alt+Shift+箭头键(←,↑,↓,→)=选择代码的自定义部分
Ctrl+}=找到对应的大括号、括号
Ctrl+Shift+}=在匹配的括号、括号内选择所有文本
Ctrl+Shift+S=保存所有文件和项目
Ctrl+K 然后 Ctrl+C=注释选定行
Ctrl+K,Ctrl+U=取消选定行的注释
Ctrl+K,Ctrl+D=正确对齐所有代码
Shift+End=从当前位置到当前行的尾选择整行
Shift+Home=从当前位置到当前行的头选择整行
Ctrl+Delete=删除光标右侧的所有字(遇到符号会停下来)
Ctrl+shift+u=小写字母转换成大写字母
Ctrl+u=大写字母转换成小写字母3.导航相关的键盘快捷键
Ctrl+Up/Down=滚动窗口但不移动光标
Ctr + -=让光标移动到它先前的位置
Ctrl++=让光标移动到下一个位置
F12=转到定义4、调试相关的键盘快捷键
Ctrl+Alt+P=附加到进程
F10=调试单步执行
F5=开始调试
Shift+F5=停止调试
Ctrl+Alt+Q=添加快捷匹配
F9=设置或删除断点5、搜索相关的键盘快捷键
Ctrl+K Ctrl+K=将当前行添加书签
Ctrl+K Ctrl+N=导航至下一个书签
Ctrl+.= 如果你键入一个类名如Collection,且命名空间导入不正确的话, 那么这个快捷方式组合将自动插入导入
Ctrl+Shift+F=在文件中查找
Shift+F12=查找所有引用
Ctrl+F=显示查找对话框
Ctrl+H=显示替换对话框
Ctrl+G=跳转到行号或行
Ctrl+Shift+F=查找所选条目在整个解决方案中的引用
第2章 C#程序基本结构
命名规范
类、方法 :单词首字母全大写, 如 UserInfo
形参、变量 :第一个单词首字母小写,后续单词首字母大写,如 fileName
私有变量 :在变量的基础上加个_,如 _privateVariable
接口前缀 : 在类的基础上加个I,如 Iinterface
第3章 变量与常量
一. 基本数据类型
1. 整型
2. 浮点型
//Decimal:128位,后缀为 m 或 M
decimal d = 1.11m;
3. 整型的进制转换(2、10、16)
二. 枚举型
枚举是一组 值类型,定义如下:
enum Week { Mon = 1, Tues = 2, Wedns = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 }
如果没对元素赋值,默认为上一个的值 + 1(第一个没赋值就是 0)
遍历Enum:
static void Main(string[] args) { foreach (int day in Enum.GetValues(typeof(Week))) { Console.WriteLine(day); } }
三. 装箱和拆箱
1. 装箱的案例
static void Main(string[] args)
{
int i = 2048; //声明一个int类型变量i,并初始化为2048
object obj = i; //声明一个object类型obj,其初始化值为i
Console.WriteLine("1、i的值为{0},装箱之后的对象为{1}", i, obj);//2048 2048
i = 927; //重新将I赋值为927
Console.WriteLine("2、i的值为{0},装箱之后的对象为{1}", i, obj);//927 2048 这个错了一次
Console.ReadLine();
//总结:i装箱会创建一个对象,将i的值放进去,i后续值的改变不影响obj
}
2. 拆箱的案例
static void Main(string[] args)
{
int i = 112; //声明一个int类型的变量i,并初始化为112
object obj = i; //执行装箱操作
Console.WriteLine("装箱操作:值为{0},装箱之后对象为{1}", i, obj);//112 112
int j = (int)obj; //执行拆箱操作
Console.WriteLine("拆箱操作:装箱对象为{0},值为{1}", obj, j);//112 112
Console.ReadLine();
//总结:没什么好总结的,注意拆箱对象的类型和变量的类型兼容即可
}
四. 常量
常量通过 const 修饰定,注意当const修饰类的属性时,不能声明staic修饰了(因为默认就是static修饰,不然你每创建一个对象就定义一个常量,肯定不现实),并且只能通过 类.常量变量名 调用,不能通过 对象.常量变量名 调用。
五. Convert类进行数据转换
方法 | 说明 |
---|---|
Convert.ToInt() | 会四舍五入 |
Convert.ToString() | |
Convert.ToDateTime() | |
Convert.ToDouble() | |
Convert.ToChar() |
第4章 表达式与运算符
一. 特殊运算符
1. is
is 相当于java的 instaceof
namespace Hello_World { internal class Program { static void Main(string[] args) { A a = new A(); Console.WriteLine(a is A);//True Console.WriteLine(a is Program);//True Console.WriteLine(a is Object);//True Console.WriteLine(a is string);//False Console.Read(); } } class A : Program { } }
2. typeof()
typeof(类) :得到类的全名
1. i-- 和 --i 经典例题
static void Main(string[] args)
{
int i = 1;
i += i--;
Console.WriteLine("i = " + i);//2
int j = 1;
j += --j;
Console.WriteLine("j = " + j);//1
Console.ReadLine();
}
第5章 字符与字符串
一. 转义字符
转义字符 | 说明 |
---|---|
\n | 换行 |
\t | tab |
\' | 单引号 |
\" | 双引号 |
\\ | 反斜线 |
\b | 退格 |
\f | 换页 |
\r | 回车 |
二. string 常用方法
说明 | 方法 | 细节 |
---|---|---|
字典序比较前后 | static Int Compare(string A, string B, bool ignoreCase(可选)) | |
Int CompareTo(string B) | ||
格式化数据 | static string Format(string format, object obj) | 格式为 {[索引]:[格式字符串]},具体格式化参数见下表,如 {0:f1} |
截取 | string Substring(int start, int length) | |
分割 | string[] split(params char[] separator) | |
插入 | string insert(int start, string str) | |
左/右填充 | string PadLeft / PadRight(int totalLength, char c) | totalLength是填充后的字符串长度 |
删除 | string Remove(int start) | |
string Remove(int start, int count) | ||
复制 | static string Copy(string s) | |
string CopyTo(int start, char[] destination, int destinationStartIndex, int count) | ||
全部替换 | string Replace(char oldChar, char newChar) | |
string Replace(string oldString, string newString) |
扩展:格式化参数
符号 | 名称 | 说明 |
---|---|---|
C 或 c | 货币¥ | {0:c1} 123 -> ¥123.0 |
D 或 d | Decimal最小位数,仅整型 | {0:d1} 123 -> 123 |
E 或 e | 科学指数 | {0:e1} 123 -> 1.2e+002 |
F 或 f | 小数后几位 | {0:f1} 123 -> 123.0 |
N 或 n | 分隔符 | {0:n1} 123 -> 123.0 |
P 或 p | 百分比 | {0:p1} 123 -> 12,300.0% |
X 或 x | 十六进制,仅限整型 | {0:x1} 123 -> 7b |
三. StringBuilder
四. 正则表达式
1. 常用字符
转载来自墨遥正则表达式全解析+常用示例_<row><col>other</col><col>310</col><col>-1</col><r-CSDN博客
2. C#使用正则表达式
使用 System.Text.RegularExpressions 下的 Regex类的静态方法即可。
下表转载来自哈桑merkletree【C#基础】C# 正则表达式-CSDN博客
第6章 流程控制语句
一. switch-case
1. switch-case的注意事项
1. C#中switch-case 是不允许表达式的(比如 x >= 100是不被允许的)
2. C# 中 switch-case 为了防止case穿透,不允许两个case之间有语句却没有break。但是switch-case可以这样用,请看接下来的switch-case的妙用static void Main(string[] args) { int i = 100; switch (i) { case 1: Console.WriteLine(1);//爆红,CS0163: 控制不能从一个case标签("case 1:")贯穿到另一个case标签 case 2: Console.WriteLine(2); } Console.ReadLine(); }
2. switch-case的妙用
static void Main(string[] args)
{
//判断某个月份是那一个季节
Console.WriteLine("请输入月份(数字): ");
string inputStr = Console.ReadLine();
int month = Convert.ToInt32(inputStr);
switch (month) {
case 3:
case 4:
case 5:
Console.WriteLine("春季");
break;
case 6:
case 7:
case 8:
Console.WriteLine("夏季");
break;
case 9:
case 10:
case 11:
Console.WriteLine("秋季");
break;
case 12:
case 1:
case 2:
Console.WriteLine("冬季");
break;
}
Console.ReadLine();
}
二. goto
goto 会让程序到指定位置开始执行,在程序里不建议使用
goto 的语法很简单: goto [标签名],标签名可以自己定义
下面这是书中的一个例题:
在循环中使用goto语句来查询指定公司是否存在
static void Main(string[] args) { Console.WriteLine("请输入公司名"); string inputStr = Console.ReadLine(); string[] mystr = { "明日科技", "百度", "阿里巴巴", "腾讯" }; for (int i = 0; i < mystr.Length; i++) { if (inputStr == mystr[i]) { goto Find; } } Console.WriteLine("您查找的{0}公司不存在数组中", inputStr); goto Finish; Find: Console.WriteLine("您查找的{0}公司存在数组中", inputStr); Finish: Console.WriteLine("查找完毕!"); Console.ReadLine(); }
细心的读者可能发现,上面的字符串内容相等判定用了 ==,C# 中的 == 和 Java 不一样,感兴趣可以参考前辈鸣宇淳 Java和C#下String类型中的==和equals的原理与区别_c# string ==-CSDN博客
第7章 数组和集合
一. 数组
1. 多维数组的定义
static void Main(string[] args)
{
//1. new int[][]
//C#中多维数组用 new int[][]这种形式的有且只能定义第一维的长度
//比如下面这种是合法的:
int[][] arr = new int[2][];
//下面这种是不合法的:
//int[][] arr = new int[1][2];
//这种方式可以不用定维数大小
int[][] arr3 = new int[][] {new int[]{ 1, 2, 3 }};
//2. new int[,,]
//这种方式需要把所有维数的大小都确定了
int[,,] arr1 = new int[1,3,2];
//这种初始化方式方式可以不用定维数的大小
int[,] arr2 = new int[,] { { 1, 2, 3 } };
}
二. ArrayList
1. ArrayList 的初始化
static void Main(string[] args)
{
//ArrayList初始化
//1. 这种方式可以传入int参数指定初始大小
ArrayList arrayList = new ArrayList();
ArrayList arrarList = new ArrayList(1);
//2. ArrayList 可以通过传 实现了 ICollection的对象进行初始化
int[] arr = new int[] { 1, 2 };
ArrayList arrayList2 = new ArrayList(arr);
}
2. ArrayList 常用属性
属性 | 说明 |
---|---|
Capacity | 大小 |
Count | 实际存在的元素数目 |
3. ArrayList 常用方法
方法 | |
---|---|
添加 | void Add(Object value) |
void Insert(int index, Object value) | |
删除 | void Clear() |
void Remove(Object value) | |
void RemoveAt(int index) | |
void RemoveRange(int index, int count) | |
搜索 | bool Contains(Object value) |
int indexOf(Object value) | |
int lastIndexOf(Object value) |
Tip:
static void Main(string[] args)
{
//ArrayList 可以通过数组的方式得到某个索引上的数据
ArrayList arrayList = new ArrayList();
arrayList.Add(1);
Console.WriteLine(arrayList[0]);//1
}
三. HashTable
1. 遍历
static void Main(string[] args)
{
Hashtable ht = new Hashtable();
//C#哈希表的插入是 add, 不是 put
ht.Add(1, 2);
ht.Add(2, 3);
//只遍历key
foreach (int s in ht.Keys)
{
Console.WriteLine(s);
}
//只遍历value
foreach (int s in ht.Values) {
Console.WriteLine(s);
}
//两个都要的话需要用到 DictonaryEntry
foreach (DictionaryEntry dictionaryEntry in ht) {
Console.WriteLine("key = " + dictionaryEntry.Key + " value = " + dictionaryEntry.Value);
}
}
第8章 面向对象编程
一. 类
1. 修饰符
修饰符类型 | 修饰符 | 说明 |
---|---|---|
权限修饰符 | public | |
protected | 只有该类所在类中,以及所在类的子类才能访问 | |
internal | 同一程序集可以访问 | |
private | 只有该类所在类才可以访问 | |
abstract | 抽象类 | |
sealed | 不允许继承 |
1.1 关于权限修饰符
C#的类权限修饰符 protected 和 private 的 使用和 java有点不同,下面的这种方式是不被允许的:
namespace Hello_World
{
//会报CS1527 :
//命名空间中定义的元素无法显式声明为 private、protected
//或 protected internal
//原因是 protected 和 private 修饰的类只能定义在某个类内部
protected class Class1{
}
private class Class2 {
}
//下面这种才是正确的
public class Class3
{
private class Class4 {}
}
}
二. 方法
1. 修饰符
2. 方法的形参类型
- params : 可变形参,要求形参的类型是一维数组
- ref : 按引用传递参数(即便是数据类型定义的,也是以引用形式传递),要求参数一定要先初始化,调用方法时要和 ref 一起传递
- out :按引用传递形参,可以不初始化,调用方法时要和 out 一起传递
例子见下:
//params
//形参前面声明了params,并且以 [] 一维数组形式
public static void method1 (params string[] s) {
foreach (string s2 in s)
{
Console.WriteLine(s2);//123 344 123123
}
}
static void Main(string[] args)
{
method1("123", "344", "123123");
}
//ref
//形参前面声明了ref
public static void method2 (ref int i) {
i = 1;
}
static void Main(string[] args)
{
//i初始化完成
int i = 0;
Console.WriteLine(i);//0
//变量要和ref一起传递
method2(ref i);
Console.WriteLine(i);//1
}
//out
//形参前面声明了out
public static void method3 (out int i) {
i = 1;
}
static void Main(string[] args)
{
//i未初始化
int i;
//变量要和 out 一起传递
method3(out i);
Console.WriteLine(i);//1
}
三. base 和 this
- this : 代表当前对象
- base : 代表父类,可以用于继承时指定父类的构造器或者在子类中调用父类的属性、方法
namespace Hello_World
{
class Class1 {
public int num;
public Class1() { }
public Class1(int num) {
//this一般用来解决属性和形参的重名问题
this.num = num;
}
}
class Class2 : Class1{
//base可以指定子类调用父类的某个构造器
public Class2 (int num): base(num) {
this.num = num;
}
}
}
四. struct
关于struct,参考大佬拂面清风三点水的文章C#重点问题之Struct和Class的异同_c#struct default-CSDN博客
第12章 数据访问技术
一. 基本介绍
关于基本介绍,书里叙述的很好:
二. Connection
Connection用于连接数据库,我们可以通过ConnectionState的枚举值来判断当前Connection的连接状态,ConnectionState的枚举值如下表:
基于WinForm和sqlserver数据库的数据库连接状态的小demo 以及 close() 和 dispose() 的区别见下:关于C#数据库连接的SqlConnection-CSDN博客
三. Command
书中的概括也很好:
简单操作数据库:
public object GetData(string disposalDeptCode)
{
//Server后填服务器名,Initial Catalog填数据库,User ID填用户名,PassWord填密码
string connStr = "Server=;Initial Catalog=;User ID=;Password=";
SqlConnection con = new SqlConnection(connStr);
//打开连接
con.Open();
StringBuilder strSql = new StringBuilder();
strSql.Append("select * from table" +
" where 1 = 1");
//创建 SqlCommand 对象
SqlCommand cmd1 = new SqlCommand();
//如果需要传入自定义的参数,用下面这种方式
if (disposalDeptCode != null)
{
cmd1.Parameters.Add(new SqlParameter("@disposalDeptCode", SqlDbType.NVarChar));
cmd1.Parameters["@disposalDeptCode"].Value = disposalDeptCode;
}
//Command的三个参数赋值
cmd1.Connection = con;
cmd1.CommandType = CommandType.Text;
cmd1.CommandText = strSql.ToString();
//SqlDataAdapter后文会说
SqlDataAdapter adapter = new SqlDataAdapter(cmd1);
DataTable data = new DataTable();
adapter.Fill(data);
return data;
}
四. 执行sql语句的方法
SqlCommand对象可以通过如下方法执行 sql 语句:
方法 | 说明 |
---|---|
public override int ExecuteNonQuery () | 返回受影响的行数,通常用于增删改 |
public SqlDataReader ExecuteReader () | 返回一个SqlDataReader对象,只能读一次并且使用完毕需要关闭 close() |
public override Object ExecuteScalar () | 返回第一行第一列的结果,常用于聚合函数 |
或者和上面的例子一样,通过SqlDataAdapter中传入SqlCommand对象,再通过fill()方法对DataTable或DataSet进行数据的填充(看不懂就看上面的例子)