When we create a new column for list, SharePoint creates two names for it.
1. External name to display in views, forms
2. Internal name
By default, the name we specify while creating the column is used as display name as well as internal name. However we can change the display name as many times as we want, but can never change the internal name once column is created.
This
Internal Name is only used in any of the query we are performing on the column(For example while writing CAML query or while using the content by query web part).
In most of the scenario’s we may need to change the display name of column as customer demands and at the same time we should make sure that the code we wrote to fetch values from these columns should not be altered every time we change the display name of column.To handle this as a best practice always use the this internal column name in the code-behind as well.
As an example assume that, we have a list names SPList with 2 columns (Title,ItemID) as below

Here an ItemID column is created just be specifying a name in Column Name option. So it has External Name = Internal Name = ItemID)
To find this intenal name of the column ItemID, Go to the list settings and click on column. This Internal name will be in the URL of the browser (field=) for example
http://localhost:2000/_layouts/FldEdit.aspx?List=%7B17ED484C%2DF98A%2D4489%2DA687%2DE24F12AF1C31%7D&Field=
ItemIDso now in the code-behind access this column value like
using (SPSite site = new SPSite("http://localhost:2000/"))
{
using (SPWeb web = site.OpenWeb())
{
SPList list = web.Lists["SPList"];
foreach (SPListItem item in list.Items)
{
Console.WriteLine(item["ItemID"].ToString());
}
Console.Read();
}
}However at the same time if required change the display name of column like

We need not have to change the anything in code as we used internal name there. This is the advantage we have by share point’s behavior of creating two names(External Name and Internal Name) for every column we create.