《C#程序设计经典300例》读书笔记

本文是《C#程序设计经典300例》的读书笔记,涵盖C#的语法基础,如结构体和交错数组;字符串操作,包括删除和模糊匹配;数据结构与算法中的索引器和可空类型;类与结构的使用,如静态属性、构造函数和抽象类。此外,还讨论了事件、委托以及如何在派生类中处理基类事件和方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

语法基础

结构体主要用于创建小型对象,因为在C#中值类型是存储在线程堆栈中的,而线程堆栈的默认大小是1MB。

交错数组

byte[][] months = new byte[12][];
if (month % 2 == 0) {
    months[month] = new byte[31];
} else {
    months[month] = new byte[30];
}

Dictionary

//创建省份列表
Dictionary<string, List<string>> provinces = new Dictionary<string, List<string>>();
//创建河北省
List<string> HeBei = new List<string>();
//将河北省添加到省份列表中
provinces.Add("河北", HeBei);
//添加城市
HeBei.Add("石家庄");
//添加城市
HeBei.Add("唐山");

Queue先进先出,Stack先进后出。

字符串

如果需要删除某个字符串,可以使用Replace方法,将其第一个参数传入需要删除的字符串,第二个参数输入string.Empty即可。

Contains(判断字符串中是否含有指定字符串)、StartsWith(判断字符串是否以指定字符串开头)、EndWith(判断字符串是否以指定字符串结尾)在模糊匹配中作用很大。

数据结构与算法

索引器

public class StudentList {
    //学生信息顺序表
    private Student[] Students;
    //检索学生信息表
    public Student this[int index] {
        get {
            return Students[index];
        }

        set {
            Students[index] = value;
        }
    }
 }

int?表示可空类型,就是一种特殊的值类型,它的值可以为nullint??用于判断并赋值,先判断当前变量是否为null,如果是就可以赋役个新值,否则跳过。

类与结构

在外部访问静态属性时必须在类名后加“.”再加上属性名称,如Car.Number

可以利用this关键字通过第一个构造函数来实现第二个构造函数,代码如下:

public Date(DateTime datetime): this(datetime.Year,datetime.Month,datetime.Day){}

声明类或结构的索引器必须使用this关键字

//学科分数索引器
public int this[int index] {
    //获取指定索引科目的分数
    get {
        return scores[index];
    }

    //设置指定索引科目的分数
    set {
        scores[index]=value;
    }
}

属性的最大好处在于可以通过设置getset的访问级别来限制访问器的访问。例如:

public string City {
   public get {
       return city;
    }

   private set {
       city=value;
    }
}

其中的City属性值只能由类的内部进行分配,外部只能获取到City的值。从代码中还可以看到,在set访问器中通过value关键字来定义分配的值。其实属性中的getset不一定要同时存在。如果只允许访问该属性的值,则可以只保留get访问它。同理,如果只允许设置该属性的值,则可以只保留set访问器。当属性的访问器中不需要其他逻辑时,可以使用C#中自动实现的属性。例如:

public string City{getset;}

自动实现属性时,getset必须同时出现。如果不需要外部来修改属性值,可以在set前面加上private修饰符。例如:

public string City(getprivate set;}

通常,在派生类中通过base关键字来调用基类中公有的或受保护的成员。还可以在派生类的构造函数中通过base关键字来调用基类的构造函数。例如:

public Panda(string food): base(“熊猫”,food){}

在派生类中可以使用base关键字调用基类中的方法。

在类定义前使用abstract关键字可以将类声明为抽象类。例如:

abstract Class Student{}

在方法的返回类型前面使用abstract关键字可以将方法声明为抽象方法。例如:

public abstract int Authority();

抽象方法是没有具体的方法实现,直接在方法名后使用“;”结束定义。

在抽象类的派生类中必须实现该抽象类中的抽象方法。例如:

public override int Authority() {
    return 5;
}

如果在抽象类的派生类中不实现抽象方法,那么该派生类也必须声明为抽象类。

事件

class CallEventArgs: EventArgs{}

class Phone {
    //来电提醒事件
    public event EventHandler<CallEventArgs> CallAlert;
    //来电
    public void Call(long number) {
        if (CallAlert != null) {
            //触发来电提醒事件
            CallAlert(this, new CallEventArgs(number));
        }
    }
}

class Program {
    static void Main(string[] args) {
        Phone phone = new Phone(13888888888);
        //添加来电提醒事件
        phone.CallAlert += new EventHandler<CallEventArgs>(phone_CallAlert);
        phone.Call(13999999999);
    }

    //来电提醒事件函数
    static void phone_CallAlert(object sender, CallEventArgs e) {
        Phone phone = sender as Phone;
    }
}

在定义事件时需要使用event关键字,EventHandler委托表示事件处理方法将要遵循的格式,CallEventArgs类型表示EventHandler的第二个参数类型,该类型必须派生自系统提供的EventArgs类。CallAlert则为事件名称。

基类事件

class Program {
    static void Main(string[] args) {
        //创建圆形实例
        Circle circle = new Circle(100);
        circle.SharpChanged += 
new EventHandler<SharpChangedEventArgs> (Sharp_SharpChanged);
        //修改圆形的半径
        circle.Radius = 50;
    }

    static void Sharp_SharpChanged(object sender, SharpChangedEventArgs e) {
        if (sender is Circle)  ;
        else if (sender is Rectangle)  ;
    }
}

//形状改变事件参数类
class SharpChangedEventArgs : EventArgs {
    //改变后的面积
    public readonly double Area;
    public SharpChangedEventArgs(double area) {
        Area = area;
    }
}

//形状
class Sharp {
    //形状的面积
    public double Area {
        get;
        protected set;
    }

    //形状改变事件
    public event EventHandler<SharpChangedEventArgs> SharpChanged;

    //形状改变虚函数
    protected virtual void OnSharpChanged(SharpChangedEventArgs e) {
        if (SharpChanged != null) {
            //触发形状改变事件
            SharpChanged(this, e);
        }
    }
}

//圆形
class Circle: Sharp {
    int radius;
    //圆形半径
    public int Radius{
        get {
            return radius;
        }

        set {
            //如果半径发生变化
            if (radius != value) {
                radius = value;
                //重新计算面积
                Area = Math.PI * radius * radius;
                OnSharpChanged(new SharpChangedEventArgs(Area));
            }
        }
    }

    public Circle(int radius) {
        this.radius = radius;
        //计算圆形面积
        Area = Math.PI * radius * radius;
    }

    protected override void OnSharpChanged(SharpChangedEventArgs e) {
        //重载形状改变函数
        base.OnSharpChanged(e);
    }
}

本实例代码主要实现了在派生类中引发基类的事件。由于事件是特殊类型的委托,派生类无法调用基类中声明的事件。因此,只有通过在基类中定义事件和引发该事件的虚方法,然后在派生类中通过调用基类中定义的引发事件的虚方法来间接调用该事件。

委托

class Program {
    static void Main(string[] args) {
        StudentTable table = new StudentTable();
        //显示表中所有男生信息
        table.Display(Display);
    }
    //显示男生信息
    static void Display(Student student) {}
}

//显示学生信息委托
delegate void DisplayStudent(Student student);

//学生信息表类
class StudentTable {
    //显示学生信息
    public void Display(DisplayStudent display) {
        foreach (Student student in students) {
            display(student);
        }
    }
}

该委托的使用很好地实现了学生信息的显示方式与学生信息表的分离。在需要将方法与委托进行绑定时,就需要实例化委托。例如:

DisplayStudent display = new DisplayStudent(Display);
自制书签。因上传大小限制,分三卷压缩,分别是:《C#经典编程220》.(明日科技).【带书签】.zip、《C#经典编程220》.(明日科技).【带书签】.z01、《C#经典编程220》.(明日科技).【带书签】.z02 第1章 c#语言及其开发环境 1 实001 根据需要创建所需解决方案 2 实002 统一窗体中控件的字体设置 3 实003 设置程序代码行号 5 实004 通过“格式”菜单布局窗体 6 实005 为项目添加dll文件引用 7 实006 为项目添加已有类 8 实007 为项目添加第三方控件 9 实008 为项目添加已有窗体 11 第2章 c#语言基础 12 实009 利用for循环输出多行语句 13 实010 输入并输出姓名 14 实011 使用值类型和引用类型输出不同的字段 15 实012 判断当前系统日期是星期几 17 实013 定义局部变量输出不同的字段 19 实014 定义循环内部变量并输出变量的值 20 实015 定义常量计算圆的周长 21 实016 使用“+”编写双重意义的表达式 22 实017 使用小括号括起来的表达式 23 .实018 使用算术运算符开发简单计算器 23 实019 使用条件运算符判断指定年份是不是闰年 26 实020 使用typeof关键字获取类的内部结构 28 实021 巧用位移运算符获取汉字编码值 30 实022 使用异或运算符对数字进行加密 31 第3章 流程控制语句 33 实023 利用if…else语句判断分数是否及格 34 实024 利用switch语句判断时间 35 实025 利用while语句判断大小 36 实026 打印九九乘法表 38 实027 使用break语句提前退出循环语句 39 实028 使用continue语句转移至循环开始处 40 实029 使用流程控制语句报销业务花销 41 实030 输出当前系统时间 42 实031 利用for循环实现完数计算 44 实032 开发一个猜数字游戏 45 第4章 字符与字符串 47 实033 字母与ascii码的转换 48 实034 获取字符串中汉字的个数 50 实035 从字符串中分离文件路径、文件名及扩展名 51 实036 对字符串进行加密与解密 53 实037 开发一个进制转换器 56 实038 将字符串的每个字符进行颠倒输出 60 实039 根据标点符号对字符串进行分行 61 实040 将汉字转换为拼音 63 实041 商品金额的大小写转换 64 实042 根据年份判断十二生肖 65 实043 将字母全部转换为大写或小写 67 实044 汉字与区位码的转换 69 第5章 数组和集合 71 实045 在数组中添加一个元素 72 实046 在数组中添加一个数组 73 实047 计算两个矩形矩阵的乘积 75 实048 获取多维数组的行数与列数 78 实049 使用快速排序法对一维数组进行排序 79 实050 使用sort方法对数组进行快速排序 81 实051 按指定条件在数组中检索元素 82 实052 反转数组中元素的顺序 84 实053 使用希尔排序法对一维数组进行排序 85 实054 向班级集合中添加学生信息 87 实055 不改变长度删除数组中的元素 89 实056 删除数组元素后改变其长度 90 第6章 c#面向对象程序设计 92 实057 创建类的对象 93 实058 使用构造函数 94 实059 通过定义方法求一个数的平方 95 实060 使用重载方法实现不同类型数据的计算 97 实061 使用属性存储用户编号和姓名 99 实062 使用索引器 101 实063 通过类继承计算梯形面积 103 实064 封装类实现一个简单的计算器 106 实065 通过结构计算矩形的面积 107 实066 通过结构计算圆形的面积 109 实067 使用面向对象思想查找字符串中的所有数字 110 实068 通过类的多态性确定人类的说话行为 112 第7章 异常处理和程序调试 114 实069 使用try…catch语句捕获异常 115 实070 根据实际年龄判断虚岁,使用try…catch捕获异常 116 实071 调试程序执行时出现的结果 117 实072 使用异常处理语句捕获异常 118 实073 捕获连接数据库异常 120 第8章 windows窗体 122 实074 简单的登录窗体 123 实075 关闭窗体提示 124 实076 创建简单的mdi应用程序 125 实077 实现重复高效地利用基窗体 127 实078 尝试制作一个半透明渐显窗体 128 实079 使窗体标题栏文字右对齐 129 实080 窗口间移动按钮 130 实081 窗体中滚动的字幕 131 实082 使用任意组件拖动窗体 133 实083 窗体换肤程序 134 第9章 windows应用程序常用控件 137 实084 在c#中设计出色彩斑斓的按钮 138 实085 自动删除textbox控件中的非法字符 139 实086 在richtextbox控件中替换文本文字 141 实087 利用richtextbox控件实现文字定位与标示 142 实088 将数据表中的字段添加到combobox控件中 143 实089 对listbox控件中的数据进行排序 145 实090 listbox控件拒绝添加重复信息 146 实091 限制用户名称长度及设置密码文本 148 实092 带查询功能的combobox控件 149 实093 利用选择控件实现权限设置 150 实094 利用richtextbox控件显示图文数据 153 实095 在listbox控件间交换数据 155 第10章 windows应用程序高级控件 157 实096 使用imagelist组件制作动画图片 158 实097 在combobox下拉列表中显示图片 159 实098 在listview控件中实现修改功能 161 实099 将数据库数据添加到listview控件 162 实100 在listview控件中绘制底纹 164 实101 在treeview控件节点中显示图片 165 实102 使用树型列表动态显示菜单 167 实103 使用treeview控件遍历磁盘目录 169 实104 使用errorprovider组件验证文本框输入 170 实105 使用helpprovider组件调用帮助文件 172 实106 使listview控件中的选择项高亮显示 173 实107 在列表视图中拖动视图项 175 实108 实现带复选框的treeview控件 177 实109 将xml文件节点绑定到treeview控件中 178 实110 修改treeview控件的节点文本 179 第11章 c#面向对象高级技术 181 实111 利用接口实现选择不同的语言 182 实112 使用接口作为方法参数进行编程 184 实113 自定义抽象类计算圆形的面积 186 实114 重写抽象方法实现多态性 188 实115 使用密封类密封登录用户信息 191 实116 使用密封类封装个人身份证信息 193 实117 使用迭代器显示公交车站点 195 实118 通过迭代器实现文字的动态效果 196 实119 使用分部类制作一个计算器 199 实120 使用分部类显示员工信息 201 实121 使用泛型存储不同类型的数据列表 202 实122 使用泛型去掉数组中的重复数字 204 实123 通过重写虚方法实现加法运算 205 实124 使用迭代器实现倒序遍历 207 实125 通过泛型查找数组中的元素 209 第12章 ado.net数据访问技术 212 实126 连接加密的access数据库 213 实127 使用odbc dsn连接sql server数据库 214 实128 使用ado.net对象录入数据 217 实129 利用存储过程录入数据 219 实130 使用oledbdatareader读取文本文件的内容 222 实131 使用sqldatareader读取用户登录信息 223 实132 使用断开式连接的方式录入数据 226 实133 使用断开式连接批量更新数据库中的数据 227 实134 使datagridview控件中被选定单元格的所在行变色 229 实135 在datagridview控件中隔行换色 231 实136 连接excel文件 232 实137 读取和保存用户头像 233 实138 判断是否重复输入数据 235 实139 删除datagridview控件中的指定行 237 实140 将access数据库导入excel文件中 238 第13章 水晶报表与打印 241 实141 设计带有背景图的水晶报表 242 实142 设置水晶报表的打印日期与时间 247 实143 设置水晶报表中节的背景图片 249 实144 打印窗体中的数据 250 实145 打印商品入库单据 252 实146 使用打印控件实现分页打印 255 实147 动态绑定水晶报表 258 实148 在水晶报表中使用公式字段 260 实149 设计分组统计报表 261 实150 打印一个空学生证 264 实151 自定义横向或纵向打印 266 实152 自定义打印页码范围 268 第14章 文件及数据流技术 271 实153 根据日期动态建立文件 272 实154 将长文件名转换成短文件名 273 实155 获取所有逻辑磁盘目录 274 实156 使用递归法删除文件夹中的所有文件 278 实157 按行读取文本文件中的数据 279 实158 使用缓冲流复制文件 280 实159 文件批量更名 283 实160 复制文件时显示复制进度 285 实161 对指定文件夹中的文件进行分类存储 288 实162 将文本文件转换成网页文件 290 实163 伪装文件夹 292 实164 word目录提取工具 296 第15章 gdi+绘图 302 实165 在图像中实现自定义标记 303 实166 辉光效果的文字 306 实167 渐变效果的文字 310 实168 绘制多边形 311 实169 简单画图程序 313 实170 仿qq截图功能 318 实171 模拟石英钟 321 实172 绘制贝塞尔曲线 323 实173 绘制图形验证码 324 实174 以椭圆形显示图像 326 实175 使用双缓冲技术绘图 327 实176 批量添加图片水印 330 第16章 线程的使用 336 实177 使用线程读取数据库中的数据 337 实178 使用线程制作qq农场小游戏 339 实179 使用线程实现大容量数据的计算 342 实180 使用多线程制作端口扫描工具 343 实181 使用线程扫描局域网ip地址 345 实182 使用线程休眠控制图片以百叶窗效果显示 347 实183 使用线程控制向窗体中拖放图片并显示 349 实184 使用线程制作动画效果的状态栏 351 实185 使用线程遍历文件夹 352 实186 使用线程实现从左向右以拉伸的方式显示图像 353 第17章 网络编程技术 357 实187 通过ip地址获取主机名称 358 实188 创建web页面浏览器 359 实189 获取网络信息及流量 361 实190 远程关闭与重启计算机 363 实191 设计点对点聊天程序 366 实192 电子邮件的发送与接收 368 实193 获取网络中所有工作组名称 371 实194 列出指定工作组中的所有计算机名 373 实195 监测当前网络连接状态 375 实196 使用udp协议设计聊天室 376 第18章 注册表技术 379 实197 禁止运行注册表 380 实198 使应用程序开机自动运行 381 实199 获取本机安装的软件清单 384 实200 禁止使用windows任务管理器 385 实201 清除ie地址栏中的历史网址 387 实202 将磁盘驱动器隐藏 388 实203 禁止使用命令提示符 390 实204 禁止修改ie浏览器主页 391 实205 设置ie浏览器的默认主页 392 实206 设置ie浏览器的默认下载路径 394 第19章 c#语言新技术 396 实207 使用隐式类型局部变量实现字母的大小写转换 397 实208 使用扩展方法显示员工信息 398 实209 使用lambda表达式查找指定字符串 400 实210 检查序列中是否包含指定元素 402 实211 使用linq在一个循环中遍历多个数组 403 实212 过滤文章中包含指定单词的句子 404 实213 使用linq生成随机序列 406 实214 筛选指定类型的元素 408 实215 使用linq技术对对象进行筛选操作 409 实216 使用linq技术对对象进行排序操作 410 实217 使用linq技术对对象进行聚合操作 413 实218 使用linq技术对对象进行联接操作 415 第20章 windows应用程序打包部署 417 实219 打包程序时设置桌面图标 418 实220 打包.net framework 4.0框架 420
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值