Patric Boscolo Microsoft Academic Program
Patric Boscolo Microsoft Academic Program
C#
A Component-oriented Language for the Microsoft .NET Framework
Objectives
Introduction to the C# Language
Syntax Concepts Technologies
Contents
Section 1: C# Overview Section 2: Elements of C# Section 3: C# Tools Section 4: Putting It All Together Summary
Section 1: C# Overview
Component-oriented Systems Component Concepts of .NET Why C#?
Component-oriented Systems
COM
Most successful component model in history Only viable commercial component platform Enables cross-organization integration and reuse
However:
COM shows its age
DCOM does not function well over the Internet More component-based systems, more "DLL Hell" Even with maturing tools, still too difficult to implement
Add
True object-orientation and inheritance Native events model Cross-language type system and runtime Extensibility at every level
Why C# ?
First component-oriented language
Builds on COM+ experience Native support for
Namespaces Versioning Attribute-driven development
Power of C with ease of Microsoft Visual Basic Minimal learning curve for everybody Much cleaner than C++ More structured than Visual Basic More powerful than Java
Section 2: Elements of C#
Shape and Structure Understanding the C# Type System Understanding the C# Language
Type System
Builds on common type system of .NET Framework Native access to .NET type system
C# was born out of .NET
Core concepts:
Everything is an object
Everything implicitly inherits from System.Object
Simple Types
Integer Types
byte, sbyte (8bit), short, ushort (16bit) int, uint (32bit), long, ulong (64bit)
Character Types
char (single character) string (rich functionality, by-reference type)
Boolean Type
bool (distinct type, not interchangeable with int)
Enums
Named elements used instead of numbering options Strongly typed, no automatic conversion to int Better to use "Color.Blue" than number expression
More readable, better maintenance Still as lightweight as a plain int
Arrays
Zero based, type bound Built on .NET System.Array class Declared with type and shape, but no bounds
int[] SingleDim; int[,] TwoDim; int [][] Jagged;
Namespaces
Every definition must be contained in a namespace
Avoids name collisions Enforces order Makes API's easier to comprehend
Can and should be nested Group classes and types by semantics Declared with keyword namespace Referenced with using
Interfaces
Declarations of semantics contracts between parties
Enables component orientation
Define structure and semantics for specific purposes Abstract definitions of methods and properties Support (multiple) inheritance Example: interface IPersonAge
{ } int YearOfBirth {get; set;} int GetAgeToday();
Classes
Implementation of code and data
Represents semantic unit
public class Person : IPersonAge { private int YOB; public Person() { } public int YearOfBirth { get { return YOB; }; set { YOB = value; }; } public int GetAgeToday() { return Today()YearOfBirth }; }
Structs
Groups of data and code
Similar to classes, however:
No inheritance allowed Always passed by value
C++ Developers!
Struct is not a class with everything being public
Example:
struct Point { double X; double Y; void MoveBy(double dX, double dY) { X+=dX; Y+=dY; } }
Properties
Mix between fields and methods Use properties for:
Implementation of read-only members (by omitting set) Validation on assignment Calculated or composed values Exposing values on interfaces
Example:
Indexers
Consistent way to build containers Build on properties idea Allow indexed access to contained objects Index qualifier may be of any type Example:
object this[string index] { get { return Dict.Item(index); } set { Dict.Add(index,value); } }
Delegates
Similar to function pointers found in C and C++ Strongly typed, no type-cast confusion or errors Declaration creates typed method signature:
delegate void Clicked(Element e, Point p);
Events
Language-intrinsic event model All management done by C# Events are declared using a delegate type Declaration creates event source to bind to
event Clicked OnClicked;
Remove handler:
btnAction.OnClicked -= MyClickHandler;
Attributes
Similar to attributes known from IDL Declarative access to functionality Extensible through custom attributes Allow code augmentation with:
Hints for the runtime environment
[Transaction(TransactionOption.Required)] class MyBusinessComponent :ServicedComponent { ... }
Declarative semantics
[PersonFirstName] String Vorname; [PersonFirstName] String PrimarioNome;
Example:
class PersonFirstNameAttribute : Attribute { public PersonFirstName() { } }
Statements
Very C: Flow Control and Loops
if (<bool expr>) { ... } else { ... }; switch(<var>) { case <const>: ...; }; while (<bool expr>) { ... }; for (<init>;<bool test>;<modify>) { ... }; do { ... } while (<bool expr>);
Very not C:
lock(<object>){ ... }; Language inherent critical section synchronization checked {...}; unchecked { ...}; Integer overflow protection
Operators
Very C:
Logical/conditional: && || ^ Arithmetic: Relational:
* / + - % << >> == != < > >= <=
Not exactly C:
For bool: & and | are logical with full evaluation For integer: & and | perform binary AND/OR
Very un-C:
is as
Operator Overloading
Most operators can be overloaded
Arithmetic, relational, conditional, and logical
No overloading for
Assignment operators Special operators (sizeof, new, is, typeof)
Access Protection
Adopts C++ model
public private Everyone may call or access Only members may access Only members of exactly this class protected
protected internal
Eliminates vast majority of C++ uses of pointers Pointers are available for code marked unsafe
unsafe void crypt(byte[] arr) { byte * b = arr; ... }
42
Boxed: Reference
The .NET runtime tracks all memory usage automatically GC automatically removes all unused objects More efficient memory management Ease of use and "zero memory leaks"
Nondeterministic Destruction
Garbage Collection downside:
Destructors called at some random future time Finalization code is never synchronous Breaks some established design patterns from C++
Beware: Code should never depend on destructors to free external resources. Instead: Implement IDisposable with using
using( File f = new File("c:\\xyz.xml") ) { ... } IDisposable.Dispose() called on object when scope is exited.
Exception Handling
Very similar to C++ and SEH Read like this:
try running this code ...
... if error occurs, catch what I can deal with ... ...finally allow me to do some manual cleanup work
Example:
try { //... run code } catch(SomeException e) { //... handle } finally { //...end gracefully }
Visual DebuggerGuiDebug
Built on Visual Studio.NET technology Full access to runtime metadata
Tools
Nmake, security, configuration, IL Disassembler, ...
Visual Studio.NET
Built on the .NET Framework SDK Reinvention of the concept of Visual Studio, now with:
Multiple-language projects One integrated development environment for all languages and tasks Integrated tools: Visual Modeler, Database Management Perfect help integration: Dynamic Help, IntelliSense
Hello World
namespace Sample { using System; public class HelloWorld { public HelloWorld() { } public static int Main(string[] args) { Console.WriteLine("Hello World!"); return 0; } } }
Summary
C# builds on the .NET Framework component model New language with familiar structure
Easy to adopt for developers of C, C++, Java, and Visual Basic applications
Questions?
C
Core principles: Be brief. Be expressive.
Relatively few and short keywords Uses symbol ASCII characters instead of words
Blocks in C
void Xyz() { /*Code*/ } if (MyVal==0) { /*Code*/ }
Statements
All statements ("do that!") are inside blocks
Every statement is terminated with a semicolon ";" White space, line breaks, tabs are not significant May have many statements on one line Statements may be split across lines
Statements: a = add( 2, 3 ); q = a 1; out( q ); q--; return; Just as legal: This too: a= add (2,3 );q=a 1;out (q);q;return;
#define/**/X char*d="X0[!4cM,!" 4cK`*!4cJc(!4cHg&!4c$j" "8f'!&~]9e)!'|:d+!)rAc-!*m*" :d/!4c(b4e0!1r2e2!/t0e4!-y-c6!" +|,c6!)f$b(h*c6!(d'b(i)d5!(b*a'`&c" ")c5!'b+`&b'c)c4!&b-_$c'd*c3!&a.h'd+" "d1!%a/g'e+e0!%b-g(d.d/!&c*h'd1d-!(d%g)" "d4d+!*l,d7d)!,h-d;c'!.b0c>d%!A`Dc$![7)35E" "!'1cA,,!2kE`*!-s@d(!(k(f//g&!)f.e5'f(!+a+)" "f%2g*!?f5f,!=f-*e/!<d6e1!9e0'f3!6f)-g5!4d*b" "+e6!0f%k)d7!+~^'c7!)z/d-+!'n%a0(d5!%c1a+/d4" "!2)c9e2!9b;e1!8b>e/! 7cAd-!5fAe+!7fBe(!" "8hBd&!:iAd$![7S,Q0!1 bF 7!1b?'_6!1c,8b4" "!2b*a,*d3!2n4f2!${4 f. '!%y4e5!&f%" "d-^-d7!4c+b)d9!4c-a 'd :!/i('`&d" ";!+l'a+d<!)l*b(d=!' ma &d>!&d'" "`0_&c?!$dAc@!$cBc@!$ b < ^&d$`" ":!$d9_&l++^$!%f3a' n1 _ $ !&" "f/c(o/_%!(f+c)q*c %! * f &d+" "f$s&!-n,d)n(!0ick) ! 3d" "/b0h*!H`7a,![7* i] 5 4 71" "[=ohr&o*t*q*`*d *v *r ; 02" "7*~=h./}tcrsth &t : r 9b" "].,b-725-.t--// #r [ < t8-" "752793? <.~;b ].t--+r / # 53" "7-r[/9~X .v90 <6/<.v;-52/={ k goh" "./}q; u vto hr `.i*$engt$ $ ,b" ";$/ =t ;v; 6 =`it.`;7=` : ,b-" "725 = / o`. .d ;b]`--[/+ 55/ }o" "`.d : - ?5 / }o`.' v/i]q - " "-[; 5 2 =` it . o;53. " "v96 <7 / =o : d =o" "--/i ]q-[; h. / = " "i]q--[ ;v 9h ./ < - " "52={cj u c&` i t . o ; " "?4=o:d= o-/ i ]q - " "-[;54={ cj uc& i]q -" "[;76=i]q[;6 =vsr u.i / ={" "=),BihY_gha ,)\0 " , o [ 3217];int i, r,w,f , b ,x , p;n(){return r <X X X X X 768?d[X(143+ X r++ + *d ) % 768]:r>2659 ? 59: ( x = d [(r++-768)% X 947 + 768] ) ? x^(p?6:0):(p = 34 X X X ) ;}s(){for(x= n (); ( x^ ( p ?6:0))==32;x= n () ) ;return x ; } void/**/main X () { r = p =0;w=sprintf (X X X X X X o ,"char*d="); for ( f=1;f < * d +143;)if(33-( b=d [ f++ X ] ) ){if(b<93){if X(! p ) o [w++]=34;for X(i = 35 + (p?0:1);i<b; i++ ) o [w++]=s();o[ w++ ] =p?s():34;} else X {for(i=92; i<b; i ++)o[w++]= 32;} } else o [w++ ] =10;o [ w]=0 ; puts(o);} " " "
"This too" Credits: Don Yang, Winner "Best Layout" International Obfuscated C Contest http://www.ioccc.org
Declaration Principles
Core declaration principle: "What then who" What: data type or declaration keyword
Types: int, string, decimal, float Keywords: enum, struct, class
Operators
Arithmetic
binary operators
Modulo (%)
add (+), subtract (-), divide (/), multiply (*) a=b%c; instead of a=b mod c
unary operators
"oprd1 operator"
i++ instead of i=i+1
Logical
and (&&), or (||), not(!)
Bitwise
and (&), or(|), xor (^), not (~)
Relational
equal (==), not equal (!=), less (<) greater (>), less equal (<=), greater equal (>=)
Expressions
Boolean expressions
Evaluate to true or false
(2 == 1) is false, (2 > 1) is true
Assignment
a = 1; a += 4; a *= 2;
Flow Control
Conditional execution of code blocks:
if (<expression>) <block> [else <block>];
Loops
Counted loops
for(<pre>;<while>;<increment>) <block>
<pre>: Setting precondition "i=0" <while>: Testing continuation condition "i<10" <increment>: Calculating counter state "i++"
While loops
while (<expression>) <block> do <block> while (<expression>);
for (i=0; i< 10; i++ ) { Console.Write(i); } while ( !MyFile.EOF ) { Console.Write(MyFile.Read()); }
Legal Notices
Unpublished work. 2001 Microsoft Corporation. All rights reserved. Microsoft, IntelliSense, JScript, Visual Basic, Visual Studio, and Windows are either registered trademarks or trademarks of Microsoft Corporation in the United States and/or other countries. The names of actual companies and products mentioned herein may be the trademarks of their respective owners.