Chương 2 Nền tảng ngôn ngữ C#

 Kiểu dữ liệu cơ bản.  Biến và hằng.  Biểu thức.  Câu lệnh.  Toán tử.  Namespace.  Các chỉ dẫn biên dịch.  Xử lý ngoại lệ.

pdf32 trang | Chia sẻ: lylyngoc | Lượt xem: 1800 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Chương 2 Nền tảng ngôn ngữ C#, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
4/10/2012 1 Chương 2 Nền tảng ngôn ngữ C# Giảng viên: ThS. Phạm Thanh An Khoa công nghệ thông tin Đại học Ngân hàng Tp. Hồ Chí Minh Nội dung trình bày  Kiểu dữ liệu cơ bản.  Biến và hằng.  Biểu thức.  Câu lệnh.  Toán tử.  Namespace.  Các chỉ dẫn biên dịch.  Xử lý ngoại lệ. Mô tả kiểu dữ liệu trong C# String Array ValueType Exception Delegate Class1 Multicast Delegate Class2 Class3 Object Enum1 Structure1Enum Primitive types Boolean Byte Int16 Int32 Int64 Char Single Double Decimal DateTime System-defined types User-defined types Delegate1 TimeSpan Guid 4/10/2012 2 Kiểu dữ liệu  C# là một ngữ mạnh về kiểu dữ liệu  Phải khai báo kiểu của mỗi biến, đối tượng khi sử dụng  integer, float, string, byte, buttons, v.v  C# chia thành hai tập hợp kiểu dữ liệu chính:  Kiểu xây dựng sẵn (built- in)  Kiểu được người dùng định nghĩa (user-defined) do người lập trình tạo ra (lớp, struct, v.v). Kiểu dữ liệu (tt)  C# phân tập hợp kiểu dữ liệu này thành hai loại:  Kiểu dữ liệu giá trị (value type): int, char , và structures  Kiểu dữ liệu tham chiếu (reference type): classes, interfaces, arrays và strings Kiểu dữ liệu xây dựng sẵn Kiểu C# Số Byte Kiểu .NET Mô tả Ví dụ object Kiểu dữ liệu cơ sở cho tất cả các kiểu dữ liệu khác. object o = null; string Lưu trữ giá trị chuỗi string s = “hello”; short 2 Int16 Số nguyên có dấu giá trị từ -32768 đến 32767. ushort 2 Uint16 Số nguyên không dấu 0 – 65.535 int 4 Int32 Số nguyên có dấu –2.147.483.647 và 2.147.483.647 int val = 12; uint 4 Uint32 Số nguyên không dấu 0 – 4.294.967.295 4/10/2012 3 Kiểu dữ liệu xây dựng sẵn (tt) Kiểu C# Số Byte Kiểu .NET Mô tả Ví dụ sbyte 1 Sbyte Số nguyên có dấu ( từ -128 đến 127) byte 1 Số nguyên không dấu từ 0 - 255 long 8 Int64 Kiểu số nguyên có dấu có giá trị trong khoảng : -9.223.370.036.854.775.808 đến 9.223.372.036.854.775.807 ulong 8 Uint64 Số nguyên không dấu từ 0 đến 18446744073709551615 Kiểu dữ liệu xây dựng sẵn (tt) Kiểu C# Số Byte Kiểu .NET Mô tả Ví dụ float 4 Single Kiểu dấu chấm động, giá trị xấp xỉ từ 3,4E- 38 đến 3,4E+38, với 7 chữ số có nghĩa. Có thêm hậu tố F sau giá trị float val = 1.23F; double 8 Double Kiểu dấu chấm động có độ chính xác gấp đôi, giá trị xấp xỉ 1.7E-308 - 1.7E+308, với 15,16 chữ số có nghĩa decimal 8 Decimal Chính xác đến 28 con số và giá trị thập phân, được dùng trong tính toán tài chính, đòi hỏi hầu tố “m” hay “M” theo sau giá trị Kiểu dữ liệu xây dựng sẵn (tt) Kiểu C# Số Byte Kiểu .NET Mô tả Ví dụ bool 1 Boolean Giá trị logic true/ false bool val1 = true; bool val2 = false; char 2 Char Ký tự Unicdoe char val = 'h'; 4/10/2012 4 Kiểu dữ liệu xây dựng sẵn (tt)  Ghi chú:  Kiểu giá trị logic chỉ có thể nhận được giá trị là true hay false.  Khác với C/C++, một giá trị nguyên không thể gán vào một biến kiểu logic trong C# và không có bất cứ chuyển đổi ngầm định nào Biên dịch: xuất hiện lỗi Error CS0029 : Cannot implicitly convert type 'int' to 'bool' Kiểu dữ liệu xây dựng sẵn (tt)  Kiểu dữ liệu ký tự thể hiện các ký tự Unicode  Bao gồm các ký tự đơn giản, ký tự theo mã Unicode và các ký tự thoát khác được bao trong những dấu nháy đơn  Ký tự thoát là những ký tự đặc biệt bao gồm hai ký tự liên tiếp trong đó ký tự dầu tiên là dấu chéo ‘\’. Ví dụ, \t là dấu tab Giá trị mặc định của kiểu dữ liệu Kiểu Giá trị mặc định Numeric (int,float,short) 0 hoặc 0.0 Bool false Char ‘\0’ Enum 0 String null Kiểu tham chiếu null 4/10/2012 5 Các ký tự đặc biệt Ký tự Ý nghĩa \' Dấu nháy đơn \" Dấu nháy kép \\ Dấu chéo (Backslash) \0 Ký tự Null \a Alert Các ký tự đặc biệt (tt) Ký tự Ý nghĩa \b Backspace \f Sang trang Form feed \n Dòng mời (Newline) \r Đầu dòng (Carriage return) \t Tab ngang (Horizontal tab) \v Tab dọc (Vertical tab) Chuyển đổi kiểu dữ liệu  Chuyển đổi kiểu dữ liệu này qua kiểu dữ liệ khác  Có 2 cách: chuyển đổi tường minh và ngầm định  Chuyển đổi ngầm định được thực hiện một cách tự động đảm bảo là không mất thông tin.  Từ kiểu nhỏ sang kiểu lớn short x = 10; int y = x; // chuyển đổi ngầm định  Trường hợp này không thực hiện short x; int y = 100; x = y; // Không biên dịch, lỗi !!! 4/10/2012 6 Chuyển đổi kiểu dữ liệu (tt) short x; int y = 500; x = (short) y; // Ép kiểu tường minh, trình biên dịch không báo lỗi  Để chuyển đổi một ký tự sang mã ASCII  (int)'A‘  Để chuyển một số sang ký tự ta thực hiện như sau:  (char)65 Chuyển đổi ngầm định From To 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 Chuyển đổi tường mình  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; string s2 = (string)o; 4/10/2012 7 Ví dụ sử dụng kiểu dữ liệu  Khai bao trước khi sử dụng  Gán giá trị trước khi sử dụng public class App { public static void Main() { int width, height; width = 2; height = 4; int area = width * height; int x; int y = x * 2; ... } } Khai báo Khai báo + khởi đầu Lỗi Ví dụ using System; class TestDefaultValues { static void Main() { int number, result; number=5; result=100 * number; Console.WriteLine (“Result is {0} when 100 is multiplied by number {1}”, result, number); } } Ví dụ: chuyển đổi kiểu dữ liệu int i = 5; double d = 3.2; string s = "496"; d = i; i = (int) d; i = System.Convert.ToInt32(s); Chuyển đổi ngầm định Chuyển đổi tường minh Chuyển đổi tường minh 4/10/2012 8 Input / Output trong C#  Sử dụng các phương thức của lớp Console trong không gian tên System Console.ReadLine() Console.WriteLine() Định danh  Là tên mà người lập trình chỉ định cho các kiểu dữ liệu, các phương thức, tên biến, hằng, lớp hay đối tượng....  Định danh không trùng với từ khóa của C#  Định danh phải bắt đầu với một ký tự chữ cái hay dấu gạch dưới,  các ký tự còn lại phải là ký tự chữ cái, chữ số, dấu gạch dưới.  C# phân biệt chữ hoa và chữ thường  Ví dụ:  Định danh đúng: result , _score, footballTeam, plan9  Định danh sai: result%, footballTeam$, 9plan Các từ khóa của C# abstract const extern in operator sbyte throw virtual as continue false int out sealed true void base decimal finally interface override set try volatile bool default fixed internal params short typeof where break delegate float is partial sizeof uint while byte do for lock private stackalloc ulong yield case double foreach long protected static unchecked catch else get namespace public string unsafe char enum goto new readonly struct ushort checked event if null ref switch using class explicit implicit object return this value Các từ khóa trong C# 4/10/2012 9 Biến  Biến là nơi lưu dữ liệu của chương trình  Dữ liệu của biến  Nằm trong bộ nhớ vật lý (physical RAM)  Có thể thay đổi giá trị  Phải khai báo trước khi dùng  Định danh: tên để đại diện cho biến  Kiểu dữ liệu: dạng lưu trữ dữ liệu của biến Biến (tt)  Bạn có thể khai báo kết hợp khởi đầu giá trị cho biến  Tên biến không được trùng với từ khóa của C#, nếu muốn sử dụng từ khóa làm tên biến phải thêm @ trước từ khóa  Khai báo biến:  tên biến ; int tuoi; tuoi = 21 ; Console.WriteLine(tuoi); Ví dụ 4/10/2012 10 Ví dụ: về khai báo biến using System; using System.Collections.Generic; using System.Text; namespace InitializingVariables { class Values { static void Main( ) { int myInt = 7; System.Console.WriteLine(“Khởi đâu, myInt: {0}", myInt); myInt = 5; System.Console.WriteLine(“Sau khi gán, myInt: {0}", myInt); } } } Output: Khởi đầu, myInt: 7 sau khi gán, myInt: 5 Ví dụ: sử dụng từ khóa làm tên biến using System; class VariableDemo { public static void Main() { string @string; @string = ”Su dung tu khoa lam ten bien”; Console.WriteLine (@string); } } Hằng  Hằng là một biến mà giá trị của nó không thể thay đổi  Phải gán giá trị ngay khi khai báo  Khai báo hằng = ; const int DoSoi = 100; // Độ C const int DoDong = 0; // Độ C System.Console.WriteLine( “Do dong cua nuoc {0}”, DoDong ); System.Console.WriteLine( “Do soi cua nuoc {0}”, DoSoi ); 4/10/2012 11 Câu lệnh (Statements )  Trong C# một chỉ dẫn lập trình đầy đủ được gọi là câu lệnh.  Chương trình bao gồm nhiều câu lệnh tuần tự với nhau.  Mỗi câu lệnh phải kết thúc với một dấu chấm phẩy “;” int x ; // 1 câu lệnh x = 23 ; // 1 câu lệnh khác int y = x; // một câu lệnh khác  Những câu lệnh này sẽ được xử lý theo thứ tự. Biểu thức  Câu lệnh thực hiện việc đánh giá một giá trị gọi là biểu thức.  Một phép gán một giá trị cho một biến cũng là một biểu thức:  var1 = 24;  a = b = c = d = 24; Khoảng trắng  Trong C#, những khoảng trắng, tab và các dòng được xem như là khoảng trắng (whitespace),  C# sẽ bỏ qua tất cả các khoảng trắng đó, do vậy chúng ta có thể viết như sau: var1 = 24; hay var1 = 24 ; int x = 5; Giống như: int x=5; Khác với: intx=5; 4/10/2012 12 Chú thích trong C#  C# sử dụng kiểu chú thích của C++  // chú thích 1 dòng  /* các dòng chú thích ……………………………………. ……………………………………..*/ Phân nhánh  Phân nhánh không có điều kiện  Gọi hàm  Sử dụng từ khóa phân nhánh : goto, break, continue, return, throw  Phân nhánh có điều kiện  if switch Ví dụ: gọi hàm using System; using System.Collections.Generic; using System.Text; namespace Goiham { class Goimotham { static void Main( ) { Console.WriteLine(“Trong Main! Gọi hàm SomeMethod( )..."); SomeMethod( ); Console.WriteLine(“Quay về Main( )."); } static void SomeMethod( ) { Console.WriteLine(“Xin chao tu SomeMethod!"); } } } 4/10/2012 13 Câu lệnh if if (biểu thức điều kiện) { ; ; ............ ; } [else { ; ; ... } ]  Nhóm câu lệnh trong [….] có thể có hoặc không Ví dụ if string str = ”hello”; if (str) // Lỗi System.Console.WriteLine (“Giá trị là True”); if (str == “hello”) System.Console.WriteLine (“Giá trị là đúng”); Câu lệnh Switch switch(variable) { case value: ; break; case value: ; break; default: ; break; } 4/10/2012 14 Ví dụ : sử dụng Switch switch(weekday) { case 1: Console.WriteLine (“You have selected Monday”); break; case 2: Console.WriteLine (“You have selected Tuesday”); break; default: Console.WriteLine (“Sunday is the Default choice!”); break; } Sử dụng lệnh nhảy: goto  Để sử dụng goto  Tạo một nhãn  goto đến nhãn using System; public class UsingGoto { public static int Main() { int i = 0; lap: // nhãn Console.WriteLine(“i:{0}”,i); i++; if ( i < 10 ) goto lap; // nhãy về nhãn lap return 0; } } Cấu trúc lệnh lặp  while Loop  do Loop  for Loop  foreach Loop 4/10/2012 15 Cấu trúc while while { ; }  Thực hiện câu lệnh trong khi điều kiện vẫn còn đúng  Câu lệnh break sẽ thoát ngay khỏi vòng lặp  Câu lệnh continue sẽ bỏ qua lần lặp hiện tại và thực hiện lần lặp tiếp theo Ví dụ: while using System; public class UsingWhile { public static int Main() { int i = 0; while ( i < 10 ) { Console.WriteLine(“ i: {0} ”,i); i++; } return 0; } } Cấu trúc do … while do ; while ( điều kiện )  Thực hiện câu lệnh ít nhất 1 lần trong khi điều kiện vẫn còn đúng using System; public class UsingDoWhile { public static int Main( ) { int i = 11; do { Console.WriteLine(“i: {0}”,i); i++; } while ( i < 10 ) return 0; } } 4/10/2012 16 Cấu trúc lặp for …. for ([ phần khởi tạo] ; [biểu thức điều kiện]; [bước lặp]) Ví dụ: sử dụng for using System; public class UsingFor { public static int Main() { for (int i = 0; i < 30; i++) { if (i %10 ==0) // phân dư { Console.WriteLine(“{0} ”,i); } else { Console.Write(“{0} ”,i); } } return 0; } } Phạm vi của biến khai báo trong vòng lặp for using System; public class UsingFor { public static int Main() { for (int i = 0; i < 30; i++) { if (i %10 ==0) // phân dư { Console.WriteLine(“{0} ”,i); } else { Console.Write(“{0} ”,i); } } Console.WriteLine(“ Ket qua cuoi cung cua i:{0}”,i);// Sai return 0; } } 4/10/2012 17 Cấu trúc foreach  Cú pháp: foreach ( <tên truy cập thành phần > in ) ; Ví dụ : foreach using System; public class UsingForeach { public static int Main() { int[] intArray = {1,2,3,4,5,6,7,8,9,10}; foreach( int item in intArray) { Console.Write(“{0} ”, item); } return 0; } Toán tử  Toán tử gán (=)  Toán tử toán học  Toán tử số học đơn giản (+, -, *, /):  Lưu ý  khi chia hai số nguyên : 17/4 = 4  Chia cho số thực có kiểu như float, double, hay decimal thì kết quả chia được trả về là một số thực.  Toán tử chia dư (%) : 17%4 = 1 4/10/2012 18 Toán tử  Toán tử tăng giảm Luong = Luong * 2; Luong = Luong – 100.000; C# cung cấp các phép toán tự gán Toán tử Toán tử  Toán tử : ++ , --  Toán tử tăng giảm tiền tố và tăng giảm hậu tố, var2 =10  var1 = ++var2; // var1 = 11, var2 = 11  var1 = var2++; //var1 = 10 , var2 = 11 4/10/2012 19 Toán tử quan hệ Toán tử logic Độ ưu tiên toán tử Một ngôi 4/10/2012 20 Độ ưu tiên toán tử Toán tử ba ngôi  ? <Biểu thức thứ 1> :  Ví dụ maxValue = value1 > value2 ? value1 : value2; Namespace  Sử dụng namespace  Nhằm tránh sự xung đột về tên, giúp cho việc sử dụng các thư viện khác nhau từ các nhà cung cấp.  Giảm bớt độ phức tạp khi sử dụng lại mã cho ứng dụng khác  C# đưa ra từ khóa using đề khai báo sử dụng namespace trong chương trình: 4/10/2012 21 Namespace  Để tạo một namespace dùng cú pháp sau: namespace { ..... } Namespace class SamsungTelevision { ... } class SamsungWalkMan { ... } class SonyTelevision { ... } class SonyWalkMan { ... } namespace Samsung { class Television {...} class WalkMan {...} } namespace Sony { class Television {...} class Walkman {...} } Namespace lồng nhau namespace Sony { namespace Television { class T14inches { ... } class T21inches { ... } } } ... namespace Sony.Television { class T14inches { ... } class T21inches { ... } } ... 4/10/2012 22 Ví dụ : namespace namespace MyLib { using System; public class Tester { public static int Main() { for (int i =0; i < 10; i++) { Console.WriteLine( “i: {0}”, i); } return 0; } } } Ví dụ : namespace lồng nhau namespace MyLib { namespace Demo { using System; public class Tester { public static int Main() { for (int i =0; i < 10; i++) { Console.WriteLine( “i: {0}”, i); } return 0; } } }  Từ bên ngoài để truy cập lớp Tester dùng cú pháp sau: MyLib.Demo.Tester Ví dụ namespace Sony { class Television { ... } class WalkMan { ... Television MyEntertainment = new Television(); ... } } 4/10/2012 23 Ví dụ (tt) using Sony; using Samsung; using System; namespace Sony { namespace Television { class T14inches { public T14inches() { Console.WriteLine ("A 14 inches Television"); } } class T21inches { public T21inches() { Console.WriteLine ("A 21 inches Television"); } } }//end of namespace Television }//end of namespace Sony Ví dụ (tt) namespace Samsung { class Television { Sony.Television.T14inches myEntertainment = new Sony.Television.T14inches(); } } class Test { static void Main() { Samsung.Television myEntertainment = new Samsung.Television(); } }  Sử dụng namespace Sử dụng chỉ dẫn namespace  Sử dụng chỉ dẫn namespace Sony.Television.T14inches Television = new Sony.Television.T14inches(); ... using Sony.Television; T14inches Television = new T14inches(); T21inches Television2 = new T21inches(); 4/10/2012 24 Xung đột Error: Vì cả hai namesapce Sony và Samsung có cùng tên lớp Television using Sony; using Samsung; class Test { static void Main() { Television MyEntertainment = new Television(); } } Ví dụ (tt) using Sony; using Samsung; class Test { static void Main() { Samsung.Television MyEntertainment = new Samsung.Television(); } } Phải sử dụng cả namespace using = Sử dụng bí danh (alias)  Sử dụng bí danh: using T21inches = Sony.Televisions.T21inches; class Test { static void Main() { T21inches M = new T21inches(); } } 4/10/2012 25 Ví dụ: Khai báo khác khối using System; namespace MyLib { namespace Demo1 { class Example1 { public static void Show1() { Console.WriteLine(“Lop Example1”); } } } // end Demo1 namespace Demo2 { public class Tester { public static int Main() { Demo1.Example1.Show1(); Demo1.Example2.Show2(); return 0; } } } // end Demo2 } // end MyLib Ví dụ: Khai báo khác khối namespace MyLib.Demo1 { class Example2 { public static void Show2() { Console.WriteLine(“Lop Example2”); } } }  Lớp Example2 có cùng namespace MyLib.Demo1 với lớp Example1 nhưng hai khai báo không cùng một khối. Xử lý ngoại lệ (exception handling)  Một chương trình sẽ như thế nào ?  Đọc một file trên đĩa, nhưng file đã bị xóa  Chia cho số 0  Trong lập trình, chương trình phải lường trước được các tình huống có thẻ gây ra bởi 1 lỗi nào đó.  Các ngoại lệ được sử dụng để đón trước và bắt các lỗi có thể xảy ra trong một chương trình 4/10/2012 26 Xử lý ngoại lệ (tt)  .Net framwork cung cấp các lớp ngoại lệ có thể lưu giữ thông tin đối với các ngoại lệ Phát sinh và bắt giữ ngoại lệ  Trong C#, có thể phát sinh (throw) những đối tượng ngoại lệ  Kiểu dữ liệu là System.Exception, hay những đối tượng được dẫn xuất từ kiểu dữ liệu này.  Câu lệnh throw :  throw new System.Exception();  throw new IOException(); Phát sinh và bắt giữ ngoại lệ (tt)  Khi gặp ngoại lệ, thì sẽ làm ngừng việc thực thi câu lệnh tiếp theo, CLR sẽ tìm kiếm một trình xử lý ngoại lệ  Nếu trình xử lý ngoại lệ không được tìm thấy trong phương thức hiện thời, thì CLR tiếp tục tìm trong phương thức gọi cho đến khi nào tìm thấy.  Nếu CLR trả về lớp Main() mà không tìm thấy bất cứ trình xử lý ngoại lệ nào, thì nó sẽ kết thúc chương trình. 4/10/2012 27 Sử dụng khối try … catch try { ; } catch { ; } finally { ; }  Trạng thái lỗi được xử lí trong khối catch Có thể có nhiều khối catch  Khối Finally có thể có hoặc không  Khối finally luôn được thực hiện dù có lỗi xảy hay không Ví dụ Khối try … catch  Bắt đầu thực hiện câu lệnh trong khối try  Nếu không có lỗi xuất hiện, việc thực thi tiến hành cho đến cuối khối try, chuyển đến khối finally  Nếu có một lỗi xuất hiện trong khối try, thực thi sẽ nhảy đến một trong các khối catch  Vào cuối của khối catch , việc thực thi được chuyển khối finally  Khối finally được thực thi (có thể có hoặc không) 4/10/2012 28 Ví trụ: try … catch using System; class ExceptionDemo { static void Main() { int dividend = 50; int userInput = 0; int quotient = 0; Console.WriteLine ("Enter a number : "); try { userInput = Convert.ToInt32 (Console.ReadLine()); quotient = divident /userInput; } Ví trụ: try … catch catch (System.FormatException excepE) { Console.WriteLine (excepE); } catch (System.DivideByZeroException excepE) { Console.WriteLine ("catch block"); Console.WriteLine (excepE); Console.WriteLine(""); } Ví trụ: try … catch finally { Console.WriteLine ("finally block"); if (quotient != 0) { Console.WriteLine("The Integer Quotient of 50 divided by {0} is {1}", userInput, quotient); } } } } 4/10/2012 29 Ví dụ  Một khối catch có thể bắt giữ được tất cả các ngoại lệ K
Tài liệu liên quan