Storing Data in C#


As we said before that computer programs work on data so we need to know how we can store data and how we can use this data in our program's code to do our tasks.

To understand how we can store and manipulate data in C# let's take an example of storing 2 integer numbers (integer numbers are the whole numbers like 1,2,3 and 1000 as we will know later).

The computer and the compiler of C# are responsible for allocating memory locations for program's data. For example using C# coding you can tell the compiler to create a location named x that will store integer value also you can tell it to allocate another location called y that will store another number. Figure 2.1 displays our memory after this operation.
 
Figure 2.1

Now the computer memory has 2 memory locations named x and y and as you can see there are enough room for more data. Now let's assume that we set values (numbers) for these locations: x will store 200 and y will store 34 so the next figure 2.2 will displays our memory after this operation.

Figure 2.2



Now this is our memory so suppose that our program contains a normal add operation using the normal math add operator "+" so we will need a third location that will store the total value of (x + y) so let's say we will call it z. Figure 2.3 displays this adding operation.

Figure 2.3

This is was just a simple discussion about storing whole numbers into our memory. What worth noting here is that each of these locations has a name (x, y and z) and each of them know exactly that it will store whole numbers (integers) and not another type of data so if you try to store a text like "Hello" in these locations the compiler will generate an error and you will not be able to perform the adding operation.

Also note that you can change the value stored in these locations. For example, here in our little program x = 200 but for some reason you need to change its value to 2 only so the new value will replace the old one (200) and when you perform the adding operation again you will get a new value in the location z.

Now after this very simple introduction let's discuss how we can create these memory locations and how we can specify the type of the stored data.

Variables

Well, a variable is just a memory location that can store data that we can use in our code to perform many kinds of operations like (arithmetic operations, comparison operations and many others). Recall from the last few sections that the memory locations x, y and z are variables and if you note that we have done one arithmetic operation there (we add the values stored in x and y to the variable z). They call it a variable because the value stored in a specific memory location can change (a new value replace the old value) so the expression variable came from the fact that the value stored in the memory location for that variable can be changed.

important note: The value of the variable will not change itself but you will maybe need to change it using code.

One important concept you must grasp here is that each variable must store data of a specific type and that will move us to discuss data types.

Data Types

Data can take many different formats (when storing it in our variables) like whole numbers, floating point numbers, text data, images, and many others. We can divide data types into 2 major categories:

1. Predefined data types (Built-in data types).
2. User defined data types (which we will create in the second part of the book).

The predefined data types built-in inside C# and we will use it whenever we write code and that's why C# design team create them for us because we will use it every time we will create a C# program so they built it in the language. So how we will use these types? The answer is very simple: when defining a variable the C# compiler needs to know which data type you want use for this variable.

Let's take an example of creating and storing data inside 2 variables and after we finish you will understand why it's important to C# compiler to know the type of the data that a variable can store: Suppose we have a variable x and variable y now C# compiler don' know which data type that these variables can store now imagine that x store 3 and y store the text "Alan". Now your program needs to add these variables and store the result inside the variable z. so how C# compiler will add 3 to "Alan"? How can you add a number to a text (3 + Alan)? It's impossible. That's why C# compiler must know the type of data that can be stored in a given variable.

The next sections will introduce the built-in types and a description for each type.

The short data type

short data type store integer numbers (whole numbers) values between the number -32,768 and the number 32,767. In other words, if you have a variable that need to store a number between these 2 ranges then use the short data type so the compiler will understand and allocate the necessary memory space for that type. In fact C# compiler allocate 16 bit for that type. If you try to store a value that exceed the maximum value of the short data type (which is 32,767) then the compiler will generate an error.

The ushort data type

ushort data type store integer numbers too but the range of numbers that can be stored will vary from the short data type. ushort store numbers from 0 to 65,535 and you use it when you need a variable that store only positive numbers from 0 to the maximum range of that time (which 65,535). Also C# will allocate the same 16 bit in memory like the short data type. One of my students asked me the following question:

"Why the compiler allocate 16 bit for both data types (short and ushort) although that the maximum range for ushort is almost the double of the maximum range of the short data type?"

My answer was very simple:
"Look at the minimum range for both types, short data type store from -32,768 to 32,767 which are almost the same for ushort (both will count around 65,535 but short will begin with a negative value of -32,768 to 32,767 and ushort will begin from 0 to 65,535). So if you set back and think about it for a minute you will note that the possible values for both types equal to around 65,535 but the minimum or the beginning range is different for both types. So we have the choice to select between those types and that's depending on our needs. If we need a variable that will store a positive number less the maximum range for the ushort type then we use it and if we need a variable that will store a negative or positive values so short data type will be used.

The int data type

int data type store integer numbers (whole numbers) values between the number -2,147,483,648 and the number 2,147,483,647. C# compiler allocate 32 bit for that type. If you try to store a value that exceed the maximum value of the int data type (which is 2,147,483,647) then the compiler will generate an error.

The uint data type

uint data type store integer numbers (whole numbers) values between the number 0 and the number 4,294,967,295. C# compiler allocate 32 bit for that type. If you try to store a value that exceed the maximum value of the uint data type (which is 4,294,967,295) then the compiler will generate an error. But if you need a wider range of values use the next 2 data types.

The long data type

If the previous data types ranges will not satisfy your needs then you can use the long data type. long data type store numbers (whole numbers) values between the number -9,223,372,036,854,775,808 and the number 9,223,372,036,854,775,807. As you might guess the compiler will allocate more space than the previous types so it will allocate 64 bit for that type.

The ulong data type

I think know you can guess what the "u" letter is for; it's stand for unsigned so that type will not allow a negative values for its range. ulong data type store numbers (whole numbers) values between the number 0 and the number 18,446,744,073,709,551,615 and the same thing as long data type the compiler will allocate 64 bit too for that type.

There is another data type for integral number which can store numbers from 0 to 255 let's go and meet him.

The byte data type

byte data type store numbers from 0 to 255 only and C# compiler will allocate only 8 bit space for that type. Why we will need this very small type? Maybe you need to store or count the number of your class's student which will not exceed 10 or 20 at most.

The sbyte data type

sbyte data type store numbers from -128 to 127 only and C# compiler will allocate only 8 bit space for that type.

These was the data types which are built-in C# for integral numbers but what if you need to store floating point numbers like 1.4, 432.432 and 89383.03939292 C# designers didn't forget that and they created 3 data types for storing floating point numbers. Let's check them

The float data type

float data type is the first of 3 data types that can store floating point numbers and actually this is the smallest of the 3 types. float variables store floating point numbers from 1.5 times 10 to the 45 th (1.5 X 10-45 ) to 3.4 times 10 to the 38 th (3.4 X 1038 ) in 32 bit. And this type has a precision to 7 numbers.

The double data type

double data type variables can store floating point numbers from 5 times 10 to the 324 th (5.0 X 10-324 ) to 1.7 times 10 the 308 th (1.7 X 10308 ) in 64-bit. And this type has a precision to 15-16 numbers.

The decimal data type

decimal data type variables can store 1 times 10 to the 28th 1.0 X 10-28 and 7.9 times 10 to the 28 th 7.9 X 1028 in 128 bit. If you think about this type you will note that it has a greater precision and a smaller range and that's we exactly needs for financial calculations also note that decimal data type has a Precision of 28-29 significant digits.

Why we have 3 floating point data types?

To answer this question I will write the simple next C# application:

using System;
namespace ConsoleApplication2
{
class Class1
{
static void Main(string[] args)
{
float x = 1232.34217F * 1232.34217F;
double y = 1232.34217D * 1232.34217D;
decimal z = 1232.34217M * 1232.34217M;
Console.WriteLine("The float variable x = {0}", x);
Console.WriteLine("The float variable y = {0}", y);
Console.WriteLine("The float variable z = {0}", z);
Console.ReadLine();
}
}
}

Now create a new console application project and then replace the VS. NET auto-generated code with the code above then run the application. You will get the next result from the program output:

The float variable x = 1518667
The double variable y = 1518667.22396031
The decimal variable z = 1518667.2239603089

This is what we have done there:

1. We have created 3 variables of float, double, decimal data types respectively.
2. Then we assign a value to those variables (the value of those variables is the result of the multiplication operation of 1232.34217 * 1232.34217)
3. Then we output the 3 variable's values to the console.

You may think that the value of the 3 variables must be the same because they multiply the same numbers. But this is wrong because we used 3 different data types for these variables. Look again to the float, double, decimal data types and you will note that there is a precision for all of them for example; the float data type variable can be precise to 7 digits only, double to 15-16 and decimal to 28-29 and that's exactly what happened here if you count the digit in each output number you will notice that the first is 7, the second is 15 and the third one which is a decimal variable is 17 digits. So we use only the type that will be useful for us.

important note: We didn't discuss how to write or read C# code so don't worry if you didn't understand the code above. Also note the suffixes (F, D, M) in the numbers above they are useful to the compiler just to tell him that 1.5F is float and 1.5D is decimal. We will discuss it later in the article.

These was the built-in types for integer and floating point numbers but there are more 3 built-in data types that we need to discuss here.

The bool data type

bool data type variables will seem strange concept to non-programmers because of its possible values. There are only 2 possible values to this type true and false. true and false are C# Keywords so when you need a variable of bool data type you must assign it true or false only. You may ask yourself what's the reason of storing only 2 values. In your code you will need to test for many conditions and you will find that this data type variables is the only solution; for example, you need to create a program that will ask the user a question and if the user answer it then the program will ask him another one and so on, if you use a bool variable then you can set the value to true if the user answer the question and to false if the user didn't. Now you can test for this variable's value and if it's true (the user answer the question) then you write the code that will display the next question and if the variable's value is false (the user didn't answer the question) then you will end with program or something else. I mean that it's your responsibility to determine when to use bool variables or other data type variables.

The string data type

In fact we call that type a character string too because this type store characters. string variables store a string of characters like "Michael", "Alan" and "Hello guys, it's me". This type have a special manipulation as we will know later in the book but for now just understand that this type store character string or in other words store text. When you store a string value into your variable delimit it with the double quotation like this: "This is a string".

The char data type

This data type can store characters for most of the known written languages throughout the world. For example you can store the English character 'A' into a char variable or any other character. So char variables can store any character found in your keyboard even the space character or the tab character. When you store a char value into your variable delimit it with a single quote like this: 's' and to store the space character you can type the a single quote then take a space and close it like this: ' ' and the same with the tab character: ' '. But there is more intuitive way to do so as we will know later. C# compiler will allocate 16 bit for char variables.

Still there is another built-in data type called object but I will not mention it here and I will wait until the second part of the book. After data-types section there is an important question.

Why there are many data types for numbers?

Many of you will ask the same question "Why we have many types for storing numbers instead of having only one type to store any number?" The answer is related to memory management. Imagine that we have only one data type for storing any number (integers, floating point numbers) and this data type will allocate for example 256 bit for its value so if you need to store 20 numbers for your program use you will need 20 variables of that data type (20 x 256 = 5120 bits). Now imagine that we have 2000 variables in complex application of that data-type that can store any number we will need (512,000 bits). It's a mass and memory waste.

C# design team address the memory problem and actually they create several data-types with different ranges for storing numbers (byte, sbyte, short, ushort, int, uint, long, ulong, single, double, decimal as we already know). Each type will store a range of numbers for example byte data type will store numbers from 0 to 255 only and it will use only 8 bits of the memory space, the same thing apply to all of the numeric data types they will store a range of numbers and they will allocate only the necessary space for that range so that's how we can save space. To understand that let's look at the next example:

We have an application that needs 3 variables to store numbers so if we have only one data type for storing numbers that will allocate 256 bits for its value then our variables will be like following:

x store the number 20 and there are 256 bits for this variable
y store the number 2000 and there are 256 bits for this variable
z store the number 43546 and there are 256 bits for this variable

So we have 3 variables that allocate (256 x 3) 768 bits of the memory. If you think about it for a minute you will understand that having many data types for storing numbers will be better solution as following:

Now let's use C# data-types to store these numbers into variables (x, y, and z). If you look at the numbers (20, 2000, and 43546) you will notice that we can use (byte, short, and ushort respectively) to store these numbers.

x is a variable of type byte that store the number 20 in only 8 bits
y is a variable of type short that store the number 2000 in only 16 bits
z is a variable of type ushort that store the number 43546 in only 16 bits

Now we have 3 variables that allocate (8 + 16 + 16) 40 bits for its values. So we store the same numbers in 40 bits instead of 768 bits. So instead of having only one big data-type for storing numbers we have different types that can be used to store various ranges of numbers and take up different amounts of memory (8, 16, 32, 64, 128 bits depend on the data type).

Now I think you are ready to know how we can create variables and store values inside them.

Declaring your variables

Until now we discussed what a variable is but we didn't discuss how we can create variables for our programs and how we can use them. In this section we will learn how to do this.

To create a variable in your program you must declare it. Declaring your variable tells the C# compiler information about that variable like the following:

1- What's the data type of that variable?
2- What's the name of that variable?
3- Any other operation that C# compiler will perform behind the scenes.

You can declare a variable by writing its type followed by a space (Whitespace) then its name (identifier) then end the statement with a semicolon. Examples of declaration:

int x;
short y;
decimal u;
string q;

If you are going to declare more than one variable of the same type then you can declare them in one statement like following:

int x,y,z;

Declaring variables using C# data-types keywords

You notice that I colored the data types mentioned above in the blue color and you already know that C# keywords use the color blue and if you look at the table of C# keywords you will notice that each type of C# data types has a keyword in that table. Actually that's because we are using this keyword to tell the C# compiler that we need to declare a variable of a specific type. For example, to declare a variable of type int then you must use the keyword int in the statement to tell the C# compiler about this operation and if you need to declare a variable of type long then use the keywords long and the same thing with all built-in data types.

Declaring your variable inside a block of code

As we already know that a block of code is a series of related statements that delimited with "{ }". When you write C# code almost all the time you will write it inside a block of code so it"s critical for you to understand where you can use your declared variables.

When you declare a variable you can use it only in the block of code where you declared it or in a nested block of code only. To understand this we must give an example:

{
int x; // in this outer block you can use x only
{
int y; // in this inner block you can use both x and y
}
}

This is not a valid C# code but I wrote it only for explaining this section. Here we have 2 nested blocks of code. In the outer block we declared a variable called x of type integer (int) and in the inner block we declared a variable called y of type integer (int). x is valid in the block of code that declare it (the outer one) also x is valid in the inner block because the inner block considered to be part of the outer block so if you declared a variable in a block of code any inner block can access it. y is valid in the block of code which declared it (the inner block) only and is not valid in the outer block of code because the outer block of code don't know about it. That's why a block of code exists so the variables inside the block only valid in the block.

Assigning values

After we declare a variable you will need to store a value inside that variable in other words, you will need to initialize it with a value or assign a value to that variable. Assigning a value to a variable is very simple just write the variable name followed by a space then followed by the assignment operator "=" (we will learn about it later) followed by the value that you want to assign to your variable then end your statement with a semicolon like following:

{
int x;
long y;
double z;
x = 3;
y = 40334;
z = 123.4543;
}


This is a block of code that contains 3 variables followed by 3 assignment statements (statements which assign a value to a variable).

important note: The assignment operator "=" is different of the equal operator that you study in Algebra and we will discuss it later.

You must initial (assign a value to the variable) your variables before you can use them or you will get the next compilation error:

error CS0165: Use of unassigned local variable

If you think about it for a minute you will understand that this C# feature will reduce applications bugs because you are sure that all your variables will have values before you can use it. To understand that let's assume that we have 3 variables and we need to add 2 of them (x and y) and store the result in z. If we can use variables before initializing them then maybe x or y will not have a value so maybe if x contains a value of 5 and y have no value so x + y means 5 + nothing and it's a bug. But C# design team addresses this problem and the compiler will generate an error if you tried to use unassigned variable.

You can declare and initialize your variables in only one statement as following:

int x = 3;}
long y = 40334;
double z = 123.4543;

Here I'm telling the C# compiler to create 3 variable of int, long and double data types respectively and assign values to them in the same statement.

As you already now that C# variables are just memory locations where you can store values and you can change these values (assign new values to these variables). There is another way in C# to have a variable with a fixed value that you can't change it let's see that.

Constant values

Constants are variables whose values can't change once initialized. In fact constants are very useful in some situation when you need a fixed value for your variable. For example, you have a variable called daysInWeek which will store the number of days in the week so the value will be 7. And because this is the only valid possible value for the variable so declaring the variable as constant will be appropriate. So if we have a variable that should never change we will declare it as a constant.

When you declare your variable as a constant its value will never change when it's initialized. Let's see how to declare a variable as a constant.

To declare a variable as a constant use the keyword const in front of the normal declaration statement for example, if you are declaring a variable called daysInWeek of type int you will use the next statement.

int daysInWeek = 7;

Also note that I assign the value 7 to the variable. If you want to declare this variable as a constant just use the keyword const in front of the normal declaration statement like the following:

const int daysInWeek = 7;

This variable now is a constant (its value will never change once you initialized it). You must initialize the constant variable in the same statement where you are declaring it or C# compiler will generate an error. Also you can't reassign a value to the variable or C# compiler will generate another error.

Naming your variables and constants

As you know that variables names are identifiers and we said (in the section of identifiers) that there are certain rules we must obey when choosing our identifiers and again these are:

1. The first character in the name must start with a letter (uppercase or lowercase) or an underscore character "_" like the identifier "_myName".
2. The characters after the first one can be a digit, an underscore character, or a letter (uppercase or lowercase).

So when you name your variables begin the name with a character or underscore and don't begin it with a digit and the rest of the name can contains digits, characters or letters so _HelloVariable, HelloVariable, helloVariable or hellovariable are valid names for variables. Also note that C# is a case-sensitive programming language and the last 4 names are different so C# compiler will think that these are 4 variables.

When you choose variables names don't choose names which is C# keywords, I mean don't choose names like int, using, class, public or is because C# will generate an error and we said that keywords is a preserved words by the language and you have no right to use them as identifiers (names). However if you want to use them put the character "@" in front of the keyword so it will be a valid identifier:

If I want to declare a variable called using (using is a C# keyword) so the compiler will generate an error when I execute the next statement

int using = 8;

Now write the declaration statement as following

int @using = 8;

Now you can execute the statement because @using is not the C# keyword using.

Naming your variables is very important for application development because you may have 1000 variables in your solution and you need to understand the reason of existence for any given variable so choosing meaning names for our variables is an important task for example, if you take a look at the variable named daysInWeek you will understand that it's related to days in the week. Because we can't take spaces between the words in the variable name just begin each new word with a capital letter so the names DaysInWeek or daysInWeek are valid and meaningful variables names.

DaysInWeek is known as the PascalCase naming convention and the variable name daysInWeek is known as the camelCase naming convention. By convention (and also what Microsoft recommend) name your variables on the camelCase way and let the PascalCase for more advanced naming. So I advice you to name your variable on the camelCase way which begin with a small letter for the first word in your variable name and any next words will begin with a capital letter like the variable name daysInWeek.

By Convention, to name your constant use the PascalCase which begin each word (in the variable name) with a capital letter even the first word like the variable name DaysInWeek clear?
 

This was about data types and variables. Wait for my next article about Collections and creating your own ones.