ARTICLE

Limitations of ArrayLists in C#

Posted by Saurabh Articles | C# Language April 13, 2006
This article discusses some features of ArrayLists and there shortcomings/limitations.
Reader Level:

Generics are new feature provided with version 2.0 of the Microsoft.Net framework. Generic classes and methods combine re-usability, type safety and efficiency in a way that there non-generics counterparts do not/cannot.

In this part some features of ArrayLists and there shortcomings/limitations will be discussed. The code in this article has been written in Visual Studio 2005 in C#.

Earlier ArrayLists used to server the purpose, but that in a certain limit. Moreover, using ArrayLists to store different types came as a good performance cost. At the client end it shows our desired type that we are storing in the ArrayList but internally there's much more that goes on.

Sample the code below:-

System.Collections.ArrayList myList = new System.Collections.ArrayList ();
myList.Add (22);
myList.Add ("C# Generics");
myList.Add (22.45);

The usage convenience that is perceived above comes at a cost. Any reference or value type that is stored or added in the ArrayList (myList) is implicitly upcasted to System.Object type. And while retrieval, the reverse happens - downcasting to the appropriate type takes place.

Moreover, there is compromise on the Type Safety front also.  Consider the code below:-

int item =0;

//This will cause an InvalidCastException

foreach (int x in myList)

{

          Item = item+x;

}

The reason is evident.

In .Net 1.x type-safety was achieved by writing your own typed ArrayList. But again, in that case re-usability was a major issue. Consider the following code:-

using System;

using System.Collections;

using System.Collections.Generic;

using System.Text;

 

namespace ArrayListSample

{

    #region Person Class

    class Person

    {

        String Name;

        Int32 Age;

        String Address;

 

        #region Constructor

        public Person() { }

        public Person(String Name, Int32 Age, String Address)

        {

            Name = Name;

            Age = Age;

            Address = Address;

        }

 

        public Person(String Name, Int32 Age)

        {

            Name = Name;

            Age = Age;

            Address = String.Empty;

        }

        public Person(String Name, String Address)

        {

            Name = Name;

            Age = 0;

            Address = Address;

        }

        public Person(String Name)

        {

            Name = Name;

            Age = 0;

            Address = String.Empty;

        }

        #endregion

    }

    #endregion

 

    #region PeopleCollection Class

    class PeopleCollection : System.Collections.IEnumerable

    {

        private ArrayList arPeople = new ArrayList();

 

        public PeopleCollection()

        {

 

        }

 

        #region Methods

        public void AddPeople(Person p)

        {

            arPeople.Add(p);

        }

 

        public void ClearPeople()

        {

            arPeople.Clear();

        }

 

        int Count;

 

        public int PeopleCount

        {

            get { return Count; }

        }

        #endregion

 

        #region IEnumerable Members

 

        public System.Collections.IEnumerator GetEnumerator()

        {

            return arPeople.GetEnumerator();

        }

 

        #endregion

    }

    #endregion

 

    class Client

    {

        public static void Main()

        {

            PeopleCollection myPeople = new PeopleCollection();           

            myPeople.AddPeople(new Person("Saurabh",24,"Gurgaon"));

            myPeople.AddPeople(new Person("Manu"));

 

            foreach (Person Person in myPeople)

            {

                Console.WriteLine(Person);

            }

            Console.ReadLine();

        }

    }

}

The above code does achieve type safety but then we will have to write an almost identical custom collection for each type we wish to contain. Because:-

myPeople.AddPeople(new Car());

would be a compile time error, since the code/approach above achieves type safety. So at the end of the day it will be a big nightmare !!

So above we find some of the limitations of ArrayLists. In the next article we will find how Generics solve the issues discussed above.

Login to add your contents and source code to this article
post comment
     

the concept is nice. but there are a number of mistakes. first of all, while assigning values through constructor you must use the keyword ' this ' here.(because parameters are same as instance variables) and second is, while display the items in the arraylist using foreach here, must specify object members also Console.WriteLine(person.name); Console.WriteLine(person.age)); ...

Posted by Ranganath prasad Dec 29, 2010

In .net default class modifier is private and  then u havnt inherited person class..... See thru it...

Posted by baalaaji ji Sep 15, 2010

Hi,

Thanks very much for taking time to read my article.

As for ure querry, ArrayLists are internally implemented as LikedLists. But thats a special type of linked list, where all the nodes in the list contain pointers (or address) to the first (zeroeth) element of an array. So in this way its an arrayList, where address to each array's starting element is stored in each node of the linked list. I hope that makes sense.

As for pros and cons of using different dataStructs, i would say that its purely on requirement basis that we choose.

Best Regards,

Saurabh

 

Posted by Saurabh Apr 17, 2006

Mr.Mishra,

I am in a training class learning c# and its a great timing to read your article about the arraylists.

Comment: I enjoyed your article and agree with you 100% percent.

Question: How is arraylist implemented in the memory. Is it implemented like a linked list?

Comment: It will be of a great help if your produce an article, discussing at higher level what are pros and cons of using various collections like arraylists, stacks, queues, Hash table,

and what are the pros and cons of using simple arrays (not a collection).

thanks, regards

nath reddy

vnathvbdotnet@yahoo.com

 

 

Posted by basam nath Apr 13, 2006
COMMENT USING
PREMIUM SPONSORS
DynamicPDF™ product line allows you to dynamically generate PDF documents, merge PDF documents and add new content to existing PDF documents from within your applications.
Get Career Advice from Experts
SPONSORED BY
  • PDF reports have never been easier to create. With our included WYSIWYG Designer, you can layout your reports, set up your data source and let DynamicPDF ReportWriter do the rest.
Join a Chapter