zoukankan      html  css  js  c++  java
  • 三值逻辑运算(C#)

    一般来说,在C#对数据库程序设计时变量的类型要和数据库中的字段类型相对应,即需要做变量的数据类型与字段的数据类型映射(数据库中的数据类型和c#的数据类型的映射表),例如string类型对应与Varchar(char)类型。
    
          但是对于数据库中的Bit类型,就无法使用C#中的Boolean值进行对应,原因是Bit型会有三种状态(0,1,null)而Boolean型只能是(True,False),非真即假的状态让Boolean类型无法与数据库中的null对应起来,所以在使用Bit类型转换成C#类型是就需要使用自定义的“三值逻辑”,也就是自己设定一个struct类型。
    
          所以,以下是笔者在晚上找到并略微修改的实现“三值逻辑运算”的C#代码,该代码实现了三种状态(DBNull,False,True),和网上相关代码不同是将DBNull的值设为-1,而将False的值设置成0.笔者认为这样更符合数据库中Bit类型存储的规律。在数据库操作语句的时候:0代表False,1代表True,这更符合Bit类型在数据库中的值的存储方式。
    
          以下是代码部分:
    
     
    
    Code
      1using System;
      2using System.Collections.Generic;
      3using System.Text;
      4
      5namespace Chemmu.Dev.BaseTools
      6{
      7    public struct dbbool
      8    {
      9        //与数据库中Bit类型对应的三种状态
     10        public static readonly dbbool Null = new dbbool(-1);
     11        public static readonly dbbool False = new dbbool(0);
     12        public static readonly dbbool True = new dbbool(1);
     13        public sbyte value;
     14
     15        初始化#region 初始化
     16        private dbbool(int value)
     17        {
     18            this.value = (sbyte)value;
     19        }
     20
     21        public dbbool(bool value)
     22        {
     23            this.value = (value ? (sbyte)1 : (sbyte)0);
     24        }
     25
     26        public dbbool(DBNull value)
     27        {
     28            this.value = (sbyte)-1;
     29        }
     30
     31        public dbbool(object value)
     32        {
     33            if (value == null)
     34            {
     35                throw new ArgumentException("the value must in true, false or dbnull!");
     36            }
     37            if (value.GetType() == typeof(bool))
     38            {
     39                this.value = ((bool)value ? (sbyte)1 : (sbyte)0);
     40                return;
     41            }
     42            if (value.GetType() == typeof(DBNull))
     43            {
     44                this.value = (sbyte)-1;
     45                return;
     46            }
     47            throw new ArgumentException("the value must in true, false or dbnull!");
     48        }
     49        #endregion
     50
     51        /**//// <summary>
     52        /// 显示类型转换
     53        /// </summary>
     54        /// <param name="value"></param>
     55        /// <returns></returns>
     56        public static dbbool Prase(string value)
     57        {
     58            switch (value)
     59            {
     60                case "True":
     61                    return true;
     62                case "False":
     63                    return false;
     64                case "Null":
     65                    return null;
     66                default:
     67                    throw new ArgumentException("The value must in \"True\", \"False\" or \"Null\"!");
     68            }
     69        }
     70
     71        /**//// <summary>
     72        /// 判断是否为空
     73        /// </summary>
     74        public bool IsNull { get { return value == -1; } }
     75        /**//// <summary>
     76        /// 判断是否为True
     77        /// </summary>
     78        public bool IsTrue { get { return value == 1; } }
     79        /**//// <summary>
     80        /// 判断是否为False
     81        /// </summary>
     82        public bool IsFalse { get { return value == 0; } }
     83
     84        dbbool类型与bool、DBNull类型之间的转换#region dbbool类型与bool、DBNull类型之间的转换
     85        public static implicit operator dbbool(bool x)
     86        {
     87            return x ? True : False;
     88        }
     89
     90        public static implicit operator dbbool(DBNull x)
     91        {
     92            return Null;
     93        }
     94
     95        public static explicit operator bool(dbbool x)
     96        {
     97            if (x.value == -1) throw new InvalidOperationException();
     98            return x.value > 0;
     99        }
    100
    101        public static explicit operator DBNull(dbbool x)
    102        {
    103            if (x.value != -1) throw new InvalidOperationException();
    104            return DBNull.Value;
    105        }
    106        #endregion
    107
    108        逻辑运算#region 逻辑运算
    109        public static dbbool operator ==(dbbool x, dbbool y)
    110        {
    111            if (x.value == 0 || y.value == 0) return Null;
    112            return x.value == y.value ? True : False;
    113        }
    114
    115        public static dbbool operator !=(dbbool x, dbbool y)
    116        {
    117            if (x.value == 0 || y.value == 0) return Null;
    118            return x.value != y.value ? True : False;
    119        }
    120
    121        public static dbbool operator !(dbbool x)
    122        {
    123            if (x.value == 0)
    124                return new dbbool(x.value + 1);
    125            if (x.value == 1)
    126                return new dbbool(x.value - 1);
    127            return new dbbool(x.value);
    128        }
    129        #endregion
    130
    131        public override bool Equals(object obj)
    132        {
    133            return base.Equals(obj);
    134        }
    135
    136        public override int GetHashCode()
    137        {
    138            return this.value;
    139        }
    140
    141        public override string ToString()
    142        {
    143            if (value > 0) return "True";
    144            if (value < 0) return "False";
    145            return "Null";
    146        }
    147    }
    148} 
    
    当然,可以根据该算法的基础上增加工厂模式,并扩展出比如“四值逻辑元素”等。
  • 相关阅读:
    TCP三次握手和四次挥手
    shell脚本进阶
    shell脚本编程基础
    centos6/7通用查看系统版本
    OSI与TCP/IP网络模型分层
    RAID基础知识总结
    yum的初步了解与使用
    Red Hat Enterprise Linux 官方正式版镜像下载
    MYSQL的基本使用,以及错误代码的意思
    人生第一次研读MFC截图工具的笔记心得
  • 原文地址:https://www.cnblogs.com/TNSSTAR/p/2653818.html
Copyright © 2011-2022 走看看