03 Data Types

advertisement
3. Data Types
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
Microsoft
2
Part 1
• The Common Type System…
Microsoft
3
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)
System-defined types
Object
User-defined types
String
Array
Primitive types
Microsoft
Boolean
Single
Byte
Double
Int16
Decimal
Int32
DateTime
Int64
TimeSpan
Char
Guid
ValueType
Exception
Delegate
Class1
Enum
Structure1
Multicast
Delegate
Class2
Delegate1
Class3
Enum1
4
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
Microsoft
5
Mapping C# to CTS
• Language keywords map to common CTS classes:
Keyword
Description
Special format for literals
bool
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
character sequence
"hello", @"C:\dir\file.txt"
string
Microsoft
6
Example
• An example of using types in C#
– declare before you use (compiler enforced)
– initialize before you use (compiler enforced)
declarations
public class App
{
public static void Main()
{
int width, height;
width = 2;
height = 4;
decl + initializer
int area = width * height;
error, x not set
int x;
int y = x * 2;
...
}
Microsoft
}
7
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
double
string
implicit conversion
typecast required
conversion required
Microsoft
i = 5;
d = 3.2;
s = "496";
d = i;
i = (int) d;
i = System.Convert.ToInt32(s);
8
Part 2
• Value vs. reference types…
Microsoft
9
Value vs. reference types
• C# separates data types into two categories
• Value types:
– variable represents a value ("bits")
int i;
i = 10;
10
• Reference types:
– variable represents a reference to a heap-based object
– actual data resides in the object
"calico"
string s;
s = "calico";
Microsoft
10
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
string
Customer
i;
s;
c1, c2;
i = 23;
s = "a message";
c1 = null;
c2 = new Customer(…);
Microsoft
11
Boxing and Unboxing
• When necessary, C# will auto-convert value <==> object
– value ==> object is called "boxing"
– object ==> value is called "unboxing"
int
object
string
i
obj
i
j
=
=
=
=
i, j;
obj;
s;
32;
i;
19;
(int) obj;
s = j.ToString();
s = 99.ToString();
Microsoft
// boxed copy!
// unboxed!
// boxed!
// boxed!
12
User-defined reference types
• Classes!
– for example, Customer class we worked with earlier…
public class Customer
{
public string Name;
public int
ID;
// fields
public Customer(string name, int id)
{
this.Name = name;
this.ID
= id;
}
// constructor
public override string ToString()
{ return "Customer: " + this.Name; }
// method
}
Microsoft
13
Working with reference types…
• Creating, assigning, and comparing:
Customer
string
c1, c2, c3;
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) ...
if (c1 == c2) ...
if (c1.Equals(c2)) ...
if (s1 == s2) ...
Microsoft
// do I ref an object?
// compares references
// compares objects
// exception: == overloaded to
//
compare string data
14
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;
return this.ID == other.ID;
// typecast to access
// equal if same id...
}
Microsoft
15
GetHashCode
• If you override Equals, must also override GetHashCode:
public class Customer
{
.
.
.
public override int GetHashCode()
{
return this.id.GetHashCode();
}
Microsoft
16
Part 3
• Arrays…
Microsoft
17
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.)
create
element access
number of elements
Microsoft
int[] a;
a = new int[5];
a[0] = 17;
a[1] = 32;
int x = a[0] + a[1] + a[4];
int l = a.Length;
18
Multi-dimensional arrays
• C# supports arrays as a single object OR array of arrays
– latter allows you to implement jagged arrays
Customer[,]
int[][]
twoD;
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;
Microsoft
19
Part 4
• Namespaces…
Microsoft
20
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
{
.
.
.
}
Workshop.Customer
public class Product
{
.
.
.
}
}//namespace
Microsoft
21
Example
• Framework Class Library (FCL)
contains 1000's of classes
– how to organize?
– how to avoid name collisions?
• with FCL
• within FCL
Microsoft
22
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
Microsoft
23
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
Microsoft
24
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
Microsoft
25
References
• Books:
– I. Pohl, "C# by Dissection"
– S. Lippman, "C# Primer"
– J. Mayo, "C# Unleashed"
Microsoft
26
Download