View
213
Download
0
Tags:
Embed Size (px)
Citation preview
3. Data Types
2Microsoft
Objectives
“.NET is designed around the CTS, or Common Type System. The CTS is what allows assemblies, written in different languages, to work together. To ensure interoperability across languages, Microsoft has also defined the CLS, or Common Language Specification, a subset of the CTS that all languages support. Otherwise, the types in C# are what you would expect from a modern OOPL…”
• The Common Type System• Value vs. reference types• Arrays• Namespaces
3Microsoft
Part 1
• The Common Type System…
4Microsoft
The Common Type System (CTS)
• CTS is based on a hierarchy of classes defined in FCL– all types inherit from Object (all except interface types)
St r i ng Ar r ay Val ueType Except i on Del egat e Cl ass1
Mul t i castDel egat e
Cl ass2
Cl ass3
Obj ect
Enum1
St r uct ur e1EnumPr i mi t i ve t ypes
Bool ean
Byt e
I nt 16
I nt 32
I nt 64
Char
Si ngl e
Doubl e
Deci mal
Dat eTi me
System-defined types
User-defined types
Del egat e1
Ti meSpan
Gui d
5Microsoft
The Common Language Specification (CLS)
• Not all languages support all CTS types and features– C# supports unsigned integer types, VB.NET does not– C# is case sensitive, VB.NET is not– C# supports pointer types (in unsafe mode), VB.NET does not– C# supports operator overloading, VB.NET does not
• CLS was drafted to promote language interoperability– vast majority of classes within FCL are CLS-compliant
6Microsoft
Mapping C# to CTS
• Language keywords map to common CTS classes:
Keyword Description Special format for literalsbool Boolean true false
char 16 bit Unicode character 'A' '\x0041' '\u0041'
sbyte 8 bit signed integer none
byte 8 bit unsigned integer none
short 16 bit signed integer none
ushort 16 bit unsigned integer none
int 32 bit signed integer none
uint 32 bit unsigned integer U suffix
long 64 bit signed integer L or l suffix
ulong 64 bit unsigned integer U/u and L/l suffix
float 32 bit floating point F or f suffix
double 64 bit floating point no suffix
decimal 128 bit high precision M or m suffix
string character sequence "hello", @"C:\dir\file.txt"
7Microsoft
Example
• An example of using types in C#– declare before you use (compiler enforced)– initialize before you use (compiler enforced)
public class App{ public static void Main() { int width, height; width = 2; height = 4;
int area = width * height;
int x; int y = x * 2; ... }}
declarations
decl + initializer
error, x not set
8Microsoft
Type conversion
• Some automatic type conversions available– from smaller to larger types
• Otherwise you need a cast or an explicit conversion…– typecast syntax is type name inside parentheses– conversion based on System.Convert class
int i = 5;double d = 3.2;string s = "496";
d = i;
i = (int) d;
i = System.Convert.ToInt32(s);
implicit conversion
typecast required
conversion required
9Microsoft
Part 2
• Value vs. reference types…
10Microsoft
Value vs. reference types
• C# separates data types into two categories• Value types:
– variable represents a value ("bits")
• Reference types:– variable represents a reference to a heap-based object– actual data resides in the object
int i;i = 10;
10
string s;s = "calico";
"calico"
11Microsoft
How do you know which types are which?
• Memorization!• Though it's pretty obvious based on past experience
– primitive types like bool, int and double are values– remainder are reference types
int i;string s;Customer c1, c2;
i = 23;s = "a message";c1 = null;c2 = new Customer(…);
12Microsoft
Boxing and Unboxing
• When necessary, C# will auto-convert value <==> object– value ==> object is called "boxing"– object ==> value is called "unboxing"
int i, j;object obj;string s;
i = 32;obj = i; // boxed copy!i = 19;j = (int) obj; // unboxed!
s = j.ToString(); // boxed!s = 99.ToString(); // boxed!
13Microsoft
User-defined reference types
• Classes!– for example, Customer class we worked with earlier…
public class Customer{ public string Name; // fields public int ID;
public Customer(string name, int id) // constructor { this.Name = name; this.ID = id; }
public override string ToString() // method { return "Customer: " + this.Name; }}
14Microsoft
Working with reference types…
• Creating, assigning, and comparing:
Customer c1, c2, c3;string s1, s2;
c1 = new Customer("joe hummel", 36259);c2 = new Customer("marybeth lore", 55298);c3 = null; // c3 references no object
c3 = c1; // c3 now references same obj as c1
if (c1 == null) ... // do I ref an object? if (c1 == c2) ... // compares references if (c1.Equals(c2)) ... // compares objects
if (s1 == s2) ... // exception: == overloaded to // compare string data
15Microsoft
Defining equality
• Classes should override Equals
public class Customer{ . . .
public override bool Equals(object obj) { Customer other; if ((obj == null) || (!(obj is Customer))) return false; // definitely not equal
other = (Customer) obj; // typecast to access return this.ID == other.ID; // equal if same id... }
16Microsoft
GetHashCode
• If you override Equals, must also override GetHashCode:
public class Customer{ . . .
public override int GetHashCode() { return this.id.GetHashCode(); }
17Microsoft
Part 3
• Arrays…
18Microsoft
Arrays
• Arrays are reference types– based on Array class in FCL– must be created using new– 0-based indexing– assigned default values (0 for numeric, null for references,
etc.)
int[] a;a = new int[5];
a[0] = 17;a[1] = 32;int x = a[0] + a[1] + a[4];
int l = a.Length;
element access
create
number of elements
19Microsoft
Multi-dimensional arrays
• C# supports arrays as a single object OR array of arrays– latter allows you to implement jagged arrays
Customer[,] twoD;int[][] jagged2D;
// 2D array as single objecttwoD = new Customer[10, 100];twoD[0, 0] = new Customer(…);twoD[9, 99] = new Customer(…);
// 2D array as array of arraysjagged2D = new int[10][];jagged2D[0] = new int[10];jagged2D[1] = new int[20];jagged2D[9] = new int[100];
jagged2D[0][0] = 1;jagged2D[9][99] = 100;
20Microsoft
Part 4
• Namespaces…
21Microsoft
Namespaces
• Namespaces are a means for organizing types– a namespace N is a set of names scoped by N– namespaces are often nested
namespace Workshop{ public class Customer { . . . }
public class Product { . . . }}//namespace
Workshop.Customer
22Microsoft
Example
• Framework Class Library (FCL) contains 1000's of classes– how to organize?– how to avoid name collisions?
• with FCL• within FCL
23Microsoft
FCL namespaces
• FCL's outermost namespace is "System"• FCL technologies nested within System…
Namespace Purpose Assembly
System Core classes, types mscorlib.dll
System.Collections Data structures mscorlib.dll
System.Data Database access System.Data.dll
System.Windows.Forms GUI System.Windows.Forms.dll
System.XML XML processing System.Xml.dll
24Microsoft
Namespace != Assembly
• Orthogonal concepts:– namespace for organization– assembly for packaging
• One namespace could be spread across multiple assemblies• One assembly may contain multiple namesspaces
– e.g. mscorlib.dll
25Microsoft
Summary
• CTS is the common type system– same type system for all languages– types implemented by classes in FCL– fundamental difference between value & reference types
• CLS is the common language specification– types that are guaranteed to work across languages
• Try not to confuse namespaces with assemblies…– namespaces help with organization– assemblies denote implementation / packaging
26Microsoft
References
• Books:– I. Pohl, "C# by Dissection"– S. Lippman, "C# Primer"– J. Mayo, "C# Unleashed"