I found this in Int16:
public override bool Equals(object obj) { if (!(obj is short)) return false; else return (int) this == (int) (short) obj; } public bool Equals(short obj) { return (int) this == (int) obj; }
So, I checked Byte and sure enough:
public override bool Equals(object obj) { if (!(obj is byte)) return false; else return (int) this == (int) (byte) obj; } public bool Equals(byte obj) { return (int) this == (int) obj; }
Can you guess how Char.Equals() is implemented?
public override bool Equals(object obj) { if (!(obj is char)) return false; else return (int) this == (int) (char) obj; } public bool Equals(char obj) { return (int) this == (int) obj; }
Even the unsigned int gets cast as a signed int in UInt.Equals(). I was pretty curious, so I looked at some other methods:
public int CompareTo(short value) { return (int) this - (int) value; } public int CompareTo(byte value) { return (int) this - (int) value; } public int CompareTo(char value) { return (int) this - (int) value; }
I took note and discussed it with a few friends. It seems to make sense that on a 32 bit operating system, it'd be optimal to work with 32 bit integers. It turns out, even on a 64 bit architecture, .net is optimized for the Int32. I found this gem online:
Best Practices: Optimizing performance with built-in types
The runtime optimizes the performance of 32-bit integer types (Int32 and UInt32), so use those types for counters and other frequently accessed integral variables.
For floating-point operations, Double is the most efficient type because those operations are optimized by hardware.
MCTS Self-Paced Training Kit (Exam 70-536): Microsoft® .NET Framework 2.0—Application Development Foundation
So storing integer values, no matter the ceiling of your expected value, is best done using Int32, particularly if they'll be operated on heavily like an index to a collection or as a counter in an iteration control structure.
No comments:
Post a Comment