阅读 C#从入门到精通(第7版) 的一些感想

本文详细介绍了C#编程语言的基础结构,包括命名规范,以及在VisualStudio2022中的各种快捷键,涵盖了项目管理、编辑、导航、调试、搜索、数据类型、运算符、流程控制、数组和集合、面向对象编程和数据库连接等内容。
摘要由CSDN通过智能技术生成

第1章 初识C#及其开发环境

一. Visual Studio 2022

VS的快捷键总结

转载来自#Sunshine boyVS快捷键大全(超详细)-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换行
\ttab
\'单引号
\"双引号
\\反斜线
\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 或 dDecimal最小位数,仅整型{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进行数据的填充(看不懂就看上面的例子)

C#编程从入门到精通 本书既为入门者提供了简单教程,同时也为高级编程人员提供了大量的例程。由3部分组成:第一部分是C#入门教程,用12章阐述了C#语言的最基本特征和主要功能,包括:C#介绍;一个简单的欢迎程序;表达式、类型和变量;控制语句——选择;控制语句——循环;方法;名称空间;类的入门;类的继承;多态性;属性;索引指示器。第二部分是本书的重点,精选了大量C#实用例程来让读者更深入地理解C#,同时这些C#例程都是经过专业程序员测试,可以直接实用,从而大大缩短编程时间,提高编程效率,这部分一共有文件访问;API;客户/服务器;数据库;线程处理及电子邮件;图像处理;空间;杂项等8个方面34个典型例程,是高级程序员不可多得的素材。最后一部分提供了为第一次接触C#的C/C++程序员准备的C# FAQ,通过9个方面48个问题来回答C/C++程序员一些有关C#的基本问题,使得他们可以尽快了解并能迅速使用C#。本书用来帮助现在的C/C++开发者迅速跟进至C#,此外,有Java和Delphi经验的开发人员或对强大的C#有兴趣的其他程序员也会发现这本书很有意义。本书内容极为丰富,有章可循、编排精细、可操作性强;并提供了针对具体的数据库管理问题的、极具参考价值的解决方案。本CD为内容中提到的源代码。 丛书名:C#编程从入门到精通 著译者: 丁鹏 出者:北京希望电子出
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值