解决空值的策略

  使用Option<T>类型二不是null是解决空值问题的另一种策略。与null相比,Option<T>类型是一个更安全的方法,因为它同样适用于值类型和引用类型。而且它的功能更强大,因为它用“元数据”的方法保存一个值的额外信息,因此允许我们使用某个类型的整个值域,包括null本身。以下是完整代码。

 

    public sealed class Option{private Option() { }public static Option<T> Some<T>(T value){return new Option<T>(value);}public static readonly Option None = new Option();}public static class OptionHelpers{public static Option<T> ToOption<T>(this T val){return Option.Some(val);}public static Option<T> ToNotNullOption<T>(this T val) where T : class{return val != null ? val.ToOption() : Option.None;}}public sealed class Option<T>{private readonly T value;public T Value{get { return value; }}private readonly bool hasValue;public bool HasValue{get { return hasValue; }}public bool IsSome{get { return hasValue; }}public bool IsNone{get { return !hasValue; }}public Option(T value){this.value = value;this.hasValue = true;}private Option(){}private static readonly Option<T> None = new Option<T>();public static bool operator ==(Option<T> a, Option<T> b){return a.HasValue == b.HasValue &&EqualityComparer<T>.Default.Equals(a.Value, b.Value);}public static bool operator !=(Option<T> a, Option<T> b){return !(a == b);}public static implicit operator Option<T>(Option option){return None;}public override int GetHashCode(){int hashCode = hasValue.GetHashCode();if (hasValue)hashCode ^= value.GetHashCode();return hashCode;}public override bool Equals(object obj){return base.Equals(obj);}public Option<R> Bind<R>(Func<T, Option<R>> g){if (IsNone)return Option.None;return g(Value);}}

 

转载于:https://www.cnblogs.com/zhangyuanbo12358/articles/4425373.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux c 内存分配内存,Linuxc - 操作系统内存分配

静态变量是存储在数据段的&#xff0c;在函数中可以共用。全局变量也是存储在数据段的&#xff0c;在全局中可以共用。指针变量本质上是地址&#xff0c;数组变量本质上也是地址。数组是可靠的&#xff0c;不可变的地址。指针变量是不可靠的&#xff0c;可变的。数组本质上是指…

管理linux中文件共享,Linux操作系统文件管理器的共享

在目前最流行的RedHatLinux 9.0中有GNOME和KDE这两个图形桌面。这两个桌面系统中分别有两个不同的文件管理器&#xff1a;在GNOME中是Nautilus(鹦鹉螺)而KDE中是Konqueror&#xff0c;各有不少很实用的特色。其实不管你登录哪个桌面都可以同时使用这两个文件管理器&#xff0c;…

mysql区分大小写搜索

form:http://www.uphtm.com/database/257.html 在默认情况下&#xff0c;MySQL搜索不区分大小写&#xff08;但某些字符集始终区分大小写&#xff0c;如czech&#xff09;。这意味着&#xff0c;如果你使用col_name LIKE a%进行搜索&#xff0c;你将获得以A或a开始的所有列。如…

dos安装深度linux,U盘用grub4dos引导Deepin v20 Beta iso安装的方法

下面为你带来U盘grub4dos引导和linux系统硬盘引导Deepin Linux镜像的方法&#xff0c;可适用在Deepin v20 Beta iso上&#xff0c;亲测可成功安装Deepin v20 Beta iso镜像到硬盘。下载Deepin v20 Beta iso请看&#xff1a;深度操作系统Deepin 20 Beta版本发布ISO下载。一、U盘引…

从内存中加载DLL Delphi版(转)

源&#xff1a;从内存中加载DLL DELPHI版 原文 &#xff1a; http://www.2ccc.com/article.asp?articleid5784 MemLibrary.pas //从内存中加载DLL DELPHI版 unit MemLibrary;interfaceuses Windows;function memLoadLibrary(pLib: Pointer): DWord; function memGetProcAddr…

linux 定时执行kettle6,linux下使用crond定时执行kettle的job

由于第一次碰linux&#xff0c;对其不是很了解&#xff0c;导致这个问题困扰了我近一个月的时间&#xff0c;现在终于解决了&#xff0c;分享给大家。首先&#xff0c;安装jre&#xff0c;配置java环境变量(一)下载jre-6u23-linux-x64.bin下载地址&#xff1a;http://cds-esd.s…

【leetcode】ZigZag Conversion

题目简述 The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility) P A H N A P L S I I G Y I R And then read line by line: "PA…

ld-linux.so.2 重定向,2-Linux重定向和管道、Shell编程.doc

2-Linux重定向和管道、Shell编程评 分实验报告课程名称&#xff1a; 操作系统实验名称&#xff1a; Red Hat Linux操作系统的运用专 业&#xff1a; 信息与计算科学成 员&#xff1a; 庄小俪指导教师&#xff1a; 陆星家完成日期&#xff1a; 2013 年 9月 24日实验二 Linux的重…

linux中文乱码

txt文件在linux环境下打开呈现了乱码状态。 解决方法1&#xff1a;在linux用iconv命令&#xff0c;如乱码文件名为zhongwen.txt&#xff0c;那么在终端输入如下命令&#xff1a; iconv -f gbk -t utf8 zhongwen.txt > zhongwen.txt.utf8 如果eclipse打开后仍是乱码&#xff…

c语言用for编程图形,C语言编程题求解

2009-05-13C语言简单的编程题求解1.从键盘输入一//将四个函数编成四个子函数了&#xff0c;在一个主函数里调用&#xff0c;你若需要&#xff0c;分别取出来用也可以。以下源代码&#xff0c;VS2005编译通过。//1。从键盘输入一行字符&#xff0c;分别统计其中字母字符和数字字…

2.3线性表的链式存储和运算—单链表应用举例

例2.5 已知单链表H&#xff0c;写一算法将其倒置。即实现如图2.22的操作。(a)为倒置前&#xff0c;(b)为倒置后。 算法思路&#xff1a;依次取原链表中的每个结点&#xff0c;将其作为第一个结点插入到新链表中去&#xff0c;指针p用来指向当前结点&#xff0c;p为空时结束。 算…

c语言see函数,vprintf() - C语言库函数

C库函数 int vprintf(const char *format, va_list arg) 发送格式化输出到stdout使用一个参数列表传递给它。声明以下是 vprintf() 函数的声明。intvprintf(constchar*format,va_list arg)参数format -- 这是包含文本的字符串被写入到缓冲。它可以包含嵌入的格式在随后的附加…

js获取checkbox值的方法

js获取checkbox值的方法。分享给大家供大家参考。具体实现方法如下&#xff1a;<html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"> <title>js</title> </head> <script language&q…

c语言占用cpu的程序,Windows下用C语言获取进程cpu使用率,内存使用,IO情况

转自&#xff1a; http://zhangyafeikimi.iteye.com/blog/378658process_stat.h/** file * brief 进程统计信息函数的声明 * author 张亚霏 * date 2009/05/03 * version 0.1 * */ #ifndef PROCESS_STAT_H #define PROCESS_STAT_H #ifdef __cplusplus extern "C" { #…

oracle 本地使用命令导入数据到远程主机

第一步:装载oracle客户端 第二部:配置tnsnames.ora.  db_172.21.1.7 (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 172.21.1.7)(PORT 1526))(CONNECT_DATA (SERVER DEDICATED)(SERVICE_NAME db))) 第三部:打开命令行,执行如下命令: imp netelnusr/netelnusrdb_172.21.1.7…

c语言计算据标准时间多少天,C语言系列--时间处理

首先明确几个概念UTC 协调世界时&#xff0c;又称世界标准时间或世界协调时间。GMT 格林尼治平均时间或格林尼治标准時間&#xff0c;由于地球每天的自转是有些不规则的&#xff0c;而且正在缓慢减速&#xff0c;因此格林威治时间已经不再被作为标准时间使用日历时间&#xff0…

Perl学习笔记(六)--文件(一)

一、文件描述符&#xff1a; 访问文件时用来代表文件的数字。 它是系统资源&#xff0c;系统限制打开的文件描述符数量。 Perl中只在某些系统调用时才使用它 文件句柄&#xff1a; 功能同文件描述符&#xff0c;但是与文件描述符不是一个东西。 Perl使用文件句柄代表文件。 文件…

android mkdirs 不起作用,Android mkdirs()创建一个零字节文件而不是文件夹

在我的Android应用程序中,我试图在SD卡上创建以下文件夹&#xff1a;/mnt/sdcard/OSGiComponents/admin/felix-cache/这是代码&#xff1a;File cacheDir new File( Environment.getExternalStorageDirectory().getAbsolutePath() "/OSGiComponents/admin/felix-cache/&qu…

向ComboBox列表框中添加Enum的全部数据

相当于利用反射的 GetValues与GetNames foreach (HETieXinType theType in Enum.GetValues(typeof(HETieXinType))) foreach (string mode in Enum.GetNames(typeof(BooleanInteractionMode))) { ledResponseModesComboBox.Items.Add(mode); switchResponseModesComboBox.Items…