5 // Miguel de Icaza (miguel@ximian.com)
6 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
8 // (C) Ximian, Inc. http://www.ximian.com
9 // (C) 2003 Novell, Inc. http://www.novell.com
13 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
15 // Permission is hereby granted, free of charge, to any person obtaining
16 // a copy of this software and associated documentation files (the
17 // "Software"), to deal in the Software without restriction, including
18 // without limitation the rights to use, copy, modify, merge, publish,
19 // distribute, sublicense, and/or sell copies of the Software, and to
20 // permit persons to whom the Software is furnished to do so, subject to
21 // the following conditions:
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
26 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 using System
.Reflection
;
36 using System
.Runtime
.CompilerServices
;
41 public abstract class ValueType
43 protected ValueType ()
47 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
48 internal extern static bool InternalEquals (object o1
, object o2
, out object[] fields
);
50 // This is also used by RuntimeHelpers
51 internal static bool DefaultEquals (object o1
, object o2
)
58 bool res
= InternalEquals (o1
, o2
, out fields
);
62 for (int i
= 0; i
< fields
.Length
; i
+= 2) {
63 object meVal
= fields
[i
];
64 object youVal
= fields
[i
+ 1];
72 if (!meVal
.Equals (youVal
))
80 // True if this instance and o represent the same type
81 // and have the same value.
83 public override bool Equals (object o
) {
84 return DefaultEquals (this, o
);
87 [MethodImplAttribute (MethodImplOptions
.InternalCall
)]
88 internal extern static int InternalGetHashCode (object o
, out object[] fields
);
91 // Gets a hashcode for this value type using the
92 // bits in the structure
94 public override int GetHashCode ()
97 int result
= InternalGetHashCode (this, out fields
);
100 for (int i
= 0; i
< fields
.Length
; ++i
)
101 if (fields
[i
] != null)
102 result ^
= fields
[i
].GetHashCode ();
108 // Stringified representation of this ValueType.
109 // Must be overriden for better results, by default
110 // it just returns the Type name.
112 public override string ToString ()
114 return GetType ().FullName
;