《C#函数式程序设计》是一本内容丰富的书籍,涵盖了C#语言、函数式编程和程序设计等多个方面。这本书提供了许多不同类型的实例,这些实例结合了多种方法来解决不同领域的问题。无论是涉及并行计算和高性能计算等复杂问题,还是涉及Web服务和业务逻辑实现等简单用例,本书都能为读者带来丰富的实践经验和解决问题的思路。通过学习本书,读者能够深入了解C#函数式编程的一些特性和技巧,提升自己在程序设计方面的能力。
C#函数式程序设计:经典编程技术在现代项目中的应用
读者评价
内容尚可,没太多新东西。体会FP最好的方法还是尝试使用一下函数式语言,比如F#或是Scala。但我对在团队项目中使用F#还是不太乐观,一是因为代码必须要让团队都能了解且维护,二是C#实在设计得太好。
FP的思想现在又开始流行,硬要用C#去实现还是有点别扭的,但思想理念学习下还是很不错的。
虽然说书有点老了, 讲的还是 C# 4.0 的内容, 但绝大部分内容都适用, 全书主题十分明确, 示例得当, 不拖泥带水.
内容介绍
《C#函数式程序设计:经典编程技术在现代项目中的应用》绝大部分例子通过微软.NET平台上的C# 4.0语言来实现。少数几个例子采用其他语言,但是它们只是起演示作用。如果读者想测试这些例子,但是当前使用的并不是C# 4.0或 Visual Studi0 2010版本,则用C# 3.0或Visual Studi0 2008也能得到同样的效果—在C# 4.0中,新增加的功能并不是很多,而且这些功能都没有应用到例子中。但是,有几个例子利用了.NET Framework的功能(如Parallel Extensions),这些功能只出现在.NET 4.0中。
《C#函数式程序设计:经典编程技术在现代项目中的应用》介绍函数式程序设计的基本概念,以及如何把这些概念应用到C#语言中。作者尽量提供具有实用背景的示例,但是大多数例子只考虑到语言因素。函数式程序设计是一种与代码、算法和程序结构有关的技术——这一点不同于程序的体系结构。当然,它需要与程序的体系结构相兼容。须知,有时很难在太理论化与偏离重点之间做到理想的平衡,但是作者已尽了最大的努力。
在编写《C#函数式程序设计:经典编程技术在现代项目中的应用》时,作者专门开发了一个函数式的辅助代码库,即FCSlib(Functional CSharp Library)。读者在自己的项目中可以随意使用这个库,但是需要指出的是,该库无法提供任何保证。包含这个库代码的下载文件(有关下载文件的更多信息,请参阅“源代码”一节的内容)中还包括一个应用于FCSlib代码的LGPL许可文件。
目录
- 第Ⅰ部分 函数式程序设计引言
- 第1章 函数式程序设计简史
- 第2章 函数式程序设计思想在现代项目中的应用
- 第Ⅱ部分 C#函数式程序设计基础
- 第3章 函数、委托和Lambda表达式
- 第4章 泛型
- 第5章 惰性列表工具——迭代器
- 第6章 用闭包封装数据
- 第7章 代码即数据
- 第Ⅲ部分 用C#实现常用的函数式设计技术
- 第8章 局部套用与部分应用
- 第9章 惰性求值
- 第10章 缓存技术
- 第11章 递归调用
- 第12章 标准高阶函数
- 第13章 序列
- 第14章 由函数构建函数
- 第15章 可选值
- 第16章 防止数据变化
- ……
- 第Ⅳ部分 函数式设计的实际应用
1、尽量避免装箱(将值类型value type转换为引用类型reference type)拆箱带来的性能损耗(数据不停的搬迁于堆区和栈区)。 2、wpf的资源使用可通过:应用程序级资源(App.xaml)、窗体级资源(Window/Page)、文件级资源(资源字典)、对象级资源(控件)。使用级别由里到外。有静态(StaticResource)和动态(DynamicResource)引用之分,静态从其容器开始向上查找(编译时),动态从当前开始查找(运行时)。 3、程序设计开始时请使用Canvas、Grid、StackPanel、DockPanel、WrapPanel或自定义面板布局程序界面。 4、.net(c#)的根类库object及诸多类库均架构于不同的名字空间里,故使用类中函数时候需要应用不同名称空间。C#没有多重继承的概念,但是可以通过接口的多重继承实现,interface实质上就是一个虚函数列表指针,interface不可能实例化而只能通过派生才可以使用。 5、C#的所有类型都被封装成类,包括基本数据类型,这是分装性和面向对象的体现。 6、值类型和引用类型的本质区别是引用下面不是具体数值而是一段内存的地址。C#的引用类型有:string、类、数组、委托、接口。C#对用户隐藏了指针的使用,但其引用、ref、out等以指针具有相似的道理。 7、委托说到底就是为了方便函数调用(通常是异步过程)的函数指针。 8、只要设置了某个对象的DataContext,那么对这个对象的所有子对象都会产生同样的影响。 9、进程是线程的载体,线程是进程的主角。线程间存在同步异步过程,线程同步需要考虑对临界资源的控制与锁定,线程同步的相互协调不是靠线程优先级来控制的,而是使用lock和monitor. lock保证了共享资源的安全和线程执行顺序的合理.针对实例方法构造的线程,于线程函数内使用lock(this){}锁定互斥段代码。针对静态方法构造的线程,于线程函数(静态函数)内使用lock(typeof (class)){}锁定静态资源。 10、如果希望于线程中锁定某一个对象,请使用monitor. 形如: Monitor.Enter(object)........Monitor.Exit(object)期间,别的线程是无法访问该对象的。为了保证对对象的最终释放,请使用try-catch-finally.于finally 中Monitor.Exit(object). 11、请尽量使用委托来降低类与类之间的耦合度,其实委托不单单只是c 或c++中的函数指针,c#的委托更可以实现"多播委托"(+=/-=). 12、从Windows消息传递机制的包装,其具体体现就是在任意事件触发事件后事件调用时候传给事件处理函数的两个参数:Object sender,EventArgs e 。 13、win form 或者wpf 中的组件基本事件已经被.net frame work规定并准备好了,无需我们自己定义这些事件。如 button 的click事件,事件基于委托是不变的,如click事件其实基于public delegate void EventHandler(Object sender,EventArgs e).我们所需要做只是给该事件注册处理函数click += new EventHandler(callbackFunc);然后实现该回调函数。应该记得说过委托(事件机制)很好的处理了类间的耦合与通信。 14、事件应该定义在事件产生的主体里边,事件的触发由主体的实例完成,事件基于委托,委托定义基于事件处理函数,事件通常使用两个参数:Object Sender Sender通常代表着事件主体的实例(this),EventArgs e 通常是全局定义的一个类型。第一个参数用来给事件处理函数传递主体实例以便使用实例中的元素,第二个参数给事件处理函数传递一些辅助信息。 15、多态是一种机制、一种能力,而非某个关键字。它在类的继承中得以实现,在类的方法调用中得以体现。 16、继承父类后重写了父类函数(可省略new修饰符)可将父类函数"隐藏"(Hide),"隐藏"不同于"覆盖/重写"(Override),隐藏是只父类的这个函数还是存在,只是被子类的同名函数"藏起来了"。 17、多态性是于封装性、继承性后OO技术的进一步表现。C#中多态必须有:继承、virtual、override。virtaul标示了函数的"名存实亡"程序执行时可依此尝试发现有没有override链(虚表)的存在,如果存在就调用override链上的最新可用版本。 18、“多”表示在实例化引用变量的时候,根据用户当时的使用情况而不是一来就实例化很多个引用变量(这时候程序已经Release了,不能再修改了,程序员已经不能控制程序了)智能地给出个性化的响应。 19、多态最大的实现意义在于"代码的简化和良好的扩展性",作为OO技术的一大表现,多态为我们竖起了标杆,使用标杆,程序可以根据用户的实际需要动态绑定相关对象并启用服务,此时,代码是程序员不可控的。如此一来,不论在代码的简洁编写还是扩展升级的改动工作都是极大方便的。可考虑按钮等的事件响应函数button1_clicked(object sender,EventArgs e) 其object即是万类之源,其声明的诸多函数都是virtual函数,函数调用时候sender对应实际的子类对象并依据虚表动态定位到子类对象相关的函数,如.Tostring(); 20、如果使用的是基接口而不是基类,那么实现基接口的时候,方法不再需要override关键字。 21、程序集的中间语言,主要是元数据结合反射即可实现vs的object browser和自动代码提示功能。一个程序集能够使用元数据来完整地说明说明自己而不用像c/c++那样使用头文件,称之:自包含性 自描述性。 22、Attribute不是什么“修饰符”,而是一种实例化方式比较特殊的类。 23、不使用new操作符来产生实例,而是使用在方括号里调用构造函数的来产生实例。方括号必需紧挨着放置在被附着目标的前面。 24、Attribute是特性,Property是属性,姑且从名字上这样分开。Attribute是类,在编译的时候被实例化,Attribute的目标是:为元素提供附加信息,他的作用更类似于注释。Property是一个面向对象的概念,提供了对私有字段的访问封装,以get和set访问器方法实现对可读写属性的操作,提供了安全和灵活的数据访问封装。 25、接口就是一套类的“行为规范”,一般是架构师设计出来用于约束程序员以保障团队顺利分工协作的手段,它处于抽象的最顶层,可以多重继承,成员都是纯虚的。 26、WPF UI层与逻辑层要尽可能地剥离(解耦)。 27、WPF UI层与逻辑层的“血管”是数据关联(Data Binding)。 28、数据关联的核心思想是:数据决定UI。UI的作用是Update数据。 29、XAML中标签的元素Name的作用是告诉解析器其对应着一个引用变量,变量名使用Name的值,对应实例的Name属性也使用Name的值。 30、继承自FrameworkElement的诸多控件实例的Name属性具备了作为查找标识的资格。 31、x:Name与Name根本不是一个层面上的东西——Name是直接与元素和面向对象编程相关的东西;x:Name是XAML语言解析层面上的东西。 32、wpf中:x=""通常是命名空间的别名。x: 通常是命名空间下的元素。 33、用C#代码编写的类也可以在XAML文档里声明实例,声明之后我们可以使用XAML的Attribute对实例的 Property进行赋值。为了类型转换我们继承TypeConverter重写ConvertFrom().
经过两月的C#的学习,我从一点都不懂的C#新手也渐渐入门了。C#是运行.NET Framework之上的高级程序设计语言,是我以前学习的C语言基础上更加高级的语言,是一种面向对象的语言。而这学期学习的C++也是面向对象的语言,感觉有异曲同工之妙。我们是从项目开始的深入,从开始的需求分析,界面原型设计,之后界面程序设计。因为我是第一次接触可视化的编程,可以简化太多代码,在编辑代码的错误率也变少了,结合一下C++在QT学习可视化编程,Visual Studio上的可视化编程也变得简单了。因为设计到C语言相关的知识,老师也布置了相关作业复习一下基础知识和与C语言没有的关于对象和类的概念。