65.9K
CodeProject is changing. Read more.
Home

System.Object Members

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.50/5 (2 votes)

Aug 27, 2012

CPOL

4 min read

viewsIcon

8013

System.Object members

System.Object Class Members

I recently started with my blog site and hence, I decided to post something from my old learning notes (of course after polishing it), thinking it could be useful to someone. I am going to talk about System.Object class. It is the ultimate base class for all types in CLR (except pointer types which are not convertible to object instance). This class defines methods which can be utilized by instances of value as well as reference types. Value types in CLR are those types which inherit from either System.ValueType or System.Enum and these two classes in turn derive from System.Object, therefore, all the methods defined in Object class are available to instances of value types as well as reference types. The Object class defines the following operations.

Note: It is important to note that unlike reference type instances, value type instances are stored sans object header in memory and hence, calling virtual methods on value type instances would result in the instance being boxed and so on. Boxing/Un-boxing is performance costly operation and hence, should be avoided.

public virtual bool Equals(object obj);

This method is defined as virtual and therefore, can be overridden by type deriving from object class. It should be overridden to define custom implementation for establishing equality with another object instance. In its default implementation, this method does a reference equality check for reference types and bitwise equality for value types.

Reference equality means the object references that are compared refer to the same object. Bitwise equality means the objects that are compared have the same binary representation.

A derived type might override the Equals method to implements the value equality. Value equality means the compared objects have the same value even though they have different binary representations. For example, consider two decimal objects that represent the number 1.10 and 1.1000. The decimal objects don’t have bitwise equality because they have different binary representations. However, the objects have value equality because the numbers 1.10 and 1.1000 are considered equal for the comparison purpose.

Usage Scenarios: You can use the equality operator (==) or call the Equals method to compare two instances for equality. The call to equality operator would be determined at the compile time depending upon the type of receiver and argument to it, whereas the call to Equals method is a virtual call and would be determined at runtime depending upon the type of receiver, and therefore, would impact the performance. Therefore, it would be advisable to use the equality operator where you wish to use the default CLR implementation for equality and Equals method should be called only when the type you are comparing for equality has its own implementation for Equals method.

Also, calling the Equals method on value types will have far more performance issues, as CLR would need to use reflection to determine the method to be called as value type instances don’t have object header like reference type instances and therefore, you should avoid calling virtual methods on value type instances.

public static bool Equals(object objA, object objB);

Similar to the earlier method in terms of functionality, but this variant is a static method and takes both the objects as parameters.

public virtual int GetHashCode();

This instance method returns the hash code for the current object.

Usage Scenarios: It is useful in situations where the object is being maintained in collections like HashTable or other data structure. A derived type can override this method and provide its own custom implementation.

public Type GetType();

It returns the System.Type instance for the current instance.

Usage Scenario: It is useful in situations where we need to pass the type instance as parameter or need to work with the reflection API.

protected object MemberwiseClone();

It’s a protected method, hence, available to all the classes which inherit from System.Object. This is useful in the cloning operation and the default implementation shallow copies the instance, i.e., creates bit-by-bit copies of value type members and reference type members are copied but the referred data is not.

public static bool ReferenceEquals(object objA, object objB);

It’s a static method which compares two references and returns true if the two point to same object instance.

public virtual string ToString();

It’s a virtual method which can be overridden by the derived class to provide one’s own custom description of an object instance. Ideally, a class must override this method to return some meaningful text which associates with the object instance.

P.S. In addition to blogging, I use Twitter to share tips, links, etc. My Twitter handle is: @girishjjain