还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
程序设计课程介绍C#欢迎参加程序设计课程!本课程旨在带领学生系统掌握语言的核心概念C#C#和实践技能,从基础语法到高级应用全面覆盖通过理论与实践相结合的学习模式,您将能够独立开发各类应用程序在接下来的课程中,我们将深入探讨语言的各种特性,包括语法结构、面C#向对象编程、数据处理、图形界面设计、网络编程等内容我们的目标是培养您的实际开发能力,使您能够在软件行业中应用这些技能解决实际问题作为微软的主导语言,在企业应用、游戏开发、网站建设等多个领域有着C#广泛应用,掌握这一技能将为您的职业发展提供坚实基础语言发展历程C#年年年至今20002005-20102016语言由微软首席架构师到版本陆续发布,引入泛型、的发布标志着跨入跨平台时C#Anders C#
2.
03.
0.NET CoreC#领导开发,作为框架的
一、匿名方法等重要特性,大幅提升了代,可在、、等多Hejlsberg.NET LINQWindows LinuxmacOS部分首次公开发布最初的目标是创建一语言的表达能力和开发效率微软不断完种操作系统上运行近期版本持续增加新种简单、现代、通用且面向对象的编程语善语言特性,使其更加健壮特性,如异步编程模式、模式匹配等,使言保持现代编程语言的活力C#为什么选择C#语法简洁,面向对象强大生态与工具支持语法清晰直观,吸收了作为顶级,C#Visual StudioIDE和的优点,同时避提供智能代码补全、实时错误C++Java免了它们的复杂性强大的面检测和强大的调试功能丰富向对象特性使代码结构更加合的第三方库和包管理系NuGet理,便于维护和扩展统让开发过程更加高效兼容多平台随着的发布,代码可以在、和.NET CoreC#Windows LinuxmacOS上无缝运行这种跨平台能力极大拓展了的应用场景,使其在云应C#用、容器化服务等现代架构中表现出色和关系.NET C#C#程序代码开发者编写的高级语言代码中间语言IL编译后的平台无关代码公共语言运行时CLR执行环境与内存管理.NET运行时底层平台支持.NET是微软开发的软件框架,而C#是在这个框架上运行的主要编程语言.NET提供了运行时环境、类库支持和内存管理机制,C#则是在此基础上构建的高级编程语言当C#代码被编译时,它首先转换为中间语言IL,然后由公共语言运行时CLR将其转换为机器码执行这种设计使得C#能够在不同硬件平台上运行,只要安装了对应的.NET运行时环境开发环境配置下载安装Visual Studio访问Microsoft官网,下载Visual StudioCommunity(免费版)、Professional或Enterprise版本选择安装时,确保勾选.NET桌面开发和ASP.NET和Web开发工作负载安装.NET SDK虽然Visual Studio安装过程中会包含.NET SDK,但您也可以单独下载最新版本打开命令提示符,输入dotnet--version确认安装是否成功创建第一个C#项目打开Visual Studio,选择创建新项目,然后选择控制台应用.NETCore模板为项目命名并选择存储位置,点击创建按钮完成项目创建运行Hello World程序在默认生成的Program.cs文件中已包含基本代码按F5键或点击工具栏上的开始按钮运行程序,您将看到控制台窗口显示Hello World!文本基础语法程序结构方法入口指令标识符与注释Main using每个程序必须包含一个方法,指令用于导入命名空间,使我们标识符是变量、方法、类等程序元素C#Main using它是程序的入口点程序执行始于能够使用该命名空间中定义的类型而的名称中标识符区分大小写,必C#方法的第一行,并按顺序执行其无需完全限定名称例如,须以字母或下划线开头注释可以是Main using中的代码在最新版本的中,可以允许我们直接使用单行注释()或多行注释(C#System;Console///*使用简化的顶级语句,无需显式定义类,而不必每次都写),用于解释代码,提高可读性*/方法Main System.Console数据类型与变量引用类型存储对象引用,数据在堆上类•class值类型接口•interface直接包含数据,存储在栈上字符串•string整数类型等•int,long,byte数组•array浮点类型•float,double类型推断var布尔类型•bool编译器自动推断变量类型结构体•struct隐式类型变量•提高代码简洁性•初始化时必须赋值•基本运算符类别运算符示例算术运算符+,-,*,/,%,++,--int sum=a+b;intremainder=10%3;比较运算符==,!=,,,=,=ifage=18{...}逻辑运算符,||,!ifisValidage18{...}位运算符,|,^,~,,int flags=FLAG1|FLAG2;赋值运算符=,+=,-=,*=,/=,%=total+=value;C#中的运算符遵循特定的优先级和结合性规则括号可以用来改变正常的求值顺序,确保复杂表达式按照预期进行计算理解运算符的行为对于编写正确的程序逻辑至关重要除了基本运算符外,C#还提供了条件运算符(:)、空合并运算符()和空条件运算符(.)等更高级的运算符,用于简化常见的编程模式输入与输出控制台输入控制台输出字符串格式化方法用于读取用户方法用于在控制台字符串插值使用符号前缀和包裹变Console.ReadLine Console.WriteLine${}从控制台输入的一行文本,返回一个字上显示一行文本,并在末尾添加换行量,是一种更直观的格式化方式格式符串如果需要获取数值类型,需要进符则不添加换行符说明符可以控制数值和日期的显示格Console.Write行类型转换式Console.WriteLineHello,string name={0}!,name;string message=$Hello,Console.ReadLine;Console.WriteYour ageis:{name}!;int age=;Console.WriteLine$Price:Convert.ToInt32Console.ReadL Console.WriteLineage;{price:C2};ine;Console.WriteLine$Date:{today:yyyy-MM-dd};分支结构语句if/else1基本条件判断结构语句switch多值匹配分支结构条件表达式():简洁三元条件运算语句是最基本的条件控制结构,根据布尔表达式的结果执行不同的代码块当条件较多时,可以使用链来处理多种情况if/else if-else if-else语句适用于针对单个变量的多值匹配情况,相比多个更加清晰后支持模式匹配,使功能更加强大每个后需要switch if-else C#
7.0switch case或语句来防止执行落入下一个break returncase条件表达式(三元运算符)格式为,是的简洁替代形式,适用于简单条件赋值场景conditiontrueResult:falseResult if-else循环结构for循环while循环do-while循环for循环适用于预知循环次数的场景,包含初始化、while循环适用于循环次数不确定,需要根据条件判do-while循环与while类似,但条件检查在循环体执条件检查和迭代三个部分它的语法紧凑,控制变量断是否继续的场景条件在循环开始前检查,如果初行后进行,因此循环体至少会执行一次适用于至少的作用域仅限于循环内部始条件为假,循环体一次也不会执行需要一次执行的场景for inti=0;i10;i++int count=0;int num=0;{while count5doConsole.WriteLine$迭代{i};{{}Console.WriteLine$计数:{count};Console.WriteLine$数字:{num};count++;num++;}}while num3;方法定义与调用方法定义参数传递方法重载方法调用访问修饰符、返回类型、名称、参值参数、引用参数ref、输出参数相同名称但参数列表不同的多个方方法名加实参列表,按值类型或引数列表、方法体out、参数数组法用类型传递C#中的方法是执行特定任务的代码块,通过封装代码实现重用方法定义包括访问修饰符、返回类型、名称、参数列表和方法体参数可以设置默认值,使调用时对应参数可选参数传递有多种方式值参数传递数值的副本;ref参数需要初始化并可能被修改;out参数不需要初始化但必须在方法内赋值;params关键字允许传入可变数量的参数方法重载允许一个类中存在多个同名但参数列表不同的方法数组与集合基础一维数组二维数组一维数组是最简单的数组类型,存二维数组用于表示表格形式的数储相同类型的元素序列声明方式据,有两种形式矩形数组为类型变量名类型长和交错数组矩形[]=new[int[,]int[][]度数组索引从开始,可以通数组中每行长度相同,而交错数组];0过索引访问单个元素,通过允许每行长度不同,实质是数组属性获取数组长度的数组Length集合ListT是动态数组,大小可以在运行时调整,提供丰富的方法如、ListT Add、等相比固定大小的数组,在需要频繁添加或删除元Remove ContainsList素的场景中更加灵活高效中的数组和集合是存储和操作数据的重要工具数组大小固定,适合存储已知数量C#的元素;而集合则更加灵活,能够动态调整大小,提供更丰富的操作方法在实际编程中,应根据具体需求选择合适的数据结构字符串处理315+主要拼接方法常用字符串方法字符串连接操作符+、String.Concat和字符串插值包括Substring、IndexOf、Replace、ToUpper、${}ToLower、Trim等5xStringBuilder优化在大量字符串操作时相比普通字符串拼接能提升性能C#中的字符串是不可变的,这意味着每次字符串操作都会创建新的字符串对象对于简单的字符串拼接,可以使用+运算符或String.Concat方法;对于包含变量的复杂字符串,字符串插值$提供了更直观的语法除了基本操作,C#提供了丰富的字符串处理方法Substring用于截取子串,Replace用于替换字符或子串,IndexOf和LastIndexOf用于查找子串位置,Split用于分割字符串为数组,而Join则将字符串数组连接为一个字符串当需要频繁修改字符串时,应使用StringBuilder类而非普通字符串操作,以避免创建大量临时字符串对象,提高性能StringBuilder提供Append、Insert、Remove等方法,适合构建复杂字符串枚举与结构体枚举enum结构体struct枚举是一组命名常量,提高代码可读性和类型安全性默认基础类型为int,可以显式指定其他整数类型结构体是值类型,用于封装小型数据集适合表示不需要继承的简单数据结构,如坐标点、颜色值等struct PointenumSeason{{public intX;Spring=1,public intY;Summer=2,Autumn=3,public Pointintx,int yWinter=4{}X=x;Y=y;Season current=Season.Summer;}Console.WriteLine$当前季节:{current};public doubleDistance{return Math.SqrtX*X+Y*Y;}}Point p1=new Point3,4;Console.WriteLine$距离:{p
1.Distance};枚举和结构体在C#中有着重要的应用场景枚举常用于表示固定集合的选项,如状态、选项、命令等,使代码更加清晰可读结构体则适合表示轻量级的值对象,特别是那些逻辑上作为单个值的小型数据集面向对象思想类与对象封装类是创建对象的蓝图,定义属性和行为;对隐藏实现细节,只暴露必要接口,控制对内象是类的实例,具有状态和行为部状态的访问多态继承同一接口,不同对象有不同实现,增强灵活子类继承父类的特性,实现代码重用和层次性结构面向对象编程是一种以对象为中心的编程范式,它将数据和行为封装成对象,通过对象之间的交互来完成任务在中,类是面向对象编程的基本C#单位,它定义了对象的数据结构和行为方式封装隐藏了实现细节,防止外部直接访问对象内部状态,提高了代码的安全性和可维护性继承允许创建层次结构,子类可以重用父类的代码,同时添加或修改功能多态则使不同类的对象对相同消息做出不同响应,增强了代码的灵活性和可扩展性类与对象的定义创建对象实现构造函数使用关键字创建类的实例,调new定义字段与属性构造函数是在创建对象实例时自动用适当的构造函数初始化对象创声明类字段是类的变量,存储对象的状调用的特殊方法,用于初始化对象建后可以通过对象引用访问其属性使用class关键字定义类,可以包含态属性是字段的封装,提供了对的状态可以定义多个重载的构造和方法,操作对象的状态和行为访问修饰符、类名、基类和接口字段的受控访问属性包含get和函数以支持不同的初始化方式析类的内部包含成员变量(字段)、set访问器,允许在读取或写入值时构函数(~类名)用于清理非托管资属性、方法、事件等类是创建对执行额外逻辑,如验证或通知源,但在中很少使用C#象的模板,定义了对象的数据和行为封装与访问修饰符访问修饰符访问级别适用场景public无限制访问需要被任何代码访问的成员private仅当前类内访问实现细节,不应被外部代码访问protected当前类和派生类访问需要在继承层次中共享的成员internal当前程序集内访问仅在同一程序集内共享的成员protected internal当前程序集或派生类访问程序集内公开但对外部只对派生类开放封装是面向对象编程的核心原则之一,它通过访问修饰符控制对类成员的访问,隐藏实现细节,只暴露必要的接口在C#中,合理使用访问修饰符可以提高代码的安全性和可维护性属性是实现封装的重要机制,通过get和set访问器控制对字段的读写属性可以包含验证逻辑,确保对象状态的一致性;也可以触发事件通知,通知相关系统状态已变更自动实现的属性(prop)简化了无需额外逻辑的属性定义继承与派生类特定功能派生类特定领域功能实现中间抽象类共享实现与抽象定义基类基础功能与接口定义继承是面向对象编程的重要特性,允许创建基于现有类的新类在中,使用冒号()表示继承关系,子类继承父类的公共和受保护成员,包括字段、C#:属性和方法每个类只能直接继承一个基类,但可以实现多个接口在派生类中,可以通过关键字引用基类成员,特别是在构造函数中调用基类构造函数初始化继承的成员方法重写使用关键字,允许派生base override类提供基类虚方法(使用标记)的新实现关键字可以防止类被进一步继承或方法被进一步重写virtual sealed继承建立了类之间的是一种关系,创建类的层次结构,促进代码重用然而,过度使用继承可能导致紧耦合和脆弱设计,因此在某些情况下,组合或接口实现可能是更好的选择多态与抽象类多态性抽象类接口实现多态允许使用父类类型的引用变量引用子抽象类使用关键字声明,不能被接口定义了一组方法、属性和事件的签abstract类对象,并在运行时根据实际对象类型调直接实例化,只能被继承它可以包含普名,但不提供实现类可以实现多个接用适当的方法实现这使得程序能够处理通方法的完整实现,也可以声明抽象方法口,必须提供接口定义的所有成员的实不同类但共享相同接口的对象,增强了代(没有实现体),强制子类提供实现抽现接口是实现多态的重要机制,特别是码的灵活性和可扩展性象类适合定义类层次结构的公共基础在不支持多重继承的情况下C#接口与实现接口定义接口实现显式接口实现接口使用interface关键字定义,包含方法、属性、事件和索引器的类通过冒号后跟接口名称来实现接口,必须提供接口所有成员的实当类实现多个具有相同成员名称的接口,或需要隐藏接口成员时,签名,但不包含实现接口成员默认为public,不需要也不允许显现一个类可以实现多个接口,用逗号分隔实现接口的类必须遵可以使用显式接口实现显式实现的成员不能直接通过类实例访式指定访问修饰符C#
8.0后,接口可以包含默认实现和静态成循接口定义的契约,确保行为一致性问,必须先转换为对应的接口类型员class FileLogger:ILogger classMultiLogger:ILogger,IDbLoggerinterface ILogger{{{public intErrorCount{get;private set;}//显式实现ILogger.Logvoid Logstring message;public event EventHandler OnError;void ILogger.Logstring messageintErrorCount{get;}{eventEventHandlerOnError;public voidLogstring message//特定实现}{}//实现日志记录逻辑}//显式实现IDbLogger.Log}void IDbLogger.Logstring message{//另一种实现}}静态成员与静态类静态成员静态字段、属性、方法和事件属于类本身而非实例,通过类名直接访问,不需要创建对象它们在程序运行期间只有一个副本,被所有实例共享,适合存储全局状态或提供通用功能静态类使用static关键字修饰的类只能包含静态成员,不能被实例化,也不能被继承静态类适合组织不需要维护状态的实用方法,如Math、Console、File等系统类它们提供功能性的操作,不表示特定的对象实例静态构造函数静态构造函数在类第一次被使用前自动执行,初始化静态成员它没有访问修饰符,不接受参数,每个类最多只能有一个静态构造函数常用于配置静态状态、注册事件处理程序或执行只需一次的初始化逻辑单例模式单例是只允许创建一个实例的类,通常通过私有构造函数和静态属性实现它提供了全局访问点,确保线程安全的实例创建,适用于需要协调全局操作的场景,如日志记录、配置管理或资源池委托与事件基础委托Delegate事件Event Lambda表达式委托是类型安全的函数指针,定义了方法的签名(参数类事件是基于委托的机制,实现观察者模式,允许对象在状Lambda表达式是创建匿名函数的简洁语法,常用于委托型和返回类型)委托允许将方法作为参数传递,实现回态变更时通知订阅者事件封装了委托,限制了外部代码和LINQ它使用=操作符分隔参数列表和函数体,简调机制和策略设计模式的操作,只允许订阅和取消订阅化了代码并提高了可读性//定义委托类型class Button//使用Lambda表达式delegate voidProcessDataint data;{List numbers=new List//定义事件{1,2,3,4,5};//定义匹配签名的方法public eventEventHandler Clicked;var evenNumbers=numbers.FindAllvoid DoubleDataintx n=n%2==0;{public voidClickConsole.WriteLinex*2;{//多行Lambda表达式}//触发事件Action log=message=Clicked.Invokethis,{//创建委托实例并调用EventArgs.Empty;string time=DateTime.Now.ToString;ProcessData processor=DoubleData;}Console.WriteLine${time}:processor10;//输出20}{message};};//订阅事件Button btn=new Button;btn.Clicked+=s,e=Console.WriteLine按钮被点击;常用系统类库Math类DateTime类Random类提供数学计算的静态方处理日期和时间的结构生成伪随机数的类,支法,如三角函数、对体,支持日期计算、格持整数和浮点数范围内数、平方根、最大最小式化和解析提供的随机值Next方法值等例如Math.Sqrt Now、Today等静态属返回随机整数,计算平方根,性获取当前时间,以及NextDouble返回0到1Math.Round进行四舍AddDays、之间的随机浮点数,适五入,Math.Max返回ToString等方法进行用于模拟、游戏和测试最大值操作和格式化数据生成Environment类提供关于当前环境的信息和交互方法可以获取操作系统版本、处理器数量、环境变量、命令行参数等信息,以及控制程序退出等操作C#的系统类库提供了丰富的预定义类型和功能,使开发者能够专注于业务逻辑而不是基础设施代码System命名空间包含了基本数据类型、异常处理、事件模型等核心功能的类型定义,是几乎所有C#程序的基础集合(等)List,Dictionary提供了丰富的集合类,满足不同数据存储和操作需求是动态数组,可以根据需要调整大小,提供、、等方法C#ListT AddRemove Insert操作元素,以及、等方法进行搜索和排序它保持元素的插入顺序,通过索引快速访问元素Sort Find实现键值对存储,通过唯一键快速查找值它使用哈希表实现,提供近乎的查找性能常用于缓存、查找表DictionaryTKey,TValue O1和数据映射场景存储不重复元素,适合需要唯一性和集合运算(如交集、并集)的场景HashSetT和分别实现先进先出和后进先出的数据结构,适用于处理顺序敏感的操作提供双向链表实现,擅长频QueueT StackTLinkedListT繁的插入和删除操作所有集合类都支持遍历,简化了元素访问foreach泛型与约束泛型定义1使用类型参数定义可重用代码类型约束限制泛型参数的类型范围泛型应用集合、算法、设计模式实现泛型是C#中实现类型安全和代码重用的强大机制通过使用类型参数(如T),可以创建独立于具体类型的类、接口、方法和委托泛型代码在编译时进行类型检查,避免了装箱/拆箱操作和类型转换,提高了性能和类型安全性泛型约束使用where关键字限制类型参数必须满足特定条件常见约束包括class(引用类型)、struct(值类型)、new(有无参构造函数)、特定基类或接口约束确保类型参数具有所需特性,使泛型代码能够安全地使用这些特性泛型在集合类(如ListT、DictionaryK,V)中广泛应用,使其能够存储任何类型的数据同时保持类型安全泛型还用于实现通用算法、工具类和设计模式,如仓储模式、工厂模式等,提高代码的复用性和可维护性文件操作基础读取文本文件File.ReadAllText方法一次性读取整个文件内容到字符串对于大文件,可使用File.ReadAllLines读取为字符串数组,或使用StreamReader逐行读取,减少内存占用所有方法都支持指定文本编码写入文本文件File.WriteAllText将字符串内容写入文件,覆盖任何现有内容File.AppendAllText向文件追加内容对于需要多次写入的场景,StreamWriter提供了更高效的缓冲写入方式,并支持控制缓冲区大小二进制文件操作使用FileStream结合BinaryReader/BinaryWriter读写二进制数据它们提供了读写基本数据类型的方法,适合处理图像、音频等非文本数据搭配using语句确保资源正确释放文件路径处理Path类提供了跨平台的路径操作,如Path.Combine连接路径、Path.GetFileName获取文件名、Path.GetExtension获取扩展名等使用Path类而非手动拼接字符串可以避免路径分隔符问题异常处理机制包装和解包包装(Boxing)概念解包(Unboxing)过程包装是将值类型转换为引用类型的过程当值类型被分配解包是将引用类型转换回值类型的过程它需要显式类型给object类型变量或接口类型变量时,CLR自动创建一个转换,并且仅当引用确实指向包含正确值类型数据的已包对象包装器,将值类型的数据复制到堆上的对象中这是装对象时才能成功如果引用为null或指向不兼容类型的一种隐式转换,不需要显式强制类型转换对象,将抛出异常int number=123;object boxed=123;object boxed=number;//自动包装int unboxed=intboxed;//显式解包性能影响与优化包装和解包操作涉及内存分配和复制,会影响性能,特别是在循环和处理大量数据时为避免不必要的性能开销,应尽量使用泛型集合(如ListT)而非非泛型集合(如ArrayList),使用泛型方法而非采用object参数的方法//避免这种写法ArrayList list=new ArrayList;list.Add1;//发生包装//推荐这种写法List list=new List;list.Add1;//无包装语法基础LINQ查询语法方法语法LINQ操作符LINQ查询语法类似SQL,使用from、where、方法语法使用扩展方法如Where、OrderBy、LINQ提供丰富的操作符,包括筛选Where、排序select等关键字构建查询表达式这种语法直观,适Select等链式调用构建查询这种语法更加简洁,适OrderBy、投影Select、分组GroupBy、连接合复杂查询,特别是对于熟悉SQL的开发者合简单查询,也支持Lambda表达式提供强大的表达Join、聚合Sum,Count等这些操作符允许以能力声明式方式表达复杂的数据操作var result=from pin productswherep.Price100var result=products//分组示例orderby p.Name.Wherep=p.Price100var groups=from pin productsselect new{p.Name,.OrderByp=p.Name groupp byp.Categoryp.Price};.Selectp=new{p.Name,into gp.Price};selectnew{Category=g.Key,Count=g.Count,Average=g.Averagep=p.Price};LINQ LanguageIntegrated Query是C#的强大特性,允许以统一的方式查询不同数据源(集合、XML、数据库等)它结合了SQL的声明式特性和C#的类型安全,使数据查询更加简洁、可读和可维护执行LINQ查询时采用延迟加载策略,仅在实际需要结果时才执行查询,提高了效率表达式进阶LambdaLambda表达式语法Lambda表达式采用参数=表达式或语句块的形式,是创建匿名函数的简洁方式它可以有零个或多个参数,单个参数时可省略括号表达式可以是单一表达式或包含多个语句的代码块Lambda表达式捕获外部变量的能力使其在数据处理和事件处理中特别有用委托类型Lambda表达式通常赋值给委托类型变量C#提供了几种内置泛型委托Action(无返回值)、Func(有返回值)和Predicate(返回布尔值)这些委托类型简化了代码,避免了定义自定义委托的需要使用委托类型可以将方法作为参数传递,实现策略模式和回调机制在LINQ中的应用Lambda表达式是LINQ方法语法的核心,用于指定查询条件、投影和排序逻辑与查询语法相比,使用Lambda的方法语法更加灵活和简洁,适合编程式的查询构建Lambda允许在查询中引用局部变量,创建动态查询,极大增强了查询的表达能力和适应性闭包与异步编程Lambda表达式创建闭包,捕获并保留定义环境中的变量这使得异步编程和回调模式实现更加简洁在async/await模式中,Lambda常用于定义异步操作的延续逻辑,简化异步代码流程理解闭包行为对于避免内存泄漏和意外的变量修改至关重要编程基础(简介)GUI WinForms窗体控件Form Controls应用程序的基本容器,承载控件和按钮、文本框等元素,提供用户界面和交互Windows UI处理用户交互功能布局Layout事件Events控制控件位置和大小的机制,如锚定、停靠和响应用户操作的机制,如点击、键盘输入等布局面板是构建桌面应用程序的传统框架,基于事件驱动编程模型开发者可以使用拖放设计器快速构建用户界面,然Windows FormsWinForms Windows后通过代码处理事件和实现业务逻辑虽然相对较老,但仍然是创建简单桌面应用的高效选择WinForms类是应用的核心,表示应用程序窗口它派生自类,提供了窗口的基本功能和事件通过添加各种控件(如、Form WinFormsControl Button、等)到窗体,可以构建丰富的用户界面控件通过属性窗口或代码配置外观和行为,使用事件处理程序响应用户操作TextBox Label常用控件与事件Button TextBoxLabel ListBox/ComboBox最基本的交互控件,用于触接收用户文本输入的控件显示不可编辑文本的控件,显示选项列表的控件,允许发操作主要事件是Click,主要事件包括TextChanged通常用作说明文字没有特单选或多选主要事件是表示用户点击按钮通过设(文本变更)和KeyPress定的交互事件,主要通过SelectedIndexChanged,置Text属性显示按钮文本,(按键按下)通过Text属性设置显示内容,表示选择变更通过Items集ImageAlign和TextAlign控Multiline属性控制是否支持AutoSize控制是否自动调整合添加选项,SelectedItem制文本和图像对齐方式多行文本,ReadOnly设置是大小适应内容获取当前选择项否只读Windows Forms控件提供了丰富的事件模型,使应用程序能够响应用户操作和系统消息事件处理采用基于委托的模式,将事件处理方法连接到控件的事件常见的控件事件包括Load(窗体加载完成)、Click(鼠标点击)、MouseMove(鼠标移动)、KeyDown/KeyUp(键盘按键)等窗体间的数据传递创建窗体传递数据显示窗体获取返回值实例化新窗体对象通过构造函数、属性或方法传值调用Show或ShowDialog方法接收DialogResult或自定义属性值在Windows Forms应用程序中,窗体间数据传递是常见需求最直接的方式是通过窗体的公共属性或方法创建子窗体时,可以设置其属性传入数据;子窗体处理完成后,父窗体可以读取子窗体的属性获取结果这种方式简单直观,适合大多数场景另一种方式是通过构造函数传递数据自定义子窗体构造函数接收所需参数,然后在子窗体内部使用这些数据这种方式确保子窗体创建时即获得必要数据,避免了状态不一致的可能对于复杂数据,可以传递整个对象或集合窗体可以使用Show方法以非模态方式显示,允许用户同时操作多个窗体;或使用ShowDialog方法以模态方式显示,阻止用户操作其他窗体直到当前窗体关闭ShowDialog返回DialogResult枚举值,表示用户如何关闭窗体(如OK、Cancel等),是获取简单结果的有效方式资源管理与本地化嵌入式资源本地化资源将图片、音频等资源嵌入程序集,通过使用.resx资源文件存储不同语言的文本Assembly.GetManifestResourceStre和其他可本地化内容可创建基本资源文am方法访问资源作为程序的一部分,件Strings.resx和特定文化的资源文件无需额外部署,但会增加可执行文件大Strings.zh-CN.resx,系统根据当前文小适合小型必须资源,如图标、小图片化自动选择合适的资源等文化适配通过Thread.CurrentThread.CurrentUICulture或CultureInfo.CurrentUICulture控制应用程序的当前文化本地化不仅包括翻译文本,还包括日期格式、数字格式、货币符号等的适配资源文件.resx是管理应用程序资源的主要方式,不仅支持字符串,还可以包含图像、音频、图标等二进制资源Visual Studio提供了资源编辑器,简化资源添加和编辑编译时,资源文件生成相应的代码,可通过自动生成的类型安全的属性访问资源,如Resources.MyString或Resources.MyImage对于大型或不常用的资源,可以考虑作为外部文件部署,在运行时加载,避免增加应用程序启动时间和内存占用使用外部资源要谨慎处理文件路径和可能的缺失异常无论采用哪种方式,良好的资源组织有助于应用程序的可维护性和可扩展性多线程编程简介Thread类基础线程同步Thread类是.NET中创建和控制线程的基本方式多线程编程中,当多个线程访问共享资源时需要同通过传递ThreadStart或步机制防止冲突C#提供了多种同步原语lock语ParameterizedThreadStart委托创建线程,调用句、Monitor类、Mutex、Semaphore、Start方法启动线程线程可以设置为前台线程或ReaderWriterLock等这些机制可以确保在任何后台线程,后台线程不会阻止应用程序退出时刻只有一个线程修改共享数据,防止数据不一Thread.Sleep方法可暂停当前线程执行致Thread thread=new Thread={private objectlockObj=new object;Console.WriteLine线程工作中...;};public voidUpdateSharedDatathread.Start;{locklockObj{//安全修改共享数据}}线程安全问题多线程环境中的典型问题包括竞态条件(多线程同时修改数据)、死锁(线程互相等待资源)、活锁(线程忙于响应彼此的操作)和线程饥饿(线程无法获得所需资源)良好的线程设计应尽量减少共享状态,合理使用同步机制,避免复杂的锁依赖异步与Await/Async异步编程模型Task类与异步操作异步编程优势C#的异步编程基于Task和TaskT类,代表正在进行的Task代表异步操作,可以通过多种方式创建异步编程提高了应用程序的响应性和资源利用率在I/O密工作async/await关键字简化了异步编程,使异步代码Task.Run提交工作到线程池;集型操作(如网络请求、文件操作)中特别有用,可以释可以像同步代码一样编写和阅读,同时保持非阻塞特性TaskCompletionSource控制任务完成;异步方法自动返放线程而非阻塞等待,使UI保持响应,服务器处理更多并回TaskTask提供了丰富的组合和控制操作,如发请求正确使用异步可以显著提升用户体验和系统吞吐//同步方法Task.WhenAll等待多个任务完成,Task.WhenAny量等待任一任务完成public stringDownloadStringstring url{Task t1=DoWorkAsync;//阻塞当前线程Task t2=DoMoreWorkAsync;return client.DownloadStringurl;await Task.WhenAllt1,t2;}Console.WriteLine所有工作完成;//异步方法public async TaskDownloadStringAsyncstring url{//不阻塞,释放当前线程return awaitclient.DownloadStringTaskAsyncurl;}数据库基础()SQL Server建立连接使用SqlConnection类创建与SQL Server的连接,通过连接字符串指定服务器、数据库和验证信息连接字符串包含服务器地址、数据库名称、身份验证方式等参数,可以使用Windows认证或SQL Server认证执行命令使用SqlCommand类执行SQL命令,包括查询、更新、插入和删除操作命令可以是文本SQL或存储过程,支持参数化查询防止SQL注入ExecuteReader返回结果集,ExecuteNonQuery用于无返回数据的操作,ExecuteScalar返回单个值处理结果使用SqlDataReader遍历结果集,逐行读取数据Read方法移动到下一行,可以通过索引或列名访问各列数据完成后必须关闭数据读取器对于复杂数据处理,可以将结果填充到DataSet或DataTable中进行操作关闭资源使用完数据库资源后,必须正确关闭连接和释放资源建议使用using语句自动管理资源生命周期,确保即使发生异常也能正确释放资源,防止资源泄漏和数据库连接耗尽使用操作数据库ADO.NET连接对象命令对象等等SqlConnection,OleDbConnection SqlCommand,OleDbCommand1•建立与数据库的连接•执行SQL语句或存储过程管理连接状态支持参数化查询••提供事务支持执行不同类型的命令••数据集对象数据读取器等等DataSet,DataTable,DataRow SqlDataReader,OleDbDataReader内存中数据缓存高效前向只读访问••断开式数据处理逐行处理数据••复杂数据操作支持低内存消耗••是框架中的数据访问技术,提供了一套丰富的类库用于连接数据库、执行命令和处理结果它支持两种主要的数据访问模式连接式ADO.NET.NET(使用直接从数据库读取数据)和断开式(使用在内存中缓存数据)DataReader DataSet连接式模式适合处理大量数据,因为它不将所有数据加载到内存;断开式模式适合需要频繁修改和多表操作的场景,允许离线修改数据后一次性更新回数据库充当连接式和断开式模型之间的桥梁,用于填充和更新数据库SqlDataAdapter DataSet简单数据库项目演示数据库设计数据录入界面数据显示与查询学生成绩管理系统通常包含学生、课程和系统提供直观的表单界面,用于录入和编控件以表格形式显示查询DataGridView成绩三个核心表学生表存储学号、姓辑学生信息、课程信息和成绩数据表单结果,支持排序、筛选和分页系统实现名、性别、班级等信息;课程表包含课程中使用接收文本输入,了灵活的查询功能,允许按学生姓名、课TextBox编号、名称、学分等;成绩表则记录学生提供选项列表,程名称、成绩范围等条件筛选数据查询ComboBox在各课程的得分,通常以学号和课程号作方便日期选择数据验结果可以导出为或格式,便于DateTimePicker ExcelPDF为复合主键证确保输入的有效性,如学号的唯一性、分析和打印成绩范围的合理性等文件与目录高级操作文件复制与移动文件删除目录操作File.Copy方法将文件从源位置复File.Delete方法永久删除文件,Directory类提供了创建制到目标位置,可以指定是否覆盖执行前应确认用户意图对于需要CreateDirectory、删除现有文件File.Move不仅能移动保护的文件,可以结合Delete、移动Move目录的方文件,还可以重命名文件这些操File.SetAttributes设置只读属法GetFiles和GetDirectories方作支持异步版本性,或使用第三方库实现回收站功法获取目录内容,可使用搜索模式CopyAsync/MoveAsync,适能删除操作不可逆,代码中应加和递归选项DirectoryInfo对象合处理大文件时避免阻塞入适当的错误处理和确认机制提供类似功能,但面向对象且支持更多属性访问文件监视FileSystemWatcher类监控文件系统变化,如文件创建、删除、修改和重命名通过订阅事件如Created、Deleted和Changed,应用程序可以实时响应文件系统变化,实现自动备份、日志记录或同步功能网络编程基础Socket编程模型TCP/UDP通信异步网络编程Socket是网络通信的基本单元,提供了低级别的网络TCP传输控制协议提供可靠的、面向连接的通信,适为提高性能和响应性,网络操作通常采用异步模式访问C#中,Socket类允许创建TCP或UDP连接,支合需要数据完整性的应用UDP用户数据报协议则是Socket类提供BeginAccept/EndAccept、持同步和异步操作模式服务器端通常创建监听无连接的,不保证传输可靠性,但速度更快,适合实时BeginSend/EndSend等异步方法对在现代C#中,Socket,接受客户端连接;客户端则创建Socket连接应用如游戏或流媒体更推荐使用基于任务的异步模式TAP,结合到服务器async/await简化异步代码//TCP客户端示例//TCP服务器示例Socket client=new//异步接收数据Socket listener=new SocketAddressFamily.InterNetwork,asyncTaskReceiveDataAsyncSocketSocketAddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp;socketSocketType.Stream,ProtocolType.Tcp;client.Connectnew IPEndPoint{listener.Bindnew IPAddress.Parse
127.
0.
0.1,8888;byte[]buffer=new byte
[1024];IPEndPointIPAddress.Any,8888;client.SendEncoding.UTF
8.GetBytesHell intreceived=awaitlistener.Listen10;o,Server!;socket.ReceiveAsyncSocket client=listener.Accept;//阻new ArraySegmentbuffer,塞等待客户端连接SocketFlags.None;stringmessage=Encoding.UTF
8.GetStringbuffer,0,received;Console.WriteLine$收到:{message};}请求与HTTP Web APIHttpClient基础HttpClient是.NET中发送HTTP请求的现代API,支持异步操作和可扩展性它是一个长寿命对象,应该在应用程序级别创建一次并重用,避免端口耗尽问题可以通过HttpClientFactory进行更好的管理发送请求HttpClient提供了不同HTTP方法的专用方法,如GetAsync、PostAsync、PutAsync等请求可以包含头信息、查询参数和请求体对于复杂请求,可以使用HttpRequestMessage配置更多细节,然后通过SendAsync发送处理响应HTTP响应包含状态码、头信息和响应内容常见内容格式包括JSON、XML和HTML使用响应对象的ReadAsStringAsync、ReadAsStreamAsync等方法读取内容,然后根据格式进行解析,如使用System.Text.Json或Newtonsoft.Json解析JSON错误处理网络请求面临多种错误可能网络连接问题、服务器错误、超时等应实现重试策略处理临时故障,使用超时控制等待时间,正确解释HTTP状态码(如404表示资源不存在,500表示服务器错误)与序列化XML JSON功能XML序列化JSON序列化基本API XmlSerializerJsonSerializer命名空间System.Xml.Serialization System.Text.Json序列化示例serializer.Serializewriter,JsonSerializer.Serializeoobj bj反序列化示例serializer.Deserializerea JsonSerializer.Deserializder ejson优点结构化数据,命名空间支持轻量,性能高,JavaScript兼容序列化是将对象转换为可传输或存储格式的过程,反序列化则是将这些数据还原为对象C#提供了多种序列化机制,最常用的是XML和JSON序列化XML适合结构复杂、需要命名空间和模式验证的数据;JSON则因其轻量性和JavaScript兼容性更适合WebAPI和浏览器交互在.NET Core和.NET5+中,推荐使用System.Text.Json进行JSON序列化,它相比传统的Newtonsoft.Json有更好的性能XML序列化使用XmlSerializer类,它通过反射分析类型并生成序列化代码两种技术都支持定制化,如通过特性(Attributes)控制字段名称、忽略特定属性或自定义转换逻辑单元测试与代码调试单元测试框架Visual Studio调试测试驱动开发C#生态系统提供多种单元测试框架,如MSTest、Visual Studio提供强大的调试工具,包括断点、监测试驱动开发TDD是一种开发方法,先编写失败的NUnit和xUnit这些框架提供了断言机制、测试发现视窗口、即时窗口和调用堆栈等断点可以设置条件测试,然后编写最小代码使测试通过,最后重构代码和测试运行器测试项目通常是独立的程序集,引用和操作,实现高级调试场景调试器支持逐行执行提高质量TDD促进简单设计、高测试覆盖率和持续被测试的代码并编写测试用例验证其行为F10,逐过程执行F11和跳出函数Shift+F11,帮验证它特别适合需求明确且相对稳定的场景助开发者精确控制执行流程[Fact]//xUnit测试特性高级调试技巧包括使用条件断点过滤复杂情况;使实施TDD需要良好的单元测试技巧,如使用模拟框架public voidAdd_TwoNumbers_ReturnsSum用数据断点监视变量变化;利用调试器可视化工具观(如Moq)隔离外部依赖;编写清晰、小型、专注的{察复杂数据结构;使用诊断工具分析性能和内存问测试;使用依赖注入和接口提高代码可测试性;避免//Arrange题良好的调试能力是解决复杂问题的关键技能过度复杂的断言和测试逻辑var calculator=new Calculator;//Actint result=calculator.Add2,3;//AssertAssert.Equal5,result;}安全与加密C#应用层安全输入验证、用户认证和权限控制数据安全加密算法、安全存储和传输密码学基础哈希、加密和签名机制提供了完整的加密和安全,位于命名空间对于敏感数据加密,可选择对称加密或非对称加C#API System.Security.Cryptography AES,TripleDES密对称加密速度快但需要安全共享密钥;非对称加密解决了密钥分发问题,常用于数字签名和密钥交换RSA哈希算法用于创建数据的固定长度指纹,不可逆转回原始数据常用于密码存储使用或和数据完整性验证对于密码存储,应使用SHA256SHA
512、等慢速哈希函数并加入随机盐值,防止彩虹表攻击PBKDF2BCrypt开发安全应用的关键实践包括验证所有用户输入防止注入攻击;使用参数化查询防止注入;避免在代码中硬编码密钥和密码;正确实现异常处理避SQL免信息泄露;使用最小权限原则限制程序权限;保持第三方库更新以修复已知漏洞代码规范与项目结构命名规范良好的命名对代码可读性至关重要类、方法、属性等类型成员采用PascalCase首字母大写;变量、参数采用camelCase首字母小写;常量使用全大写和下划线分隔;接口名称前加I前缀;避免使用匈牙利命名法和缩写;名称应清晰表达意图,如AddCustomer而非Add或Proc代码组织一个类应有单一职责,避免上帝类相关功能组织到同一命名空间使用区域#region组织复杂类的代码段字段、属性、构造函数、方法等按逻辑顺序排列保持方法简短,一般不超过30行将公共API放在文件顶部,私有成员放在后面项目结构大型项目通常采用分层架构表示层UI、业务逻辑层BLL、数据访问层DAL和模型层每层作为独立项目,通过接口通信,降低耦合度公共代码如工具类、扩展方法放入共享项目资源文件、配置文件和第三方库各自集中管理使用解决方案文件夹组织相关项目注释与文档使用XML文档注释///描述公共API,包括参数、返回值和异常注释说明为什么而非是什么,代码本身应该表达是什么避免过时或误导性注释使用TODO、HACK、UNDONE等标记指示待完成工作考虑使用自动文档生成工具如DocFX创建API参考文档综合项目案例介绍学生信息管理系统架构库存管理应用核心功能文件加密应用示例代码该系统采用典型的三层架构,展示了实该项目演示了产品信息管理、库存跟踪、这个简单但完整的项目展示了文件、加C#IO际应用中的设计模式和最佳实践表示层订单处理和报表生成等功能的实现系统密、多线程处理和异常管理的实际应API使用构建用户界面;业使用泛型仓储模式管理数据访问,采用用它支持选择文件或目录,使用算Windows FormsAES务逻辑层实现核心功能和业务规则;数据模式分离和业务逻辑,应用工厂法加密内容,并显示操作进度代码演示MVVM UI访问层通过与数据模式创建对象,使用观察者模式(通过事了如何正确使用接口管理资ADO.NET SQLServer IDisposable库交互层与层之间通过接口通信,确保件)实现模块间通信完整展示了面向源,如何优雅处理各种异常情况,以及如C#松耦合和可测试性对象特性在实际项目中的应用何利用异步编程提高用户体验行业应用与发展趋势课程总结与答疑本课程系统地介绍了编程语言的核心概念和应用实践,从基础语法到高级特性全面覆盖我们学习了数据类型、控制结构、面向对象编程原则、C#集合、异常处理、数据库访问、开发等关键知识点,并通过实际项目案例展示了在解决实际问题中的应用UI C#掌握编程需要持续学习和实践建议通过小型项目巩固所学知识,逐步增加项目复杂度;参与开源项目获取实战经验;关注微软官方文档和社区C#博客了解最新发展;参加编程挑战和黑客马拉松锻炼解决问题的能力记住,编程能力的提升是一个循序渐进的过程,持之以恒是成功的关键我们鼓励学生在学习过程中遇到问题及时提问,可以通过课程论坛、电子邮件或在线答疑获取帮助同时,我们准备了进阶学习资源,包括推荐书籍、在线课程和技术社区,支持您继续深入学习和技术栈祝愿大家在编程之路上取得成功!C#.NET。
个人认证
优秀文档
获得点赞 0