System.Boolean

using System.Runtime.InteropServices;
using System.Globalization;
namespace System
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi), Serializable, ComVisible(true)]
    public struct Boolean : IComparable, IConvertible, IComparable<bool>, IEquatable<bool>
    {
        internal const int True = (int)0x00000001;
        internal const int False = (int)0x00000000;
        internal const string TrueLiteral = "True";
        internal const string FalseLiteral = "False";
        private bool m_value;       //使用的是ILASM的bool关键字的概念
        private static char[] m_trimmableChars;
        public static readonly string TrueString;
        public static readonly string FalseString;
        public override int GetHashCode()
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  brtrue.s   IL_0006

            //IL_0004:  ldc.i4.0
            //IL_0005:  ret

            //IL_0006:  ldc.i4.1
            //IL_0007:  ret
            if (this)
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
        public override string ToString()
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  brtrue.s   IL_000a

            //IL_0004:  ldstr      "False"
            //IL_0009:  ret

            //IL_000a:  ldstr      "True"
            //IL_000f:  ret
            if (this)
            {
                return "True";
            }
            else
            {
                return "False";
            }
        }
        public sealed new virtual string ToString(System.IFormatProvider provider)
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  brtrue.s   IL_000a

            //IL_0004:  ldstr      "False"
            //IL_0009:  ret

            //IL_000a:  ldstr      "True"
            //IL_000f:  ret
            if (this)
            {
                return "True";
            }
            else
            {
                return "False";
            }
        }
        public override bool Equals(object obj)
        {
            //.maxstack  8
            //IL_0000:  ldarg.1
            //IL_0001:  isinst     System.Boolean
            //IL_0006:  brtrue.s   IL_000a

            //IL_0008:  ldc.i4.0
            //IL_0009:  ret

            //IL_000a:  ldarg.0
            //IL_000b:  ldind.i1
            //IL_000c:  ldarg.1
            //IL_000d:  unbox.any  System.Boolean
            //IL_0012:  ceq
            //IL_0014:  ret
            if ((obj as Boolean) == null) return false;
            else return (this == (bool)obj);
        }
        public sealed new virtual bool Equals(bool obj)
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  ldarg.1
            //IL_0003:  ceq
            //IL_0005:  ret
            return (this == obj);
        }
        public sealed new virtual int CompareTo(object obj)
        {
            //.maxstack  8
            //IL_0000:  ldarg.1                              
            //IL_0001:  brtrue.s   IL_0005      

            //IL_0003:  ldc.i4.1
            //IL_0004:  ret

            //IL_0005:  ldarg.1
            //IL_0006:  isinst     System.Boolean
            //IL_000b:  brtrue.s   IL_001d

            //IL_000d:  ldstr      "Arg_MustBeBoolean"
            //IL_0012:  call       string System.Environment::GetResourceString(string)
            //IL_0017:  newobj     instance void System.ArgumentException::.ctor(string)
            //IL_001c:  throw

            //IL_001d:  ldarg.0
            //IL_001e:  ldind.i1
            //IL_001f:  ldarg.1
            //IL_0020:  unbox.any  System.Boolean
            //IL_0025:  bne.un.s   IL_0029

            //IL_0027:  ldc.i4.0
            //IL_0028:  ret

            //IL_0029:  ldarg.0
            //IL_002a:  ldind.i1
            //IL_002b:  brtrue.s   IL_002f

            //IL_002d:  ldc.i4.m1
            //IL_002e:  ret

            //IL_002f:  ldc.i4.1
            //IL_0030:  ret
            if(obj==null) return 1; 
            else
            {
                if ((obj as bool) == null)
                {
                    throw new ArgumentException(Environment.GetResourceString("Arg_MustBeBoolean"));
                }
                else
                {
                    if (this == (bool)obj) return 0;
                    else 
                    {
                        if (this)
                        {
                            return 1;
                        }
                        else
                        {
                            return -1;
                        }
                    }
                } 
            }

        }
        public sealed new virtual int CompareTo(bool @value)
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  ldarg.1
            //IL_0003:  bne.un.s   IL_0007

            //IL_0005:  ldc.i4.0
            //IL_0006:  ret

            //IL_0007:  ldarg.0
            //IL_0008:  ldind.i1
            //IL_0009:  brtrue.s   IL_000d

            //IL_000b:  ldc.i4.m1
            //IL_000c:  ret

            //IL_000d:  ldc.i4.1
            //IL_000e:  ret

            if(this==@value)
            {
                return 0;
            }
            else
            {
                if(this)
                {
                    return 1;
                }
                else
                {
                    return -1;
                }
            }
        }
        public static bool Parse(string @value)
        {
            //.maxstack  2
            //.locals init (bool V_0)
            //IL_0000:  ldarg.0
            //IL_0001:  brtrue.s   IL_000e

            //IL_0003:  ldstr      "value"
            //IL_0008:  newobj     instance void System.ArgumentNullException::.ctor(string)
            //IL_000d:  throw

            //IL_000e:  ldc.i4.0
            //IL_000f:  stloc.0
            //IL_0010:  ldarg.0
            //IL_0011:  ldloca.s   V_0
            //IL_0013:  call       bool System.Boolean::TryParse(string,
            //                                                   bool&)
            //IL_0018:  brtrue.s   IL_002a

            //IL_001a:  ldstr      "Format_BadBoolean"
            //IL_001f:  call       string System.Environment::GetResourceString(string)
            //IL_0024:  newobj     instance void System.FormatException::.ctor(string)
            //IL_0029:  throw

            //IL_002a:  ldloc.0
            //IL_002b:  ret
            bool V_0;
            if (@value == null)
            {
                throw new ArgumentNullException("@value");
            }
            else
            {
                V_0 = false;
                if (Boolean.TryParse(@value, out V_0))
                {
                    return V_0;
                }
                else
                {
                    throw new FormatException(Environment.GetResourceString("Format_BadBoolean"));
                }

            }


        }
        public static bool TryParse(string @value, out bool result)
        {
            //.maxstack  3
            //.locals init (char[] V_0)
            //IL_0000:  ldarg.1
            //IL_0001:  ldc.i4.0
            //IL_0002:  stind.i1
            //IL_0003:  ldarg.0
            //IL_0004:  brtrue.s   IL_0008

            //IL_0006:  ldc.i4.0
            //IL_0007:  ret

            //IL_0008:  ldstr      "True"                      
            //IL_000d:  ldarg.0
            //IL_000e:  ldc.i4.5
            //IL_000f:  callvirt   instance bool System.String::Equals(string,
           //                                                         valuetype System.StringComparison)
            //IL_0014:  brfalse.s  IL_001b

            //IL_0016:  ldarg.1
            //IL_0017:  ldc.i4.1
            //IL_0018:  stind.i1
            //IL_0019:  ldc.i4.1
            //IL_001a:  ret

            //IL_001b:  ldstr      "False"
            //IL_0020:  ldarg.0
            //IL_0021:  ldc.i4.5
            //IL_0022:  callvirt   instance bool System.String::Equals(string,
            //                                                         valuetype System.StringComparison)
            //IL_0027:  brfalse.s  IL_002e

            //IL_0029:  ldarg.1
            //IL_002a:  ldc.i4.0
            //IL_002b:  stind.i1
            //IL_002c:  ldc.i4.1
            //IL_002d:  ret

            //IL_002e:  ldsfld     char[] System.Boolean::m_trimmableChars
            //IL_0033:  brtrue.s   IL_0064

            //IL_0035:  ldsfld     char[] System.String::WhitespaceChars
            //IL_003a:  ldlen
            //IL_003b:  conv.i4
            //IL_003c:  ldc.i4.1
            //IL_003d:  add
            //IL_003e:  newarr     System.Char
            //IL_0043:  stloc.0
            //IL_0044:  ldsfld     char[] System.String::WhitespaceChars
            //IL_0049:  ldloc.0
            //IL_004a:  ldsfld     char[] System.String::WhitespaceChars
            //IL_004f:  ldlen
            //IL_0050:  conv.i4
            //IL_0051:  call       void System.Array::Copy(class System.Array,
            //                                             class System.Array,
            //                                             int32)
            //IL_0056:  ldloc.0
            //IL_0057:  ldloc.0
            //IL_0058:  ldlen
            //IL_0059:  conv.i4
            //IL_005a:  ldc.i4.1
            //IL_005b:  sub
            //IL_005c:  ldc.i4.0
            //IL_005d:  stelem.i2
            //IL_005e:  ldloc.0
            //IL_005f:  stsfld     char[] System.Boolean::m_trimmableChars
            //IL_0064:  ldarg.0
            //IL_0065:  ldsfld     char[] System.Boolean::m_trimmableChars
            //IL_006a:  callvirt   instance string System.String::Trim(char[])
            //IL_006f:  starg.s    'value'
            //IL_0071:  ldstr      "True"
            //IL_0076:  ldarg.0
            //IL_0077:  ldc.i4.5
            //IL_0078:  callvirt   instance bool System.String::Equals(string,
            //                                                         valuetype System.StringComparison)
            //IL_007d:  brfalse.s  IL_0084

            //IL_007f:  ldarg.1
            //IL_0080:  ldc.i4.1
            //IL_0081:  stind.i1
            //IL_0082:  ldc.i4.1
            //IL_0083:  ret

            //IL_0084:  ldstr      "False"
            //IL_0089:  ldarg.0
            //IL_008a:  ldc.i4.5
            //IL_008b:  callvirt   instance bool System.String::Equals(string,
            //                                                         valuetype System.StringComparison)
            //IL_0090:  brfalse.s  IL_0097

            //IL_0092:  ldarg.1
            //IL_0093:  ldc.i4.0
            //IL_0094:  stind.i1
            //IL_0095:  ldc.i4.1
            //IL_0096:  ret

            //IL_0097:  ldc.i4.0
            //IL_0098:  ret

            char[] V_0;
            result = false;
            if (@value == null)
            {
                return false;
            }
            else
            {
                if ("True".Equals(@value, StringComparison.OrdinalIgnoreCase))
                {
                    result = true;
                    return true;
                }
                else
                {
                    if ("False".Equals(@value, StringComparison.OrdinalIgnoreCase))
                    {
                        result = false;
                        return true;
                    }
                    else
                    {
                        if (System.Booleanm_trimmableChars == null)
                        {
                            V_0 = new char[System.String.WhitespaceChars.Length + 1];
                            Array.Copy(String.WhitespaceChars, V_0, String.WhitespaceChars.Length);
                            V_0[V_0.Length - 1] = '\u0000';
                            Boolean.m_trimmableChars = V_0;                            
                        }
                        @value = @value.Trim(Boolean.m_trimmableChars);
                        if ("True".Equals(@value, StringComparison.OrdinalIgnoreCase))
                        {
                            result = true;
                            return true;
                        }
                        else
                        {
                            if ("False".Equals(@value, StringComparison.OrdinalIgnoreCase))
                            {
                                result = false;
                                return true;
                            }
                            else
                            {
                                return false;
                            }
                        }
                    }
                }
            }
        }
        public new virtual sealed System.TypeCode GetTypeCode()
        {
            //.maxstack  8
            //IL_0000:  ldc.i4.3
            //IL_0001:  ret
            return TypeCode.Boolean;
        }
        private new virtual sealed bool IConvertible.ToBoolean(System.IFormatProvider provider)
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  ret
            return this;
        }
        private new virtual sealed char IConvertible.ToChar(System.IFormatProvider provider)
        {
            //.maxstack  5
            //.locals init (object[] V_0)
            //IL_0000:  call       class System.Globalization.CultureInfo System.Globalization.CultureInfo::get_CurrentCulture()
            //IL_0005:  ldstr      "InvalidCast_FromTo"
            //IL_000a:  call       string System.Environment::GetResourceString(string)
            //IL_000f:  ldc.i4.2
            //IL_0010:  newarr     System.Object
            //IL_0015:  stloc.0
            //IL_0016:  ldloc.0
            //IL_0017:  ldc.i4.0
            //IL_0018:  ldstr      "Boolean"
            //IL_001d:  stelem.ref
            //IL_001e:  ldloc.0
            //IL_001f:  ldc.i4.1
            //IL_0020:  ldstr      "Char"
            //IL_0025:  stelem.ref
            //IL_0026:  ldloc.0
            //IL_0027:  call       string System.String::Format(class System.IFormatProvider,
            //                                                  string,
            //                                                  object[])
            //IL_002c:  newobj     instance void System.InvalidCastException::.ctor(string)
            //IL_0031:  throw
            object[] V_0;            
            V_0 = new object[2];
            V_0[0] = "Boolean";
            V_0[1] = "Char";
            throw new InvalidCastException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("InvalidCast_FromTo"), V_0));
        }
        private new virtual sealed sbyte IConvertible.ToSByte(System.IFormatProvider provider)
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  call       int8 System.Convert::ToSByte(bool)
            //IL_0007:  ret
            return Convert.ToSByte(this);
        }
        private new virtual sealed byte IConvertible.ToByte(System.IFormatProvider provider)
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  call       uint8 System.Convert::ToByte(bool)
            //IL_0007:  ret
            return Convert.ToByte(this);

        }
        private new virtual sealed short IConvertible.ToInt16(System.IFormaProvider provider)
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  call       int16 System.Convert::ToInt16(bool)
            //IL_0007:  ret
            return Convert.ToInt16(this);
        }
        private new virtual sealed ushort IConvertible.ToUInt16(System.IFormatProvider provider)
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  call       uint16 System.Convert::ToUInt16(bool)
            //IL_0007:  ret
            return Convert.ToUInt16(this);
        }
        private new virtual sealed int IConvertible.ToInt32(System.IFormatProvider provider)
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  call       int32 System.Convert::ToInt32(bool)
            //IL_0007:  ret
            return Convert.ToInt32(this);
        }
        private new virtual sealed uint IConvertible.ToUInt32(System.IFormatProvider provider)
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  call       uint32 System.Convert::ToUInt32(bool)
            //IL_0007:  ret
            return Convert.ToUInt32(this);
        }
        private new virtual sealed long IConvertible.ToInt64(System.IFormatProvider provider)
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  call       int64 System.Convert::ToInt64(bool)
            //IL_0007:  ret
            return Convert.ToInt64(this);
        }
        private new virtual sealed ulong IConvertible.ToUInt64(System.IFormatProvider provider)
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  call       uint64 System.Convert::ToUInt64(bool)
            //IL_0007:  ret
            return Convert.ToUInt64(this);
        }
        private new virtual sealed float IConvertible.ToSingle(System.IFormatProvider provider)
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  call       float32 System.Convert::ToSingle(bool)
            //IL_0007:  ret
            return Convert.ToSingle(this);
        }
        private new virtual sealed double IConvertible.ToDouble(System.IFormatProvider provider)
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  call       float64 System.Convert::ToDouble(bool)
            //IL_0007:  ret
            return Convert.ToDouble(this);
        }
        private new virtual sealed decimal IConvertible.ToDecimal(System.IFormatProvider provider)
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  call       valuetype System.Decimal System.Convert::ToDecimal(bool)
            //IL_0007:  ret
            return Convert.ToDecimal(this);
        }
        private new virtual sealed DateTime IConvertible.ToDateTime(System.IFormatProvider provider)
        {
            //.maxstack  5
            //.locals init (object[] V_0)
            //IL_0000:  call       class System.Globalization.CultureInfo System.Globalization.CultureInfo::get_CurrentCulture()
            //IL_0005:  ldstr      "InvalidCast_FromTo"
            //IL_000a:  call       string System.Environment::GetResourceString(string)
            //IL_000f:  ldc.i4.2
            //IL_0010:  newarr     System.Object
            //IL_0015:  stloc.0
            //IL_0016:  ldloc.0
            //IL_0017:  ldc.i4.0
            //IL_0018:  ldstr      "Boolean"
            //IL_001d:  stelem.ref
            //IL_001e:  ldloc.0
            //IL_001f:  ldc.i4.1
            //IL_0020:  ldstr      "DateTime"
            //IL_0025:  stelem.ref
            //IL_0026:  ldloc.0
           //IL_0027:  call       string System.String::Format(class System.IFormatProvider,
            //                                                  string,
            //                                                  object[])
            //IL_002c:  newobj     instance void System.InvalidCastException::.ctor(string)
            //IL_0031:  throw
            object[] V_0;
            V_0 = new object[2];
            V_0[0] = "Boolean";
            V_0[1] = "DateTime";
            throw new InvalidCastException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("InvalidCast_FromTo"), V_0));
        }
        private new virtual sealed object IConvertible.ToType(System.Type @type, System.IFormatProvider provider)
        {
            //.maxstack  8
            //IL_0000:  ldarg.0
            //IL_0001:  ldind.i1
            //IL_0002:  box        System.Boolean
            //IL_0007:  ldarg.1
            //IL_0008:  ldarg.2
            //IL_0009:  call       object System.Convert::DefaultToType(class System.IConvertible,
            //                                                          class System.Type,
            //                                                          class System.IFormatProvider)
            //IL_000e:  ret
            return Convert.DefaultToType((IConvertible)this, @type, provider);
        }
        private static Boolean()
        {
            //.maxstack  8
            //IL_0000:  ldstr      "True"
            //IL_0005:  stsfld     string System.Boolean::TrueString
            //IL_000a:  ldstr      "False"
            //IL_000f:  stsfld     string System.Boolean::FalseString
            //IL_0014:  ret
            Boolean.TrueString = "True";
            Boolean.FalseString = "False";
        }
    }

}

posted @ 2010-08-28 16:25  Aegis  阅读(503)  评论(0编辑  收藏  举报