3. Data Types
2 Microsoft 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
3 Microsoft Part 1 The Common Type System…
4 Microsoft 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)
5 Microsoft 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
6 Microsoft Mapping C# to CTS Language keywords map to common CTS classes: KeywordDescriptionSpecial format for literals bool Boolean true false char 16 bit Unicode character 'A' '\x0041' '\u0041' sbyte 8 bit signed integernone byte 8 bit unsigned integernone short 16 bit signed integernone ushort 16 bit unsigned integernone int 32 bit signed integernone 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 pointno suffix decimal 128 bit high precision M or m suffix string character sequence
7 Microsoft 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
8 Microsoft 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
9 Microsoft Part 2 Value vs. reference types…
10 Microsoft 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"
11 Microsoft 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(…);
12 Microsoft 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!
13 Microsoft 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; } }
14 Microsoft 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
15 Microsoft 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... }
16 Microsoft GetHashCode If you override Equals, must also override GetHashCode: public class Customer {. public override int GetHashCode() { return this.id.GetHashCode(); }
17 Microsoft Part 3 Arrays…
18 Microsoft 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
19 Microsoft 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 object twoD = new Customer[10, 100]; twoD[0, 0] = new Customer(…); twoD[9, 99] = new Customer(…); // 2D array as array of arrays jagged2D = 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;
20 Microsoft Part 4 Namespaces…
21 Microsoft 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
22 Microsoft Example Framework Class Library (FCL) contains 1000's of classes –how to organize? –how to avoid name collisions? with FCL within FCL
23 Microsoft FCL namespaces FCL's outermost namespace is "System" FCL technologies nested within System… NamespacePurposeAssembly SystemCore classes, typesmscorlib.dll System.CollectionsData structuresmscorlib.dll System.DataDatabase accessSystem.Data.dll System.Windows.FormsGUISystem.Windows.Forms.dll System.XMLXML processingSystem.Xml.dll
24 Microsoft 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
25 Microsoft 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
26 Microsoft References Books: –I. Pohl, "C# by Dissection" –S. Lippman, "C# Primer" –J. Mayo, "C# Unleashed"