Quick Introduction To C# Programming Language
Quick Introduction To C# Programming Language
• C# design goals
• Fundamentals of the C# language
– Types, program structure, statements, operators
• Be able to begin writing and debugging C#
programs
– Using the .NET Framework SDK
– Using Visual Studio.NET
• Be able to write individual C# methods
Agenda
• Design Goals of C#
• Hello World
• Program Structure
• Statements
• Types
• Operators
• Using Visual Studio.NET
• Using the .NET Framework SDK
Design Goals of C#
The Big Ideas
• Component-orientation
• Everything is an object
• Robust and durable software
• Preserving your investment
Design Goals of C#
Component-Orientation
• C# is the first “Component-Oriented” language
in the C/C++ family
• What is a component?
– An independent module of reuse and deployment
– Coarser-grained than objects
(objects are language-level constructs)
– Includes multiple classes
– Often language-independent
– In general, component writer and user don’t know
each other, don’t work for the same company, and
don’t use the same language
Design Goals of C#
Component-Orientation
• Component concepts are first class
– Properties, methods, events
– Design-time and run-time attributes
– Integrated documentation using XML
• Enables “one-stop programming”
– No header files, IDL, etc.
– Can be embedded in ASP pages
Design Goals of C#
Everything is an Object
• Traditional views
– C++, Java™: Primitive types are “magic” and do
not interoperate with objects
– Smalltalk, Lisp: Primitive types are objects, but at
some performance cost
• C# unifies with no performance cost
– Deep simplicity throughout system
• Improved extensibility and reusability
– New primitive types: Decimal,
– Collections, etc., work for all types
Design Goals of C#
Robust and Durable Software
• Garbage collection
– No memory leaks and stray pointers
• Exceptions
• Type-safety
– No uninitialized variables, no unsafe casts
• Versioning
• Avoid common errors
– E.g. if (x = y) ...
• One-stop programming
– Fewer moving parts
Design Goals of C#
Preserving Your Investment
• C++ Heritage
– Namespaces, pointers (in unsafe code),
unsigned types, etc.
– Some changes, but no unnecessary sacrifices
• Interoperability
– What software is increasingly about
– C# talks to XML, SOAP, COM, DLLs, and any
.NET Framework language
• Increased productivity
– Short learning curve
– Millions of lines of C# code in .NET
Agenda
• Design Goals of C#
• Hello World
• Program Structure
• Statements
• Types
• Operators
• Using Visual Studio.NET
• Using the .NET Framework SDK
Hello World
using System;
class Hello {
static void Main( ) {
Console.WriteLine("Hello world");
Console.ReadLine(); // Hit enter to finish
}
}
Agenda
• Design Goals of C#
• Hello World
• Program Structure
• Statements
• Types
• Operators
• Using Visual Studio.NET
• Using the .NET Framework SDK
Program Structure
Overview
• Organizing Types
• Namespaces
• References
• Main Method
• Syntax
Program Structure
Organizing Types
• Physical organization
– Types are defined in files
– Files are compiled into
modules
Assembly
– Modules are grouped
Module
into assemblies
File
Type
Program Structure
Namespaces
namespace N1 { // N1
class C1 { // N1.C1
class C2 { // N1.C1.C2
}
}
namespace N2 { // N1.N2
class C2 { // N1.N2.C2
}
}
}
Program Structure
Namespaces
using N1;
C2 c; // Error! C2 is undefined
N1.N2.C2 d; // One of the C2 classes
C1.C2 e; // The other one
Program Structure
Namespaces
using C1 = N1.N2.C1;
using N2 = N1.N2;
C1 a; // Refers to N1.N2.C1
N2.C1 b; // Refers to N1.N2.C1
Program Structure
References
• Identifiers
– Names for types, methods, fields, etc.
– Must be whole word – no white space
– Unicode characters
– Begins with letter or underscore
– Case sensitive
– Must not clash with keyword
• Unless prefixed with @
• Pascal Case vs. Camel Case
Agenda
• Design Goals of C#
• Hello World
• Program Structure
• Statements
• Types
• Operators
• Using Visual Studio.NET
• Using the .NET Framework SDK
Statements
Overview
int a;
int b = 2, c = 3;
a = 1;
Console.WriteLine(a + b + c);
}
Statements
Variables and Constants
Within the scope of a variable or constant it is an
error to declare another variable or constant with
the same name
{
int x;
{
int x; // Error: can’t hide variable x
}
}
Statements
Variables
int i = 0;
while (i < 5) {
...
i++;
} int i = 0;
do {
...
i++;
}
while (i < 5);
while (true) {
...
}
Statements
for Statement
• Need 3 arguments but not required
for (int i=0; i < 5; i++) {
...
}
for (;;) {
...
}
Statements
foreach Statement
• Iteration of arrays
try {
Console.WriteLine("try");
throw new Exception(“message”);
}
catch (ArgumentNullException e) {
Console.WriteLine(“caught null argument");
}
catch {
Console.WriteLine("catch");
}
finally {
Console.WriteLine("finally");
}
Statements
using Statement
• C# uses automatic memory management
(garbage collection)
– Eliminates most memory management problems
• However, it results in non-deterministic
finalization
– No guarantee as to when and if object destructors
are called
Statements
using Statement
• Objects that need to be cleaned up after use
should implement the
System.IDisposable interface
– One method: Dispose()
• The using statement allows you to create an
instance, use it, and then ensure that Dispose
is called when done
– Dispose is guaranteed to be called, as if it were in
a finally block
Statements
using Statement
• Design Goals of C#
• Hello World
• Program Structure
• Statements
• Types
• Operators
• Using Visual Studio.NET
• Using the .NET Framework SDK
Types
Overview
• A C# program is a collection of types
– Classes, structs, enums, interfaces, delegates
• C# provides a set of predefined types
– E.g. int, byte, char, string, object, …
• You can create your own types
• All data and code is defined within
a type
– No global variables, no global functions
Types
Overview
• Types contain:
– Data members
• Fields, constants, arrays
• Events
– Function members
• Methods, operators, constructors, destructors
• Properties, indexers
– Other types
• Classes, structs, enums, interfaces, delegates
Types
Overview
• Types can be instantiated…
– …and then used: call methods,
get and set properties, etc.
• Can convert from one type to another
– Implicitly and explicitly
• Types are organized
– Namespaces, files, assemblies
• There are two categories of types:
value and reference
• Types are arranged in a hierarchy
Types
Unified Type System
• Value types
– Directly contain data
– Cannot be null
• Reference types
– Contain references to objects
– May be null
o b ject
• int x = 123456;
• long y = x; // implicit
• short z = (short)x; // explicit
• double d = 1.2345678901234;
• float f = (float)d; // explicit
• long l = (long)d; // explicit
Types
Unified Type System
• Polymorphism
– The ability to perform an operation on an object
without knowing the precise type of the object
void Poly(object o) {
Console.WriteLine(o.ToString());
}
Poly(42);
Poly(“abcd”);
Poly(12.345678901234m);
Poly(new Point(23,45));
Types
Conversions
• Question: How can we treat value and
reference types polymorphically?
– How does an int (value type) get converted into an
object (reference type)?
• Answer: Boxing!
– Only value types get boxed
– Reference types do not get boxed
Types
Conversions
• Boxing
– Copies a value type into a reference type
(object)
– Each value type has corresponding “hidden”
reference type
– Note that a reference-type copy is made of the
value type
• Value types are never aliased
– Value type is converted implicitly to object, a
reference type
• Essentially an “up cast”
Types
Conversions
• Unboxing
– Inverse operation of boxing
– Copies the value out of the box
• Copies from reference type to value type
– Requires an explicit conversion
• May not succeed (like all explicit conversions)
• Essentially a “down cast”
Types
Conversions
• Boxing and unboxing
Types
Conversions
• Benefits of boxing
– Enables polymorphism across all types
– Collection classes work with all types
– Eliminates need for wrapper classes
– Replaces OLE Automation's Variant
• Lots of examples in .NET Framework
Hashtable t = new Hashtable();
t.Add(0, "zero");
t.Add(1, "one");
string s = string.Format(
t.Add(2, "two");
"Your total was {0} on {1}",
total, date);
Types
Conversions
• Disadvantages of boxing
– Performance cost
• The need for boxing will decrease when the
CLR supports generics (similar to C++
templates)
Types
Predefined Types
• Value
– Integral types
– Floating point types
– decimal
– bool
– char
• Reference
– object
– string
Predefined Types
Value Types
• 128 bits
• Essentially a 96 bit value scaled by a
power of 10
• Decimal values represented precisely
• Doesn’t support signed zeros, infinities
or NaN
C# Type System Type Size (bytes)
decimal System.Decimal 16
Predefined Types
decimal
• F or f: float
• D or d: double
• M or m: decimal
123f // Float
123D // Double
123.456m // Decimal
1.23e2f // Float
12.3E1M // Decimal
Predefined Types
bool
Enumerations enum
Interface interface
• Enum examples
enum Color: byte {
Red = 1,
Green = 2,
Blue = 4,
Black = 0,
White = Red | Green | Blue
}
Color c = Color.Black;
Console.WriteLine(c); // 0
Console.WriteLine(c.Format()); // Black
Types
Enums
• Multidimensional arrays
– Rectangular
• int[,] matR = new int[2,3];
• Can initialize declaratively
• int[,] matR =
new int[2,3] { {1,2,3}, {4,5,6} };
– Jagged
• An array of arrays
• int[][] matJ = new int[2][];
• Must initialize procedurally
Types
Interfaces
• An interface defines a contract
– Includes methods, properties, indexers, events
– Any class or struct implementing an interface must
support all parts of the contract
• Interfaces provide polymorphism
– Many classes and structs may implement
a particular interface
• Contain no implementation
– Must be implemented by a class or struct
Types
Classes
• Members
– Constants, fields, methods, operators,
constructors, destructors
– Properties, indexers, events
– Static and instance members
• Member access
– public, protected, private, internal,
protected internal
• Default is private
• Instantiated with new operator
Types
Structs