Cấu trúc chương trình C#• Phần chú thích option • Phần khai báo dùng namespace option • Phần định nghĩa namespace và lớp // Chương trình C# đầu tiên static void Main string [] a
Trang 1Chương 2 C# Language Fundamentals
Trang 2Nội dung
• Cách viết 1 console application
– Console I/0 và lệnh nhập xuất
• Khai báo biến:
– Strongly type
– Implicited type local variable
• Các kiểu dữ liệu
– Value type
– Reference type
Trang 3Nội dung (tt)
• Chuyển đổi kiểu
• Boxing and unboxing
• Tham số ref, out, param
• Lệnh lặp for, while, do while, foreach
• Lệnh phân nhánh switch, lệnh nhảy
• Các kiểu dữ liệu phức:
Trang 4Visual studio 2008 environment
• Là một môi trường lập trình nhiều công cụ
(tool-rich programming environment) chứa mọi tính năng cần thiết để tạo các dự án C# từ nhỏ đến lớn
Trang 7Ứng dụng console C# đầu tiên
// Chương trình C# đầu tiên
static void Main( string [] args)
{
Console Write( "Hello World!" );
Console ReadLine();
}
Trang 8Cấu trúc chương trình C#
• Phần chú thích (option)
• Phần khai báo dùng namespace (option)
• Phần định nghĩa namespace và lớp
// Chương trình C# đầu tiên
static void Main( string [] args){ {
Console Write( "Hello World!" );
Console ReadLine();
}
Trang 9Câu lệnh (Statement)
• Các câu lệnh được viết trong thân của phương thức (method)
• Thực hiện một công việc nào đó
• Kết thúc bởi dấu chấm phẩy (;)
namespace HelloWorld
{
class Program {
static void Main( string [] args)
{
Console Write( "Hello World!" );
Console ReadLine();
} }
Các câu lệnh
Phương thức Main
Trang 10static void Main( string [] args)
{
Console Write( "Hello World!" );
Console ReadLine();
}
Trang 11Chú thích
• Chú thích (comment) được dùng để giải thích về chương trình và các câu lệnh
• Giúp cho chương trình dễ hiểu hơn
• Được bỏ qua khi biên dịch
• Không ảnh hưởng tới kết quả thực thi của
chương trình
• Có thể phát sinh ra documentation của chương trình qua chú thích XML
Trang 12Hai cách tạo chú thích cơ bản
• Gõ phần chú thích sau cặp ký tự //
• Gõ phần chú thích giữa cặp ký tự /* và */
/* Chương trình C# đầu tiên
In ra câu chào "Hello World" */
using System;
namespace HelloWorld {
class Program {
static void Main(string[] args) {
Console.Write("Hello World!"); // Xuất ra câu chào
Console.ReadLine(); // Chờ nhấn Enter
}
Trang 13XML Comment
• Cho phép phát sinh ra sưu liệu dạng XML
• Thích hợp cho việc viết sưu liệu của dự án lớn
• Chú thích XML bắt đầu với triple slash (“///”) và các tag của XML
• Chú thích XML dùng cho
– User defined types
– Class, delegate, enum and struct
– Member of user defined types
Trang 14Ví dụ: ứng dụng CONSOLE đơn giản
Trang 15Using Namespace
• Để giải quyết vấn đề xung đột tên
(name-crashing) nên tạo 1 container có đặt tên
Trang 16Using Namespace
• Các class trong NET framework cũng được sắp xếp vào các namespace khác nhau.
• Ví dụ: lớp Console thuộc namespace System
• Để tham chiếu đến 1 lớp nào đó, có thể dùng
tên đầy đủ:
Namespace.ClassName Hoặc để tránh phải viết đầy đủ tham chiếu đến
chương trình
Trang 17Using Namespace
• Bốn namespace thông dụng hay được dùng
trong các chương trình sẽ được Visual Studio tự động đưa vào đầu mỗi chương trình mới
Trang 18File program.cs
• Một chương trình đơn giản nhất bao gồm: 1 file program.cs, trong file có 1 namespace mặc
định và 1 class
• Class: phải có tối thiểu 1 hàm Main
static void Main(string[] args)
{
}
Trang 20Tính năng IntelliSense của IDE
• Tự động hiển thị danh sách các thành phần
của class khi lệnh được gõ vào cửa sổ soạn
thảo
• C# sẽ hiển thị thành phần (member) phù hợp với các ký tự đang được gõ vào, sau đó hiển thị tool tip chứa mô tả tính năng của thành
phần
Trang 21Console I/O
• Để đọc ký tự văn bản từ cửa sổ console
– Console.Read() giá trị trả về là int
– Console.ReadLine() giá trị trả về là string
• Để xuất chuỗi ký tự dùng
– Console.Write() / Console.WriteLine()
Trang 22Printing on the Console
• Để định dạng văn bản xuất ra:
Console.WriteLine( "{0}\n{1}",
"Welcome to", "C# Programming!" );
Đối số chứa chuỗi định dạng
Trang 24Ký tự định dạng chuỗi
Trang 26Console I/O
• Console.WriteLine()
Trang 28C# Is a strongly Typed Language
• C# là một ngôn ngữ được kiểm soát chặt chẽ về mặt kiểu dữ liệu
• Mỗi biến (variable) và đối tượng (object
instance) trong hệ thống phải được xác định kiểu tường minh (well-defined type)
• Cho phép compiler dễ dàng kiểm tra được tính hợp lệ các phép toán trên các biến và đối
tượng
Trang 29Khai báo biến
• Khai báo biến theo 2 dạng:
Trang 30Variable name
• Hai quy tắc:
➤Ký tự đầu phải là chữ cái (letter) hoặc dấu _ hoặc
@.
➤ Các ký tự tiếp theo có thể là chữ cái, _ hay số
• Phân biệt CHỮ HOA và chữ thường
• Phải khác với từ khóa (dùng “@” khắc phục)
Trang 31Gán giá trị biến
Trang 32Phạm vi biến
• Phạm vi (scope)
– Được xác định bởi cặp dấu { và }
– Có thể chứa phạm vi nhỏ hơn
• Vị trí khai báo biến
– Trong thân phương thức: biến cục bộ
– Trong thân lớp(trong class): thuộc tính
• Biến trong C# chỉ có tác dụng trong phạm vi
mà nó được khai báo
Trang 33Các từ khóa trong C# 2005
Trang 34Data types
• There are two kinds of data types in C#
– Value Types (implicit data types, structs and enumeration)
– Reference Types (objects, delegates)
Trang 36Reference types
• Biến loại tham chiếu chứa địa chỉ bộ nhớ chứa dữ liệu mà biến tham chiếu đến
Trang 39Implicit data types
• Mỗi kiểu dữ liệu ngầm định đều được ánh xạ thành một kiểu tương ứng trong Common
Type System (CTS) và CLS (Common Language Specification)
Trang 40Các kiểu dữ liệu ngầm định trong C#
Trang 41Các kiểu dữ liệu ngầm định trong C#
Trang 42Bộ nhớ máy tính được tổ chức như thề nào?
• Hệ điều hành chia bộ nhớ thành 2 chunk khác nhau, mỗi chunk được quản lý theo 1 cách
khác nhau
– Stack
– Heap
Trang 43Value types và reference types
• Tất cả loại tham trị (value) đều được tạo trên stack
• Tất cả loại tham biến (reference) đều được tạo trên heap
– Nhưng con trỏ tham chiếu (reference pointer) thì nằm trên stack.
Trang 46• A stack is a data structure that store items in a
first in first out (FIFO) fashion It is an area of memory supported by the processor and its
size is determined at the compile time
Trang 47• A heap consists of memory available to the
program at run time Reference types are
allocated using memory available from the
heap dynamically (during the execution of
program) The garbage collector searches for non-referenced data in heap during the
execution of program and returns that space
to Operating System
Trang 48Value type vs Reference type
Trang 50• Ưu điểm
– Chương trình dễ đọc, khắc phục những con số
“magic number” trong code.
– Chương trình dễ sửa hơn.
– Tránh lỗi dễ dàng hơn, trình biên dịch sẽ báo lỗi
nếu gán lại giá trị cho hằng
Trang 51• Minh họa sử dụng hằng Định nghĩa hằng
Constant
Trang 52const: phải được gán giá trị khi khai báo
readonly: ko cần khởi tạo trước, khi gán giá trị thì sau đó ko thay đổi được
Chưa được khởi gán
Ko được thay đổi
Trang 53Implicitly Typed Local Variables
“In C#, every variable declared in the code must have an explicit type associated with it But sometimes, when writing code for strongly typed languages, the amount of typing needed
to declare such variables can be tedious…”
Trang 54Biến loại suy diễn Type inference
• var là từ khóa mới trong C# 3.0
• Cách khai báo:
var <varName>=<value>;
• Biến <varName> có loại ngầm định là loại của value
• Ví dụ: var myVar = 5;
myVar là biến loại int
Trang 55var newValue; // emits error CS0818
var a = 2, b = 1;
var x, y = 4;
Not permited
Trang 56Chuyển đổi kiểu dữ liệu Type Conversion (cast)
• Nhiều lúc cần chuyển đổi dữ liệu cho các instances sang 1 loại dữ liệu khác
• Có 2 dạng chuyển đổi
– Implicit cast
– Explicit cast
Trang 57Implicit cast
• Tuân theo promotion rules
– chỉ có phép chuyển kiểu nào mà không làm mất dữ liệu thì mới được phép
• Do C# tự thực hiện
• Không cần lập trình viên can thiệp
Trang 58Implicit type cast
• Xảy ra khi
– Ép từ kiểu nhỏ qua kiểu lớn
– Ép từ lớp dẫn xuất qua lớp cơ sở
double x = i;
string s = "Hello";
object o = s;
Trang 59Implicit type-cast
sbyte short, int, long, float, double, decimal
byte short, ushort, int, uint, long, ulong, float, double, decimal
short int, long, float, double, decimal
ushort int, uint, long, ulong, float, double, decimal
int long, float, double, decimal
uint long, ulong, float, double, decimal
long, ulong float, double, decimal
float double
char ushort, int, uint, long, ulong, float, double, decimal
Trang 60Explicit type-cast
• Do lập trình viên chỉ định
• Xảy ra khi
– Ép từ kiểu lớn qua kiểu nhỏ: có thể mất giá trị
– Ép từ lớp cơ sở qua lớp dẫn xuất
double x = 74.86;
int i = ( int ) ) x; // i = 74
string s = "Hello" ;
object o = s;
Trang 61Using Convert class
• Thường dùng khi cần chuyển đổi giữa các kiểu không có liên hệ với nhau
Trang 62System.Object class
Trang 63Boxing and unboxing
• Dùng để chỉ việc chuyển dữ liệu từ stack sang heap và ngược lại
• Mục đích: cải thiện việc thực thi chương trình
Trang 64int i =42;
Object o = i;
• I is a value type, so it exists in the stack
• O is a reference type, so it must refer to
objects on the heap
The runtime allocates a piece of memory
from the heap, copies the value of integer i to this piece, and refers the object o to this copy
Trang 65• The automatic copying of an item from the
stack to the heap is called boxing
Trang 66• If you modify the original value of a variable, the value on the heap will not change and vice versa
Trang 67• Int i=o compile time error The object o can refer to absolutely anything and not just an
int
• To obtain the value of the boxed copy, you
must use a cast operation
Trang 68Unboxing Int I = 42;
Object o = I; //boxes
I = (int)o; // compiles okay
Trang 69Circle c = new Circle(42);
Object o = c; // doesn’t box because c is a reference
variable;
Int I = (int) o; //compiles okay but throws an exception
at run time
Trang 71Ảnh hưởng của boxing/unboxing đến việc
thực thi chương trình
Trang 72checked & unchecked
throws OverFlowException
used to control the overflow checking context
for integral-type arithmetic operations and
conversions
Trang 73ref , out, param
• ref: tương tự như truyền tham chiếu trong C/C++
• Từ khoá ref phải được dùng lúc gọi hàm
• Các tham số truyền dạng ref phải được khởi tạo giá trị trước
Khai báo ref trước kiểu dữ liệu
sử dụng ref cho tham số khi gọi hàm
Trang 74ref, out , param
• out: tương tự như ref
• Khác ref là ko cần khởi tạo giá trị trước khi truyền
Khai báo cho tham số Dùng trước tham
số khi gọi hàm
Trang 75ref, out, param
3 phần tử 6 phần tử Mảng array
Luôn khai báo ở cuối danh sách tham số
Luôn khai báo ở cuối danh sách tham số
Trang 77• Tương tự như C: while, do while, for
while <điều kiện>
do { // phần thân do while } while <điều kiện>;
for( khởi tạo biến lặp; <điều kiện theo biến lặp>; thay đổi biến lặp)
Trang 79foreach( typedata identifier in objectArray) {
// thân foreach }
foreach( typedata identifier in objectArray) {
// thân foreach }
Trang 80• Biểu thức switch gồm: kiểu số, ký tự, enum và chuỗi
• Sử dụng break, goto, return để điều khiển luồng thực thi
• Nếu ko nhãn nào phù hợp → default
• Nếu ko có default → thực hiện lệnh sau switch
Trang 82• Thoát khỏi hàm void
• Trả về 1 giá trị của hàm
void Func1(int x) {
if (x == 0) return;
.
}
void Func1(int x) {
if (x == 0) return;
else return b;
int max(int a, int b) {
if (a > b) return a;
else return b;
Trang 83Rolling a Six-Sided Die
• Let us develop an application that simulates
20 rolls of a six-sided die and displays the
value of each roll
Trang 84Class Random (of namespace System)
• Objects of class Random can produce
random byte, int and double values
• A new random-number generator object can
be created as follows:
Random randomNumbers = new Random();
The random-number generator object can
then be used to generate random byte, int
and double values
Trang 85Class Random (of namespace System)
• Method Next of class Random generates a random
int randomValue = randomNumbers.Next();
Values returned by Next are actually
pseudorandom numbers—a sequence of
values produced by a complex mathematical calculation
Trang 86Complex variable types
• C# cung cấp ba loại biến phức nhưng rất thông dụng:
– Enumerations (often referred to as enums)
– structs (occasionally referred to as structures)
– Arrays
Trang 87}
Trang 88<valueN> }
• Underlying types of byte, sbyte, short, ushort,
Trang 89Định nghĩa enumeration
• Mặc định, mỗi giá trị được gán cho 1 giá trị
tương ứng với underlying type value theo thứ tự được định nghĩa <value1> được gán giá trị 0, <value2> có giá trị 1…
• Có thể override phép gán này bằng toán tử =
Trang 90Khai báo và sử dụng kiểu enumeration
• Khai báo biến kiểu enumeration:
<typeName><varName>;
• Gán giá trị cho biến:
<varName> = <typeName>.<value>;
Trang 92Struct (hay structure)
• Là kiểu dữ liệu được hợp thành từ nhiều phần dữ liệu có kiểu dữ liệu khác nhau
• Cho phép người dùng tự định nghĩa kiểu dữ liệu của riêng mình
Trang 93Định nghĩa kiều struct
struct <typeName>
{
<memberDeclarations>
} Mỗi <memberDeclaration> có dạng như sau:
<accessibility><type><name>;
Ví dụ: struct route
{ public orientation direction;
public double distance;
}
Trang 94• is a collection of values of a similar data type
• C# arrays are a reference type
• Each array in C# is an object and is inherited
from the System.Array class
• Arrays are declared as:
<data type> [] <identifier> = new <data type>[<size of array>]
Ex: int [] integers = new int[10];
Hoặc: int [] integers;
Trang 96• The size of an array is fixed and must be
defined before using it
• Can use variables to define the size of the
array:
int size = 10;
int [] integers = new int[size];
• Array can be defined by using the values
int [] integers = {1, 2, 3, 4, 5};
Trang 97Truy xuất các phần tử mảng Accessing the values stored in an array
• Sử dụng toán tử chỉ mục (indexing operator)
[int index]
• Giá trị chỉ mục trong C# bắt đầu từ 0.
• Truy xuất các phần tử của mảng:
– Dùng vòng lặp for và toán tử chỉ số
– Dùng vòng lặp foreach
• Note:vòng lặp foreach chỉ cho phép read-only Không thể thực hiện:
{ friendName = "Rupert the bear};
Trang 100• Lấy kích thước mảng qua thuộc tính Length
– int Size = myArray.Length;
• Nếu thành phần của mảng là kiểu định trước,
có thể dùng hàm Sort của Array để sắp xếp
– Array.Sort(myArray);
• Dùng hàm Reverse của Array để đảo thứ tự
các phần tử trong mảng
– Array.Reverse(myArray);
Trang 102Multidimensional Arrays
• A multidimensional array is simply one that
uses multiple indices to access its elements
• Cách khai báo
<baseType>[,,,] <name>;
Ví dụ: tạo mảng 2 chiều 3 hàng 4 cột
double[,] hillHeight = new double[3,4];
double[,] hillHeight = { { 1, 2, 3, 4 }, { 2, 3, 4, 5 }, {
3, 4, 5, 6 } };