使用关节型

能力 C# 使用union类型。但,因为 C# 有联合类型没有真正意义上。故。于 C# 别看美丽的使用。

在本节。我们将讨论如何 C# 使用union类型。除了作为一个库设计师。如何决定是否打开关节类型库(尽管,我个人建议避免跨语言公开联合类型)。

第一个样例,我们定义了一个简单的联合类型Quantity,它有两个构造函数,一个包括整数,还有一个包括浮点数。还提供一个函数getRandomQuantity()。初始化 Quantity 的新实例。

module Strangelights.DemoModule

open System

// type that can represent a discrete or continuousquantity

type Quantity =

| Discrete of int

| Continuous of float

// initalize random number generator

let rand =
new Random()

// create a random quantity

letgetRandomQuantity() =

match rand.Next(1)
with

| 0
->Quantity.Discrete (rand.Next())

| _ ->

Quantity.Continuous

(rand.NextDouble() * float_of_int (rand.Next()))

尽管,我们提供了getRandomQuantity() 去创建 Quantity 类型的新版本号,可是。类型自身也提供了静态方法,去创建组成这个类型的不同构造函数的新实例。这些静态方法在全部联合类型上都可用,它缺省由程序集公开,不须要做不论什么特别的事情,让编译器去创建它。以下的样例演示了怎样从 C# 中使用这些方法:

using System;

using Strangelights;

static class
GetQuantityZeroClass

{

public
static void GetQuantityZero()

{

// initialize both aDiscrete and Continuous quantity

DemoModule.Quantity d =
DemoModule.Quantity.Discrete(12);

DemoModule.Quantity c =
DemoModule.Quantity.Continuous(12.0);

}

}

 

如今,我们已经知道怎样从 C# 中创建联合类型,因此。以下最重要的任务就是决定构造函数属于哪一个特定的Quantity 值。能够有三种方法,以下的两段代码,我先讨论前两种方法,第三种方法要放在本节的最后。

第一种方法是能够对值的Tag 属性的分支选择(switch)。

这个属性是整数,可是。由于联合类型的编译版本号提供的是常量,总是有tag_ 前缀,帮助识别这个整数的含义。因此,假设想使用Tag 属性去找出是哪种类型的Quantity,通常写一个switch 语句,如以下的样例所看到的:

//!!! C# Source !!!

using System;

using Strangelights;

static class
GetQuantityOneClass

{

public
static void GetQuantityOne()

{

// get a randomquantity

DemoModule.Quantity q =
DemoModule.getRandomQuantity();

// use the .Tagproperty to switch over the quatity

switch (q.Tag)

{

case
DemoModule.Quantity.tag_Discrete:

Console.WriteLine("Discretevalue: {0}",q.Discrete1);

break;

case
DemoModule.Quantity.tag_Continuous:

Console.WriteLine("Continuousvalue: {0}",q.Continuous1);

break;

}

}

}

这个样例的执行的结果例如以下:

Discrete value: 65676

假设我们愿意,联合类型的编译形式也提供了一系列方法。前缀都是Is,用測试一个值是否属于联合类型中的特定构造函数。

比如,在联合类型Quantity 中,有两个方法,IsDiscrete() 和IsContinuous()。測试Quantity 是属于Discrete,还是Continuous。

以下的样例就演示了怎样使用:

//!!! C# Source !!!

using System;

using Strangelights;

static class
GetQuantityTwoClass

{

public
static void GetQuantityTwo()

{

// get a randomquantity

DemoModule.Quantity q =
DemoModule.getRandomQuantity();

// use if ... elsechain to display value

if (q.IsDiscrete())

{

Console.WriteLine("Discretevalue: {0}",q.Discrete1);

}

else
if (q.IsContinuous())

{

Console.WriteLine("Continuousvalue: {0}",q.Continuous1);

}

}

}

演示样例的执行结果例如以下:

Discrete value: 2058

由于运行模式匹配所需的代码量过大,所以。这两种方法都不特别令人惬意;且还有风险。假设写的代码例如以下所看到的,检測值是否是Discrete,但错误地使用了Continuous1 属性,就会出错。导致了NullReferenceException 异常。

DemoModule.EasyQuantity q =
DemoModule.getRandomEasyQuantity();

if (q.IsDiscrete())

{

Console.WriteLine("Discretevalue: {0}", q.Continuous1);

}

为给库用户提供很多其它的保障,为联合类型加入成员,运行模式匹配,是一个好办法。以下的样例改动了Quantity 类型,产生新类型EasyQuantity,加入两个成员,把类型转换成整数或浮点数:

module Strangelights.ImprovedModule

open System

//type that can represent a discrete or continuous quantity

//with members to improve interoperability

type
EasyQuantity =

|Discrete of
int

|Continuous of
float

// convert quantity to a float

member x.ToFloat() =

match x
with

| Discrete x -> float x

| Continuous x -> x

// convert quantity to a integer

member x.ToInt() =

match x
with

| Discrete x -> x

| Continuous x -> int x

//initalize random number generator

let rand =
new Random()

//create a random quantity

letgetRandomEasyQuantity() =

match rand.Next(1)
with

| 0 ->
EasyQuantity.Discrete (rand.Next())

| _ ->

EasyQuantity.Continuous

(rand.NextDouble() * float(rand.Next()))

这样,库用户既可把值转换成整数。也能够转换成浮点数,而不必操心模式匹配,就像以下的样例:

 

//!!! C# Source !!!

using System;

using Strangelights;

class
GetQuantityThreeClass

{

public
static void GetQuantityThree()

{

// get a randomquantity

ImprovedModule.EasyQuantity q =
ImprovedModule.getRandomEasyQuantity();

// convert quantityto a float and show it

Console.WriteLine("Value as afloat: {0}",q.ToFloat());

}

}

[

所有样品都没有经过测试的演示。

]

时间: 2024-08-05 23:25:26

使用关节型的相关文章

关节疼

“祖传秘方”有疗效 私自制售也获罪 本报讯(记者吕峰 通讯员张胜利 张聪会) “祖传秘方”被患者使用后确定有效,但因没有生产批文被认定为假药.近日,经河南省新密市检察院提起公诉,乡村医生魏超峰被法院以生产.销售假药罪判处拘役三个月,缓刑六个月,并处罚金3000元. 现年45岁的魏超峰是河南省新密市一名乡村医生,在当地开办了一家诊所,根据岳父传下来的秘方,购买了元胡.桂枝.乳香.甘草等10余种中药材原材料,粉碎成粉末状后配制成胶囊,每粒卖0.2元,专治各类关节痛.从2012年5月至2013年9月份

抗TNF治疗改变JIA患者PBMC基因表达谱,可预测疗效

抗TNF治疗改变JIA患者PBMC基因表达谱,可预测疗效 Moorthy LN, et al. ACR 2007. Presentation No:1713. 背景:我们假设儿童期发生的特发性关节炎(JIA)和SLE的基因表达谱是独特的,抗细胞因子或细胞毒药物将改变之,并可能有预测疗效的价值. 目的:利用核酸微阵列技术,分析Etanercept治疗JIA以及环孢霉素/Rituximab(COME)联合治疗SLE,对患者外周血单个核细胞(PBMC)基因表达谱的影响. 方法:共 有4例活动性JIA[

Histogram of Oriented Gradients for Human Detection 翻译

用于人体检测的方向梯度直方图 Navneet Dalal,Bill Triggs 摘要 我们研究了视觉目标检测的特征集问题,并用线性SVM方法进行人体检测来测试,通过与当前的基于边缘和梯度的描述子进行实验对比,得出方向梯度直方图(Histograms of Oriented Gradient,HOG)描述子在行人检测方面表现更加突出.我们研究了计算过程中每一阶段的影响,得出小尺度梯度(fine-scale gradients).精细方向采样(fine orientation binning).粗

第九弹:HOG

这是物体检测的第一篇,其实物体检测,物体定位,物体分割关联很大,许多模型都能同时实现以上三个功能. 一.论文翻译 摘要 我们研究了视觉目标检测的特征集问题,并用线性SVM方法进行人体检测来测试,通过与当前的基于边缘和梯度的描述子进行实验对比,得出方向梯度直方图(Histograms of Oriented Gradient,HOG)描述子在行人检测方面表现更加突出.我们研究了计算过程中每一阶段的影响,得出小尺度梯度(fine-scale gradients).精细方向采样(fine orient

最具影响力的机器人公司

2016全球最具影响力的50家机器人公司 1. 3D Robotics 3DRobotics是一家专注于机器人的非上市公司.它位于美国加州伯克利第四大街1608号.3DRobotics开发创新.灵活.可靠的私人无人机以及适用于日常探索和商业用途的无人机技术.3DRobotics的Solo智能无人机平台可以为消费者享受捕捉令人激动的航空成像,提供数据分析,实现绘图.测量.3D建模等更多应用. 2. ABB Robotics ABBRobotics 是一家上市公司,专注于工业和操作型机器人.它位于瑞

基于机器视觉的工业机器人定位系统

摘要:建立了一个主动机器视觉定位系统,用于工业机器人对零件工位的精确定位.采用基于区域的匹配和形状特征识别相结合的图像处理方法,该方法经过阈值和形状判据,识别出物体特征.经实验验证,该方法能够快速准确地得到物体的边界和质心,进行数据识别和计算,再结合机器人运动学原理控制机器人实时运动以消除此误差,满足工业机器人自定位的要求. 1. 引言 目前工业机器人仅能在严格定义的结构化环境中执行预定指令动作,缺乏对环境的感知与应变能力,这极大地限制了机器人的应用.利用机器人的视觉控制,不需要预先对工业机器人

win7系统减肥三式,狂减6G多

如何正确诊断白癜风呢http://hz.01ny.cn/bdfzd/6755.html有关白斑病的判断方法有什么http://hz.01ny.cn/bdfzd/6756.html白癜风的初期症状具体有哪些http://hz.01ny.cn/bdfzz/6757.html白癜风在发展期有哪些症状表现http://hz.01ny.cn/bdfzz/6758.html初期牛皮癣的症状表现是什么http://hz.01ny.cn/jbcs/npx/npxzz/6773.html面部牛皮癣的症状http:

ros-安装

1.安装了ubuntu for ros. 运行评论下边那条命令: 2.rtabamp 3.准备安装机器人导航仿真系统:https://blog.csdn.net/wangchao7281/article/details/53526532 https://blog.csdn.net/xu1129005165/article/details/53484720 在ROS中有3个可以模拟机器人的模拟器软件:Gazebo     Stage    ArbotiX(就是RVIz) 你可以任选一个: Gaze

基于 Mathematica 的机器人仿真环境(机械臂篇)[转]

完美的教程,没有之一,收藏学习. 目的 本文手把手教你在 Mathematica 软件中搭建机器人的仿真环境,具体包括以下内容(所使用的版本是 Mathematica 11.1,更早的版本可能缺少某些函数,所以请使用最新版.[email protected]).  1 导入机械臂的三维模型  2 (正/逆)运动学仿真  3 碰撞检测  4 轨迹规划  5 (正/逆)动力学仿真  6 控制方法的验证  不妨先看几个例子: 逆运动学 双臂协作搬运 显示运动痕迹 (平移)零空间运动  无论你是从事机器