
C#
文章平均质量分 63
心想才事成
这个作者很懒,什么都没留下…
展开
-
c++ c# 类型转换
//C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试 //c++:HANDLE(void *) ---- c#:System.IntPtr //c++:Byte(unsigned char) ---- c#:System.Byte //c++:SHORT(short) ---- c#:System.Int16 //c++:转载 2016-01-05 19:18:22 · 4414 阅读 · 0 评论 -
6.7 处理列表
6.7 处理列表 在第三章,我们讨论过列表,学习了显式使用递归和模式匹配处理列表,还用 C# 实现了函数式列表类型;第 4 章的示例应用程序就以这种方式使用列表,但是要注意,显式写列表处理并不实用。在这一章,将用到递归模式,因此,你可能已经知道我们下一步要讨论什么了。我们可以使用高阶函数来处理列表,而不必显式使用模式匹配的每种情况;我们已经看到过一些处理 F# 列表的函数,比如 Lis翻译 2014-11-18 14:09:06 · 774 阅读 · 0 评论 -
6.6.1 F# 中函数调用的类型推断
6.6.1 F# 中函数调用的类型推断 虽然,在 F# 中可以用尖括号指定类型参数值,与 C# 中的方式相同,但这种方法很少使用。原因是,当编译器无法推断出所有的信息,需要程序员的帮助时,我们仅在真正需要的地方,添加类型批注。我们用一个示例来演示: > Option.map (fun dt -> dt.Year)(Some(DateTime.Now));;error FS007翻译 2014-11-18 10:23:21 · 1114 阅读 · 0 评论 -
6.1.2.2 F# 的管道运算符
6.1.2.2 F# 的管道运算符 使用管道运算符(|>),能够把函数的第一个参数写在左边,即,在函数名的前面。这是非常有用的,比如,想调用几个函数,处理序列中的值,想要找出第一个处理的值。下面的示例演示了反转 F# 列表,然后,得到一个元素: List.hd(List.rev [1 .. 5]) 这种写法并不优雅,因为,写的操作顺序与执行的顺序相反,且要处理的值在右边,括翻译 2014-10-28 15:04:33 · 1936 阅读 · 0 评论 -
6.3.2 在 C# 中处理计划
6.3.2 在 C# 中处理计划 在 C# 中,我们构建的 MapSchedule 方法,类似于 F# 中的 mapSchedule 函数;另外,它有两个参数:一个是用于计算新日期的函数,另一个是原始计划。因为我们将在 C# 中使用可选值,需要 switch 块和 Tag 属性,这我们在第五章已经看到过。清单6 .9显示了完整的实现。 Listing 6.9 schedule 类翻译 2014-10-31 15:14:17 · 781 阅读 · 0 评论 -
6.1 泛型高阶函数
6.1 泛型高阶函数高阶函数是写泛型函数式代码的一种方法,就是说,相同的代码可针对许多类似但不同的目的重复使用。这是现代编程的关键,因为,它能够写更少的代码,通过构造(factoring)出计算的共同部分。在函数编程和面向对象编程中的泛型代码写泛型代码,通常要对值执行某个操作,但是,由于代码应该是通用的,因此,对值的类型不要有太多的限制,要允许代码进一步扩展的能翻译 2014-10-28 09:00:02 · 846 阅读 · 0 评论 -
6.1.2.1 在 C# 中模拟自定义运算符
6.1.2.1 在 C# 中模拟自定义运算符 在 C# 中,虽然可以重载现有的运算符,但是,不能声明新的运算符。然而,在某种程度上,使用扩展方法,可以实现相同的模式。扩展方法是 C# 3.0 中的一项新功能,下面我们简要介绍一下。 扩展方法(Extension methods) 在 C# 中,每个方法必须被包在类中,处理对象的操作是类声明的一部分,可以使用点表示法来调用方法翻译 2014-10-28 14:36:00 · 2645 阅读 · 0 评论 -
6.6 类型推断
6.6 类型推断 我们曾经讨论过值的类型推断,知道在 C# 3.0 中用 var 关键字,在 F#中用 let 绑定。从本节开始,我们将讨论由 C# 和 F# 共有的另一个方面,当在 C# 中调用泛型方法时,如 Option.Some(清单 5.9)或 Option.Map(清单 6.13),可以显式指定类型参数值,像这样: var dt = Option.Some(DateTim翻译 2014-11-16 11:42:15 · 1043 阅读 · 0 评论 -
6.5.2 C# 中的函数组合
6.5.2 C# 中的函数组合 C# 中的函数组合是可能的,但使用非常有限,这是部分是由于在 C# 中散应用不能很容易使用,但更重要的是,因为大多数操作是用成员来写的,而不是函数。但我们至少可以用 C# 演示同样的想法,清单 6.18 显示了 Compose 方法的实现,以及使用的示例。 清单 6.18实现并使用 Compose 方法 (C#)static Func Compo翻译 2014-11-16 09:27:30 · 1414 阅读 · 0 评论 -
4.4.1 创建用户界面
4.4.1 创建用户界面 这一章,我们将使用 Windows Forms,它在很多方面都很简单,因此,从 F# 中使用其他技术应该不成问题。在 Windows Forms 中,用户界面是由组件(如Form, Button, or PictureBox)构成的,因此,首先要写的是构建用户界面控件的代码。此任务可以通过使用图形设计器进行简化,但我们的应用程序很简单,所以,就手工写代码了。在一些翻译 2014-10-13 14:33:48 · 746 阅读 · 0 评论 -
6.4.4.1 在 C#中使用选项类型
6.4.41 在 C#中使用选项类型 扩展方法能够以流畅的方式来编写使用绑定和映射的代码。由于括号中的数字可能会造成混乱,因此要注意,调用 Map 是嵌套在 lambda 函数中的,作为 Bind 的参数值: Option ReadAndAdd() { returnReadInput().Bind(n => ReadInput().Map(m=> m + n));翻译 2014-11-03 10:58:33 · 996 阅读 · 0 评论 -
6.7.2 理解列表函数的类型签名
6.7.2 理解列表函数的类型签名 前面提到过,我们使用函数来筛选和映射列表,都很直观。在本节,我们将看到它们的类型签名,知道只通过此信息,就可以推断出高阶函数能做什么。当然,在一般情况下,不能从函数的类型就知道它能做什么,但对于泛型和高阶函数,例如那些用来处理列表的函数,通常是可能的。如我们前面所见的,处理泛型值的函数所做的不如单独处理值,因为,不能知道值的所有消息,因此,它们通常要翻译 2014-11-18 15:43:59 · 1380 阅读 · 0 评论 -
6.2.2 C# 中处理元组的方法
6.2.2 C# 中处理元组的方法 在本节,我们将继续处理第三章的泛型 Tuple 类,添加类似于刚才在 F# 中看到的功能。清单 6.6 就是高阶函数 mapFirst 和 mapSecond 的 C# 版本。 清单 6.6 处理元组的扩展方法 (C#)public static class Tuple { publicstatic Tuple MapFirst翻译 2014-10-30 14:36:16 · 1033 阅读 · 0 评论 -
关闭 WMI Explorer 的弹出窗口
关闭 WMI Explorer 的弹出窗口前两天下载了 WMI Explorer,想试用一下。 但是,直接就弹出一个激活的窗口。 如何能保用呢?原创 2015-10-06 19:53:39 · 1706 阅读 · 3 评论 -
8.4.3.2 函数式实现
8.4.3.2 函数式实现 我们不是把基本操作表示为虚方法,通过派生类来填充,而是把它表示为属性,属性的类型是函数类型,Func,函数然后由类的用户提供。清单 8.18 显示了QueryDecision 类的实现,以及创建简单的决策树示例。 清单 8.18 模板方法的简单实现 (C#)class QueryDecision : Decision { public str翻译 2014-12-06 11:11:51 · 865 阅读 · 0 评论 -
8.4.3.1 模板方法模式
8.4.3.1 模板方法模式 一般来说,模板方法模式能够定义算法或类的骨架,在以后填充缺失的部分,在具体的继承类中实现。基类定义的操作后来被填充,用来实现更复杂的操作。图 8.4 以图表形式显示了这一点。图 8.4 基类包含抽象方法 PrimitiveOperation,用于实现 TemplateMethod。缺失部分由继承的类 ConcreteClass 填充。翻译 2014-12-06 10:43:56 · 724 阅读 · 0 评论 -
8.4.3 C# 决策树
8.4.3 C# 决策树 在第五章,我们讨论过 F# 的差别联合和 C# 中的类层次结构之间的关系。在此示例中,我们将使用另一个种类层次结构表示决策树的节点,派生两个额外的类来表示两种不同情况(最后结果和查询)。在函数式版本中,所有的处理逻辑都是在 testClientTree 函数中分别实现的。我们以面向对象的风格,使用访问者模式(visitor pattern)(在第七章讨论过),翻译 2014-12-06 10:30:32 · 3186 阅读 · 0 评论 -
7.1.2 C# 中的函数式数据结构
7.1.2 C# 中的函数式数据结构 我们曾经用 C# 实现过几个函数式不可变数据类型,比如 FuncList 或元组。在 C# 中,是通过以特殊方式写类来实现的,最重要的是,所有属性必须是不可变的,这是通过使用只读字段,或者通过声明的属性具有私有的 setter,且只在类的构造函数中设置来实现。在清单 7.3 中,我们使用第一种方法实现似于类清单 7.1 中 Rect 类型的类。翻译 2014-11-24 11:09:12 · 869 阅读 · 0 评论 -
5.3.2.2 用 C# 模拟差别联合
5.3.2.2 用 C# 模拟差别联合 接下来,我们要看一下同样的功能用 C# 如何实现。我们早先已经提到所有相关的类,因此,假设它们已经实现,因此,只看使用的代码。在本章的后面,我们将讨论另一个有关可选值的示例,包括完整的 C# 实现,因此,将会看到如何写 C# 类层次结构,具有与 F# 差别联合相同的属性。 提示 如果想要查看这个示例完整的源代码,包括类声明,可以从本书翻译 2014-10-21 16:10:19 · 755 阅读 · 0 评论 -
7.5 面向对象的表示方法
7.5 面向对象的表示方法 标准的设计模式可以分为三组:创建、结构和行为(creational, structural, and behavioral)。在这一节,我们将讨论后两组中的几种模式,它们类似于在本章前面用F# 使用的结构。模式的函数式版本不同于面向对象,因为面向对象编程把重点放在添加新类型,而函数编程的重点放在添加新函数,但结构非常相似。 提示 本节假定你有一点翻译 2014-11-27 11:17:32 · 1539 阅读 · 0 评论 -
6.7.3.1 在 C# 中实现 fold
6.7.3.1 在 C# 中实现 fold与 fold 有相同行为的操作,在 .NET 库中也有,但是,名字叫Aggregate(聚合)。通常,它是能够在任何集合类型上运行的扩展方法,我们也可以像 F# 函数一样使用它。清单 6.21 是我们用 C# 3.0 重写前面示例的代码。在 F# 中,我们用元组来保存在聚合过程中的状态。你也许还记得以前的几章中,我们曾提到过,C# 3.0 中的翻译 2014-11-19 15:46:12 · 1187 阅读 · 0 评论 -
6.4.4 实现选项类型的操作
6.4.4 实现选项类型的操作 绑定(bind)和映射(map)的实现有类似的结构,因为,两者都是依据选项值进行模式匹配的高阶函数。我们来看一看 F# 和 C# 的实现,这是在 C# 中实现函数式概念的最好示例。我们先看一下清单 6.14,这是映射操作的实现。 清单 6.14 用 F# 和 C# 实现 map 操作F# InteractiveC#翻译 2014-11-02 21:24:16 · 652 阅读 · 0 评论 -
6.7.2.1 处理列表
6.7.2.1 处理列表 我们看一个有关使用筛选和映射更大的示例,在 F# 库中的两个函数适用于各种集合类型,但我们将只用它来处理我们已经很熟悉的列表;在 C# 中,这些方法可用于任何实现了 IEnumerable 接口的集合,所以,我们将使用泛型 .NET List 类。清单 6.21 显示了我们将要处理数据的初始化。 清单 6.21 有关城市人口的数据 (C# and F#)翻译 2014-11-19 11:02:48 · 893 阅读 · 0 评论 -
5.5.3.1 散函数应用(PARTIAL FUNCTION APPLICATION)
5.5.3.1 散函数应用(PARTIALFUNCTION APPLICATION) 要展示对函数的这种新理解情况,非常重要,让我们把注意力返回到列表。假设有一个数字列表,我们想要给列表中的每个数字都加上 10。在 F# 中,可使用 List.map 函数完成;在 C# 中,可以使用 LINQ 中的 Select 方法: list.Select(n => n + 10) ß C#翻译 2014-10-24 20:08:03 · 798 阅读 · 0 评论 -
5.5.2 函数类型
5.5.2 函数类型 我们已经看到,在 F# 中,用箭头符号写函数值的类型,这在很多方面类似于构造元组的方式。早些时候,我们看到过,可以使用带类星号(int * string)的类型构造器,从其他简单类型,构造出元组类型。构造函数类型的方法类似,只是使用函数类型构造器(int -> string)。在数学意义上,函数就是描述每个可能的输入和返回值之间的关系,因此,不需要指定大量的关系的所有翻译 2014-10-24 11:24:06 · 604 阅读 · 0 评论 -
3.2.2 用 C# 实现元组类型
3.2.2 用 C# 实现元组类型 System 命名空间中实际的 Tuple 类型更复杂一点,但是,我们可以很容易实现在这一章中所需要的功能。我们对其命名与 .NET 类型相同,因此,如果不使用 .NET 4.0,在所有的示例中可以使用我们[这里]所实现的[元组]。清单 3.7 是完整的代码。 清单 3.7 实现清单类型 (C#) public sealed class翻译 2014-09-16 21:05:36 · 1094 阅读 · 0 评论 -
在命名空间下定义类型
在命名空间下定义类型 如果定义的类型要用于其他.NET 语言,应该把它们放在命名空间下,而不是模块中。这是因为模块在被编译成 C# 或其他.NET 语言时,被处理成类,在模块中定义的任何类型都成为这个类型内部的类。虽然对于 C# 来说,这并不是什么大问题,但是,如果用命名空间代替模块,C# 客户端代码看起来会更清晰。这是因为在 C# 中,只用using 语句导入(open)命名空间,而如果翻译 2014-06-23 11:32:57 · 1931 阅读 · 0 评论 -
使用 F# 列表
使用 F# 列表 在 C# 中使用 F# 的列表,是完全可能的,但是,我建议不要用,因为,只要再做一点,就会使事情在 C# 看来更加自然。例如,把列表转换成数组很简单,用List.toArray 函数;转换成System.Collections.Generic.List,用 new ResizeArray()构造函数;转换成System.Collections.Generic.IEnume翻译 2014-06-22 17:56:15 · 1171 阅读 · 0 评论 -
返回元组
返回元组首先,我们讨论为什么应该避免使用元组。如果函数返回元组,用户就必须引用 FSharp.Core.dll;另外,需要使用元组的代码C# 中看并不好。考虑下面的例子,我们定义了函数 hourAndMinute,它从结构 DateTime 中返回时、分。#lightmodule Strangelights.DemoModuleopen System/翻译 2014-06-20 16:03:43 · 1904 阅读 · 0 评论 -
使用联合类型
使用联合类型 可以在 C# 中使用联合类型,但是,由于 C# 没有真正意义上的联合类型,因此,在 C# 中使用看上去不漂亮。在这一节,我们将讨论如何在 C# 中使用联合类型,以及作为库设计人员,如何可以决定库是否公开联合类型(虽然,我个人建议避免跨语言公开联合类型)。第一个例子,我们定义了一个简单的联合类型Quantity,它有两个构造函数,一个包含整数,另一个包含浮点数;还提供一个函翻译 2014-06-22 17:30:38 · 2206 阅读 · 0 评论 -
1.4.3.2 使用 PLINQ 的声明式并行
1.4.3.2 使用 PLINQ 的声明式并行 声明式编程风格提供了另一种写并行程序的方法。我们知道,用声明式写代码,就是进行基元组成。在 LINQ 中,这些基元是查询运算符,比如 where 和 select。使用声明式风格,我们可以很容易替换基元的实现,PLINQ 就是这样做的:我们能够用并行的查询运算符替换标准查询运算符。清单 1.9 是一个查询,更新虚拟游戏中的所有怪物,并删除翻译 2014-07-29 08:39:13 · 1037 阅读 · 0 评论 -
使用 COM 风格的编程接口
使用COM 风格的编程接口 如果不直接使用 COM 库,不创建自己的包装,那么更可能的是使用 COM 风格的编程接口。这是因为现在许多开发商发布应用程序时,提供了首选的互操作程序集(Primary Interop Assemblies),这是预先创建的 COM 包装,因此,我们就不需要再自己考虑用 TlbImp.exe 来创建包装了。 注意更多有关首选的互操作程序集的内容,可以翻译 2014-06-24 09:15:41 · 1138 阅读 · 0 评论 -
定义类和接口
定义类和接口 在 F# 中,有两种方式为函数和类的成员定义参数:“curried”风格,成员可以散(partially)应用,“元组(tuple)”风格,所有成员都必须一次给定。定义类时,如使用元组风格,C# 客户端可以更容易使用这样的类。看下面的例子,在 F# 中定义一个类,其中有一个curried 风格定义的成员CurriedStyle,还有一个元组风格的TupleStyle。翻译 2014-06-23 14:37:16 · 1622 阅读 · 0 评论 -
TPH inheritance 查询的 3 种写法
TPHinheritance查询的 3种写法var USACustomers1 = from c inNWEntities.BaseCustomers where c is USACustomer select c;var USACustomers2 = from c inNWEntities.Ba原创 2013-04-26 16:28:06 · 860 阅读 · 0 评论 -
15.4.1 表示绘图
15.4.1 表示绘图 在第 2 章,我们用形状的概念来演示差别联合。对于绘图应用程序,这将是一个不错的选择,应用程序需要了解形状的结构。对于我们动画库,这不是特别灵活,所以,我们将使用更具扩展性的表示形式。在 C# 中,绘图将是一个接口,有一个方法绘制图形对象。它可以更简单地表示为一个函数,我们还想要隐藏其内部表示形式。 F# 版本将按 C# 的风格,也使用接口。原因是翻译 2011-12-19 16:09:49 · 1095 阅读 · 0 评论 -
3.2.2.1 更好地推断 C# 元组类型
3.2.2.1 更好地推断 C# 元组类型 在继续之前,我们想展示了一个 C# 的技巧,它能使后面使用元组的示例更简明。在前面的示例中,我们必须调用构造函数,创建元组类型的实例,这就要求显式指定类型参数。我们用 C# 3.0 中新的 var 关键字,C# 编译器能够推断变量的类型,但是,我们还可以做得更好。C# 中还有另外一个地方支持类型推断:调用泛型方法。如果调用泛型方法,它的类型参翻译 2014-09-16 22:27:51 · 823 阅读 · 0 评论 -
3.3.3 C# 中的函数式列表
3.3.3 C# 中的函数式列表 要了解函数式列表类型的工作原理,最好的办法是看看如何用 C# 实现同样的功能。有几种方法来表达列表可能为空,或者有头和尾。面向对象的解决方案可能是写一个抽象类 FuncList,它有两个派生类,比如,EmptyList 和 ConsCellList,分别表示种情况。为使代码尽可能简单,我们只使用一个类,有一个属性 IsEmpty,它会告诉我们这个实例是否包翻译 2014-09-25 09:37:19 · 799 阅读 · 0 评论 -
5.5.2.1 函数作为参数值和返回值
5.5.2.1 函数作为参数值和返回值 在第三章,我们已使用过,在 C# 和 F# 中把函数作为参数值,因此,这些基本概念不应该是新的;然而,我们还没有以这种方式使用过 lambda 函数。Lambda 函数是把函数写成另外函数的参数值的最简单方法。清单 5.17 提供了一个简单的示例。在清单中前面的函数,参数为一个数和一个函数,两次调用这个函数,第一次调用的结果作为第二次调用的参数值。翻译 2014-10-24 14:51:32 · 1096 阅读 · 0 评论 -
5.5.1 Lambda 函数
5.5.1 Lambda 函数 在 F# 中,lambda 函数创建的函数,与一般使用 let 绑定的声明相同。在 C# 中,没有任何内置函数的概念,因此,使用方法,或者委托,写的 lambda 函数,被转换为委托或表达式树(在补充材料“C# 中从委托到函数”中,有表达式树的详细内容),但是,在 C# 中,不能使用 lambda 函数声明普通方法;委托的使用,像任何其他值一样,因此,可以作翻译 2014-10-24 09:38:36 · 616 阅读 · 0 评论 -
5.5 函数值
5.5 函数值 我们已经看到过把函数当作值使用的示例(第三章),当时,写过一个汇总列表元素的函数,把其他的函数作为参数值。用这种方式,我们能够把同一个汇总函数,用于不同的目的:我们先用它来计算列表中所有元素的和,后面用来找出集合中的最大元素。处理数据集合可能是展示函数作为值使用之重要的最佳方式。必须要说的是,这个概念的重要性,远不止这种情况,在本书的其余部分将会逐步看到。我们首先来看一翻译 2014-10-23 16:35:43 · 669 阅读 · 0 评论