5.2.1 F# 和 C# 中的多值

728 篇文章 1 订阅
349 篇文章 0 订阅

5.2.1 F# 和 C# 中的多值

 

在第三章讨论元组时,我们用 C# 实现了一个 Tuple 类,与 F# 中的元组有同样的行为。使用元组不是从 C# 的方法中返回多值的通常做法,虽然以函数方式写 C# 代码仍然有用。如果在 C# 中写这个程序,不使用元组,或者不为每一个返回多值的方法声明新的类,可能会使用 out 参数。清单 5.1用一个简单的函数,带余数的除法,演示了这两种方法。

 

清单 5.1 带余数的除法 (F# and C#)

// F# 版本,使用元组

> let divRem(a, b) = (a / b, a % b);;  <-- 返回元组值

val divRem : int * int -> int * int

 

> let (res, rem) = divRem(10, 3);;

val res : int = 3

val rem : int = 1

 

// C# 版本,使用 out 参数

int DivRem(int a, int b, out int rem) {

  rem= a % b;    <-- 在输出参数中,返回余数

  returna / b;

}

 

int rem;

int res = DivRem(10, 3, out rem);

 

代码的F# 版本展示了 F# Interactive 的输出,可以看到,代码很短,这是因为在 F# 中从函数返回多值,比 C# 更重要;C# 3.0 增加了另外一种表示多值的方法,叫匿名类型(anonymous types),它有些限制,因为只在一个方法内才能容易使用,但仍有意义。

 

C# 3.0 中的匿名类型

 

Language Integrated Query (LINQ) 增加的关键功能,是写查询的能力(我们将在第十一章深入讨论有关查询的问题)。查询处理集合,例如,我们可能筛选产品的集合,只选择特定种类的产品,然后,返回每种产品的名称和价格。这就需要匿名类型,因为,在返回名称和价格时,实际上就是返回多值:

 

var query = from p in data.Products

         where p.CategoryID == 1

         select new { Name = p.ProductName, Price = p.UnitPrice };

foreach(var result in query)

  Console.WriteLine(result.Name);

 

匿名类型与元组之间的差别,在于匿名类型的元素是命名的,名字由查询中创建匿名类型的代码指定,能够在后面用于读取元素的值。我们可以用匿名类型,重写前面的示例:

 

int a = 10, b = 3;

var r = new { Remainder = a % b, Result = a/ b };

Console.WriteLine("result={0},remainder={1}", r.Result, r.Remainder);

 

这不是特别有用,因为,匿名类型只能在局部使用。当从方法返回匿名类型时,丢失了编译时的类型信息,再也不可能很方便地访问属性了。

 

我们已经看到,在 C# 中,out 参数与 F# 中元组的使用目的相同,那么,如何从 F# 中,使用现成的、有 out 参数的 .NET 方法呢?很幸运,F# 语言有一个极好的功能,专为此目的而设。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值