C Sharp căn bản – Chương II – NGÔN NGỮ C#

0
0
(0)

Tại sao phải sử dụng ngôn ngữ C#

 

Nhiều  người  tin  rằng không cần thiết  có một  ngôn  ngữ lập  trình  mới.  Java,  C++, Perl, Microsoft Visual Basic, và những ngôn ngữ khác được nghĩ rằng đã cung cấp tất cả những chức năng cần thiết.

Ngôn ngữ C# là một ngôn ngữ được dẫn xuất từ C và C++, nhưng nó được tạo từ nền tảng phát triển hơn. Microsoft bắt đầu với công việc trong C và C++ và thêm vào những đặc tính mới để làm cho ngôn ngữ này dễ sử dụng hơn. Nhiều trong số những đặc tính này khá giống với những đặc tính có trong ngôn ngữ Java. Không dừng lại ở đó, Microsoft đưa ra một số mục đích khi xây dựng ngôn ngữ này. Những mục đích này được được tóm tắt như sau:

C# là ngôn ngữ đơn giản

C# là ngôn ngữ hiện đại

C# là ngôn ngữ hướng đối tượng

C# là ngôn ngữ mạnh mẽ và mềm dẻo

C# là ngôn ngữ có ít từ khóa

C# là ngôn ngữ hướng module

C# sẽ trở nên phổ biến

 

C# là ngôn ngữ đơn giản

 

C# loại bỏ một vài sự phức tạp và rối rắm của những ngôn ngữ như Java và c++, bao gồm việc loại bỏ những macro, những template, đa kế thừa, và lớp cơ sở ảo (virtual base class). Chúng là những nguyên nhân gây ra sự nhầm lẫn hay dẫn đến những vấn đề cho các người phát triển C++. Nếu chúng ta là người học ngôn ngữ này đầu tiên thì chắc chắn là ta sẽ không trải qua những thời gian để học nó! Nhưng khi đó ta sẽ không biết được hiệu quả của ngôn ngữ C# khi loại bỏ những vấn đề trên.

Ngôn ngữ C# đơn giản vì nó dựa trên nền tảng C và C++. Nếu chúng ta thân thiện với C và  C++ hoậc thậm chí  là Java, chúng ta sẽ thấy C# khá giống về diện mạo,  cú  pháp,  biểu thức, toán tử và những chức năng khác được lấy trực tiếp từ ngôn ngữ C và C++, nhưng nó đã được cải tiến để làm cho ngôn ngữ đơn giản hơn. Một vài trong các sự cải tiến là loại bỏ các dư thừa, hay là thêm vào những cú pháp thay đổi. Ví dụ như, trong C++ có ba toán tử làm việc với các thành viên là ::, . , và ->. Để biết khi nào dùng ba toán tử này cũng phức tạp và dễ nhầm lẫn. Trong C#, chúng được thay thế với một toán tử duy nhất gọi là . (dot). Đối với người mới học thì điều này và những việc cải tiến khác làm bớt nhầm lẫn và đơn giản hơn.

Ghi chú: Nếu chúng ta đã sử dụng Java và tin rằng nó đơn giản, thì chúng ta cũng sẽ tìm thấy rằng C# cũng đơn giản. Hầu hết mọi người đều không tin rằng Java là ngôn ngữ đơn giản. Tuy nhiên, C# thì dễ hơn là Java và C++.

 

C# là ngôn ngữ hiện đại

 

Điều gì làm cho một ngôn ngữ hiện đại? Những đặc tính như là xử lý ngoại lệ, thu gom bộ nhớ tự động, những kiểu dữ liệu mở rộng, và bảo mật mã nguồn là những đặc tính được mong đợi trong một ngôn ngữ hiện đại. C# chứa tất cả những đặc tính trên. Nếu là người mới học  lập  trình  có  thể  chúng  ta  sẽ  cảm  thấy những  đặc  tính  trên  phức  tạp  và  khó  hiểu.  Tuy nhiên, cũng đừng lo lắng chúng ta sẽ dần dần được tìm hiểu những đặc tính qua các chương trong cuốn sách này.

Ghi chú: Con trỏ được tích hợp vào ngôn ngữ C++. Chúng cũng là nguyên nhân gây ra những rắc rối của ngôn ngữ này. C# loại bỏ những phức tạp và rắc rối phát sinh bởi con trỏ. Trong C#, bộ thu gom bộ nhớ tự động và kiểu dữ liệu an toàn được tích hợp vào ngôn ngữ, sẽ loại bỏ những vấn đề rắc rối của C++.

C# là ngôn ngữ hướng đối tượng

Những đặc điểm chính của ngôn ngữ hướng đối tượng (Object-oriented language) là sự đóng gói (encapsulation), sự kế thừa (inheritance), và đa hình (polymorphism). C# hỗ trợ tất cả những đặc tính trên. Phần hướng đối tượng của C# sẽ được trình bày chi tiết trong một chương riêng ở phần sau.

C# là ngôn ngữ mạnh mẽ và cũng mềm dẻo

 

Như đã đề cập trước, với ngôn ngữ C# chúng ta chỉ bị giới hạn ở chính bởi bản thân hay là trí tưởng tượng của chúng ta. Ngôn ngữ này không đặt những ràng buộc lên những việc có thể làm. C# được sử dụng cho nhiều các dự án khác nhau như là tạo ra ứng dụng xử lý văn bản, ứng dụng đồ họa, bản tính, hay thậm chí những trình biên dịch cho các ngôn ngữ khác.

C# là ngôn ngữ ít từ khóa

 

C# là ngôn ngữ sử dụng giới hạn những từ khóa. Phần lớn các từ khóa được sử dụng để mô tả thông tin. Chúng ta có thể nghĩ rằng một ngôn ngữ có nhiều từ khóa thì sẽ mạnh hơn. Điều này không phải sự thật, ít nhất là trong trường hợp ngôn ngữ C#, chúng ta có thể tìm thấy rằng ngôn ngữ này có thể được sử dụng để làm bất cứ nhiệm vụ nào. Bảng sau liệt kê các từ khóa của ngôn ngữ C#.

 

abstract

default

foreach

object

sizeof

unsafe

as

delegate

goto

operator

stackalloc

ushort

base

do

if

out

static

using

bool

double

implicit

override

string

virtual

break

else

in

params

struct

volatile

byte

enum

int

private

switch

void

case

event

interface

protected

this

while

catch

explicit

internal

public

throw

 

char

extern

is

readonly

true

 

checked

false

lock

ref

try

 

class

finally

long

return

typeof

 

const

fixed

namespace

sbyte

uint

 

continue

float

new

sealed

ulong

 

decimal

for

null

short

unchecked

 

Bảng 1.2: Từ khóa của ngôn ngữ C#.

 

C# là ngôn ngữ hướng module

 

Mã nguồn C# có thể được viết trong những phần được gọi là những lớp, những lớp này chứa các phương thức thành viên của nó. Những lớp và những phương thức có thể được sử dụng lại trong ứng dụng hay các chương trình khác. Bằng cách truyền các mẫu thông tin đến những lớp hay phương thức chúng ta có thể tạo ra những mã nguồn dùng lại có hiệu quả.

 

C# sẽ là một ngôn ngữ phổ biến

 

C# là một trong những ngôn ngữ lập trình mới nhất. Vào thời điểm cuốn sách này được viết, nó không được biết như là một ngôn ngữ phổ biến. Nhưng ngôn ngữ này có một số lý do để trở thành một ngôn ngữ phổ biến. Một trong những lý do chính là Microsoft và sự cam kết của .NET

Microsoft muốn ngôn ngữ C# trở nên phổ biến. Mặc dù một công ty không thể làm một sản phẩm trở nên phổ biến, nhưng nó có thể hỗ trợ. Cách đây không lâu, Microsoft đã gặp sự thất bại về hệ điều hành Microsoft Bob. Mặc dù Microsoft muốn Bob trở nên phổ biến nhưng thất bại. C# thay thế tốt hơn để đem đến thành công sơ với Bob. Thật sự là không biết khi nào mọi người trong công ty Microsoft sử dụng Bob trong công việc hằng ngày của họ. Tuy nhên, với C# thì khác, nó được sử dụng bởi Microsoft. Nhiều sản phẩm của công ty này đã chuyển đổi và viết lại bằng C#. Bằng cách sử dụng ngôn ngữ này Microsoft đã xác nhận khả năng của C# cần thiết cho những người lập trình.

Micorosoft .NET là một lý do khác để đem đến sự thành công của C#. .NET là một sự thay đổi trong cách tạo và thực thi những ứng dụng.

Ngoài hai lý do trên ngôn ngữ C# cũng sẽ trở nên phổ biến do những đặc tính của ngôn ngữ này được đề cập trong mục trước như: đơn giản, hướng đối tượng, mạnh mẽ…

Ngôn ngữ C# và những ngôn ngữ khác

 

Chúng ta đã từng nghe đến những ngôn ngữ khác như Visual Basic, C++ và Java. Có lẽ chúng ta cũng tự hỏi sự khác nhau giữa ngôn ngữ C# và nhưng ngôn ngữ đó. Và cũng tự hỏi tại sao lại chọn ngôn ngữ này để học mà không chọn một trong những ngôn ngữ kia. Có rất nhiều lý do và chúng ta hãy xem một số sự so sánh giữa ngôn ngữ C# với những ngôn ngữ khác giúp chúng ta phần nào trả lời được những thắc mắc.

Microsoft nói rằng C# mang đến sức mạnh của ngôn ngữ C++ với sự dễ dàng của ngôn ngữ  Visual  Basic.  Có  thể  nó  không  dễ  như  Visual  Basic,  nhưng  với  phiên  bản  Visual Basic.NET (Version 7) thì ngang nhau. Bởi vì chúng được viết lại từ một nền tảng. Chúng ta có thể viết nhiều chương trình với ít mã nguồn hơn nếu dùng C#.

Mặc dù C# loại bỏ một vài các đặc tính của C++, nhưng bù lại nó tránh được những lỗi mà thường gặp trong ngôn ngữ C++. Điều này có thể tiết kiệm được hàng giờ hay thậm chí hàng ngày trong việc hoàn tất một chương trình. Chúng ta sẽ hiểu nhiều về điều này trong các chương của giáo trình.

Một điều quan trọng khác với C++ là mã nguồn C# không đòi hỏi phải có tập tin header. Tất cả mã nguồn được viết trong khai báo một lớp.

Như đã nói ở bên trên. .NET runtime trong C# thực hiện việc thu gom bộ nhớ tự động. Do điều này nên việc sử dụng con trỏ trong C# ít quan trọng hơn trong C++. Những con trỏ cũng có thể được sử dụng trong C#, khi đó những đoạn mã nguồn này sẽ được đánh dấu là không an toàn (unsafe code).

C# cũng từ bỏ ý tưởng đa kế thừa như trong C++. Và sự khác nhau khác là C# đưa thêm thuộc  tính  vào  trong  một  lớp  giống  như  trong  Visual  Basic.  Và  những  thành  viên  của  lớp được gọi duy nhất bằng toán tử “.” khác với C++ có nhiều cách gọi trong các tình huống khác nhau.

Một ngôn ngữ khác rất mạnh và phổ biến là Java, giống như C++ và C# được phát triển dựa trên C. Nếu chúng ta quyết định sẽ học Java sau này, chúng ta sẽ tìm được nhiều cái mà học từ C# có thể được áp dụng.

Điểm giống nhau C# và Java là cả hai cùng biên dịch ra mã trung gian: C# biên dịch ra MSIL còn Java biên dịch ra bytecode.  Sau đó  chúng được thực hiện  bằng cách thông dịch hoặc  biên  dịch  just-in-time  trong  từng  máy  ảo  tương  ứng.  Tuy  nhiên,  trong  ngôn  ngữ  C# nhiều hỗ trợ được đưa ra để biên dịch mã ngôn ngữ trung gian sang mã máy. C# chứa nhiều kiểu dữ liệu cơ bản hơn Java và cũng cho phép nhiều sự mở rộng với kiểu dữ liệu giá trị. Ví dụ, ngôn ngữ C# hỗ trợ kiểu liệt kệ (enumerator), kiểu này được giới hạn đến một tập hằng được định nghĩa trước, và kiểu dữ liệu cấu trúc đây là kiểu dữ liệu giá trị do người dùng định nghĩa. Chúng ta sẽ được tìm hiểu kỹ hơn về kiểu dữ liệu tham chiếu và kiểu dữ liệu giá trị sẽ được trình bày trong phần sau

Tương tự như Java, C# cũng từ bỏ tính đa kế thừa trong một lớp, tuy nhiên mô hình kế thừa đơn này được mở rộng bởi tính đa kế thừa nhiều giao diện.

Các bước chuẩn bị cho chương trình

 

Thông thường, trong việc phát triển phần mềm, người phát triển phải tuân thủ theo quy trình phát triển phần mềm một cách nghiêm ngặt và quy trình này đã được chuẩn hóa. Tuy nhiên trong phạm vi của chúng ta là tìm hiểu một ngôn ngữ mới và viết những chương trình nhỏ  thì  không  đòi  hỏi  khắt  khe  việc  thực  hiện  theo  quy  trình.  Nhưng  để  giải  quyết  được những vấn đề thì chúng ta cũng cần phải thực hiện đúng theo các bước sau. Đầu tiên là phải xác định vấn đề cần giải quyết. Nếu không biết rõ vấn đề thì ta không thể tìm được phương pháp giải quyết. Sau khi xác định được vấn đề, thì chúng ta có thể nghĩ ra các kế hoạch để thực hiện. Sau khi có một kế hoạch, thì có thể thực thi kế hoạch này. Sau khi kế hoạch được thực thi, chúng ta phải kiểm tra lại kết quả để xem vấn đề được giải quyết xong chưa. Logic này thường được áp dụng trong nhiều lĩnh vực khác nhau, trong đó có lập trình.

Khi tạo một chương trình trong C# hay bất cứ ngôn ngữ nào, chúng ta nên theo những bước tuần tự sau:

Xác định mục tiêu của chương trình.

Xác định những phương pháp giải quyết vấn đề. Tạo một chương trình để giải  quyết vấn đề.

Thực thi chương trình để xem kết quả.

 

Ví dụ mục tiêu để viết chương trình xử lý văn bản đơn giản, mục tiêu chính là xây dựng chương trình cho phép soạn thảo và lưu trữ những chuỗi ký tự hay văn bản. Nếu không có mục tiêu thì không thể viết được chương trình hiệu quả.

Bước  thứ hai là  quyết định đến  phương  pháp để viết  chương trình.  Bước này xác định những thông tin nào cần thiết được sử dụng trong chương trình, các hình thức nào được sử dụng. Từ những thông tin này chúng ta rút ra được phương pháp để giải quyết vấn đề.

Bước thứ ba là bước cài đặt, ở bước này có thể dùng các ngôn ngữ khác nhau để cài đặt, tuy nhiên,  ngôn  ngữ phù  hợp để giải  quyết vấn đề một  cách  tốt  nhất sẽ được chọn.  Trong phạm vi của sách này chúng ta mặc định là dùng C#, đơn giản là chúng ta đang tìm hiểu nó!

Và bước cuối cùng là phần thực thi chương trình để xem kết quả.

 

Chương trình C# đơn giản

 

Để bắt đầu cho việc tìm hiểu ngôn ngữ C# và tạo tiền đề cho các chương sau, chương đầu tiên trình bày một chương trình C# đơn giản nhất.

Ví dụ 2.1 : Chương trình C# đầu tiên.

—————————————————————————–

 

class ChaoMung

 

{

 

static void Main( )

 

{

 

// Xuat ra man hinh

 

System.Console.WriteLine(“Chao Mung”);

 

}

 

}

 

—————————————————————————–

Kết quả:

 

Chao Mung

—————————————————————————–

Sau khi viết xong chúng ta lưu dưới dạng tập tin có phần mở rộng *.cs (C sharp). Sau đó biên dịch và chạy chương trình. Kết quả là một chuỗi “Chao Mung” sẽ xuất hiện trong màn hình console.

Các mục sau sẽ giới thiệu xoay quanh ví dụ 2.1, còn phần chi tiết từng loại sẽ được trình bày trong các chương kế tiếp.

 

Lớp, đối tượng và kiểu dữ liệu (type)

 

Điều cốt lõi của lập trình hướng đối tượng là tạo ra các kiểu mới. Kiểu là một thứ  được xem như trừu tượng. Nó có thể là một bảng dữ liệu, một tiểu trình, hay một nút lệnh trong một cửa sổ. Tóm lại kiểu được định nghĩa như một dạng vừa có thuộc tính chung (properties) và các hành vi ứng xử (behavior) của nó.

 

Nếu trong một ứng dụng trên Windows chúng ta tạo ra ba nút lệnh OK, Cancel, Help, thì thực chất là chúng ta đang dùng ba thể hiện của một kiểu nút lệnh trong Windows và các nút này cùng chia xẻ các thuộc tính và hành vi chung với nhau. Ví dụ, các nút có các thuộc tính như kích thước, vị trí, nhãn tên (label), tuy nhiên mỗi thuộc tính của một thể hiện không nhất thiết phải giống nhau, và thường thì chúng khác nhau, như nút OK có nhãn là “OK”, Cancel có nhãn là “Cancel”…Ngoài ra các nút này có các hành vi ứng xử chung như khả năng vẽ, kích hoạt, đáp ứng các thông điệp nhấn,…Tùy theo từng chức năng đặc biệt riêng của từng loại thì nội dung ứng xử khác nhau, nhưng tất cả chúng được xem như là cùng một kiểu.

Cũng như nhiều ngôn ngữ lập trình hướng đối tượng khác, kiểu trong C# được định nghĩa là một lớp (class), và các thể hiện riêng của từng lớp được gọi là đối tượng (object). Trong các chương kế tiếp sẽ trình bày các kiểu khác nhau ngoài kiểu lớp như kiểu liệt kê, cấu trúc và kiểu ủy quyền (delegates).

Quay lại chương trình ChaoMung trên, chương trình này chỉ có một kiểu đơn giản là lớp ChaoMung. Để định nghĩa một kiểu lớp trong C# chúng ta phải dùng từ khoá class, tiếp sau là tên lớp trong ví dụ trên tên lớp là ChaoMung. Sau đó định nghĩa các thuộc tính và hành động cho lớp. Thuộc tính và hành động phải nằm trong dấu { }.

Ghi chú: Khai báo lớp trong C# không có dấu ; sau ngoặc } cuối cùng của lớp. Và khác

với lớp trong C/C++ là chia thành 2 phần header và phần định nghĩa. Trong C# , định nghĩa một lớp được gói gọn trong dấu { } sau tên lớp và trong cùng một tập tin.

 

Phương thức

 

Hai thành phần chính cấu thành một lớp là thuộc tính hay tính chất và phương thức hay còn  gọi  là  hành  động  ứng  xử  của  đối  tượng.  Trong  C#  hành  vi  được  định  nghĩa  như  một phương thức thành viên của lớp.

Phương thức chính là các hàm được định nghĩa trong lớp. Do đó, ta còn có thể gọi các phương thức thành viên là các hàm thành viên trong một lớp. Các phương thức này chỉ ra rằng các hành động mà lớp có thể làm được cùng với cách thức làm hành động đó. Thông thường, tên của phương thức thường được đặt theo tên hành động, ví dụ như DrawLine() hay GetString().

Tuy nhiên trong ví dụ 2.1 vừa trình bày, chúng ta có hàm thành viên là Main() hàm này là hàm đặc biệt, không mô tả hành động nào của lớp hết, nó được xác định là hàm đầu vào của lớp (entry point) và được CRL gọi đầu tiên khi thực thi.

Ghi chú: Trong C#, hàm Main() được viết ký tự hoa đầu, và có thể trả về giá trị void  hay  int

Khi  chương  trình  thực  thi,  CLR  gọi  hàm Main() đầu  tiên,  hàm  Main() là  đầu  vào  của chương trình, và mỗi chương trình phải có một hàm Main(). Đôi khi chương trình có nhiều hàm Main() nhưng lúc này ta phải xác định các chỉ dẫn biên dịch để CLR biết đâu là hàm Main() đầu vào duy nhất trong chương trình.

Việc khai báo phương thức được xem như là một sự giao ước giữa người tạo ra lớp và người sử dụng lớp này. Người  xây dựng các lớp cũng có thể là người dùng lớp đó, nhưng không hoàn toàn như vậy. Vì có thể các lớp này được xây dựng thành các thư viện chuẩn và cung cấp cho các nhóm phát triển khác…Do vậy việc tuân thủ theo các qui tắc lá rất cần thiết.

Để khai báo một phương thức, phải xác định kiểu giá trị trả về, tên của phương thức, và cuối cùng là các tham số cần thiết cho phương thức thực hiện.

 

Chú thích

 

Một chương trình được viết tốt thì cần phải có chú thích các đoạn mã được viết. Các đoạn chú thích này sẽ không được biên dịch và cũng không tham gia vào chương trình. Mục đích chính là làm cho đoạn mã nguồn rõ ràng và dễ hiểu.

Trong ví dụ 2.1 có một dòng chú thích :

 

// Xuat ra man hinh.

Một chuỗi chú thích trên một dòng thì bắt đầu bằng ký tự “//”. Khi trình biên dịch gặp hai ký

tự này thì sẽ bỏ qua dòng đó.

Ngoài ra C# còn cho phép kiểu chú thích cho một hay nhiều dòng, và ta phải khai báo “/*” ở phần đầu chú thích và kết thúc chú thích là ký tự “*/”.

Ví dụ 2.2 : Minh họa dùng chú thích trên nhiều dòng.

—————————————————————————–

 

class ChaoMung

 

{

 

static void Main()

 

{

 

/* Xuat ra man hinh chuoi ‘chao mung’

 

Su dung ham WriteLine cua lop System.Console

 

*/

 

System.Console.WriteLine(“Chao Mung”);

 

}

 

}

 

—————————————————————————–

Kết quả:

 

Chao Mung

—————————————————————————–

Ngoài hai kiểu chú thích trên giống trong C/C++ thì C# còn hỗ trợ thêm kiểu thứ ba cũng là kiểu cuối cùng, kiểu này chứa các định dạng XML nhằm xuất ra tập tin XML khi biên dịch để tạo sưu liệu cho mã nguồn. Chúng ta sẽ bàn kiểu này trong các chương trình ở các phần tiếp.

 

Ứ ng dụng Console

 

Ví dụ đơn giản trên được gọi là ứng dụng console, ứng dụng này giao tiếp với người dùng thông quan bàn phím và không có giao diện người dùng (UI), giống như các ứng dụng thường thấy trong Windows. Trong các chương xây dựng các ứng dụng nâng cao trên Windows hay Web thì ta mới dùng các các giao diện đồ họa. Còn để tìm hiểu về ngôn ngữ C# thuần tuý thì cách tốt nhất là ta viết các ứng dụng console.

Trong hai ứng dụng đơn giản trên ta đã dùng phương thức WriteLine() của lớp Console. Phương thức này sẽ xuất ra màn hình dòng lệnh hay màn hình DOS chuỗi tham số đưa vào,

cụ thể là chuỗi “Chao Mung”.

 

Namespace

 

Như chúng ta đã biết .NET cung cấp một thư viện các lớp đồ sộ và thư viện này có tên là FCL (Framework Class Library). Trong đó Console chỉ là một lớp nhỏ trong hàng ngàn lớp trong  thư  viện.  Mỗi  lớp  có  một  tên  riêng,  vì  vậy  FCL  có  hàng  ngàn  tên  như  ArrayList, Dictionary, FileSelector,…

Điều này làm nảy sinh vấn đề, người lập trình không thể nào nhớ hết được tên của các lớp trong .NET Framework. Tệ hơn nữa là sau này có thể ta tạo lại một lớp trùng với lớp đã có chẳng hạn. Ví dụ trong quá trình phát triển một ứng dụng ta cần xây dựng một lớp từ điển và

lấy tên là Dictionary, và điều này dẫn đến sự tranh chấp khi biên dịch vì C# chỉ cho phép một tên duy nhất.

Chắc chắn rằng khi đó chúng ta phải đổi tên của lớp từ điển mà ta vừa tạo thành một cái tên khác chẳng hạn như myDictionary. Khi đó sẽ làm cho việc phát triển các ứng dụng trở nên phức tạp, cồng kềnh. Đến một sự phát triển nhất định nào đó thì chính là cơn ác mộng cho nhà phát triển.

Giải pháp để giải quyết vấn đề này là việc tạo ra một namespace, namsespace  sẽ hạn chế phạm vi của một tên, làm cho tên này chỉ có ý nghĩa trong vùng đã định nghĩa.

Giả sử có một người nói Tùng là một kỹ sư, từ kỹ sư phải đi kèm với một lĩnh vực nhất định nào đó, vì nếu không thì chúng ta sẽ không biết được là anh ta là kỹ sư cầu đường, cơ khí hay phần mềm. Khi đó một lập trình viên C# sẽ bảo rằng Tùng là CauDuong.KySu phân biệt với CoKhi.KySu  hay  PhanMem.KySu.  Namespace  trong  trường  hợp  này  là  CauDuong,  CoKhi, PhanMem sẽ hạn chế phạm vi của những từ theo sau. Nó tạo ra một vùng không gian để tên

sau đó có nghĩa.

Tương tự như vậy ta cứ tạo các namespace để phân thành các vùng cho các lớp trùng tên không tranh chấp với nhau.

Tương  tự  như  vậy,  .NET  Framework  có  xây  dựng  một  lớp  Dictionary  bên  trong namespace  System.Collections,  và  tương  ứng  ta  có  thể  tạo  một  lớp  Dictionary khác  nằm trong  namespace  ProgramCSharp.DataStructures,  điều  này  hoàn  toàn  không  dẫn  đến  sự tranh chấp với nhau.

Trong ví dụ minh họa 1.2 đối tượng Console bị hạn chế bởi namespace bằng việc sử dụng mã lệnh:

System.Console.WriteLine();

 

Toán tử ‘.’

 

Trong vídụ 2.2 trên dấu ‘.’ được sử dụng để truy cập đến phương thức hay dữ liệu trong một lớp (trong trường hợp này phương thức là WriteLine()), và ngăn cách giữa tên lớp đến một  namespace  xác  nhận  (namspace  System và  lớp  là  Console).  Việc  thực  hiện  này  theo hướng từ trên xuống, trong đó mức đầu tiên  namespace là System, tiếp theo là lớp Console, và cuối cùng là truy cập đến các phương thức hay thuộc tính của lớp.

Trong  nhiều  trường  hợp  namespace  có  thể  được  chia  thành  các  namespace  con  gọi  là subnamespace.  Ví  dụ  trong  namespace  System  có  chứa  một  số  các  subnamesapce  như Configuration, Collections, Data, và còn rất nhiều nữa, hơn nữa trong namespace Collection còn chia thành nhiều namesapce con nữa.

Namespace  giúp  chúng  ta  tổ  chức  và  ngăn  cách  những  kiểu.  Khi  chúng  ta  viết  một chương trình C# phức tạp, chúng ta có thể phải tạo một kiến trúc namespace riêng cho mình, và không giới hạn chiều sâu của cây phân cấp namespace. Mục đích của namespace là giúp chúng ta chia để quản lý những kiến trúc đối tượng phức tạp.

 

Từ khóa using

 

Để làm cho chương trình gọn hơn, và không cần phải viết từng namespace cho từng đối tượng, C# cung cấp từ khóa là using, sau từ khóa này là một namespace hay subnamespace với mô tả đầy đủ trong cấu trúc phân cấp của nó. Ta có thể dùng dòng lệnh :

using System;

ở đầu chương trình và khi đó trong chương trình nếu chúng ta có dùng đối tượng Console thì không cần phải viết đầy đủ : System.Console. mà chỉ cần viết Console. thôi.

Ví dụ 2.3: Dùng khóa using

—————————————————————————–

 

using System;

 

class ChaoMung

 

{

 

static void Main()

 

{

 

//Xuat ra man hinh chuoi thong bao

 

Console.WriteLine(“Chao Mung”);

 

}

 

}

 

—————————————————————————–

Kết quả:

 

Chao Mung

—————————————————————————–

Lưu ý rằng phải đặt câu using System trước định nghĩa lớp ChaoMung.

Mặc dù chúng ta chỉ định rằng chúng ta sử dụng namespace System, và không giống như các ngôn ngữ khác, không thể chỉ định rằng chúng ta sử dụng đối tượng System.Console.

Ví dụ 2.4: Không hợp lệ trong C#.

—————————————————————————–

 

using System.Console;

 

class ChaoMung

 

{

 

static void Main()

 

{

 

//Xuat ra man hinh chuoi thong bao

 

WriteLine(“Chao Mung”);

 

}

 

}

 

—————————————————————————–

Đoạn chương trình trên khi biên dịch sẽ được thông báo một lỗi như sau:

 

error CS0138: A using namespace directive can only be applied to namespace;

 

‘System.Console’ is a class not a namespace.

Cách biểu diễn namespace có thể làm giảm nhiều thao tác gõ bàn phím, nhưng nó có thể sẽ không đem lại lợi ích nào bởi vì nó có thể làm xáo trộn những namespace có tên không khác nhau. Giải pháp chung là chúng ta sử dụng từ khóa using với các namespace đã được xây dựng sẵn, các namespace do chúng ta tạo ra, những namespace này chúng ta đã nắm chắc sưu liệu về nó. Còn đối với namespace do các hãng thứ ba cung cấp thì chúng ta không nên dùng từ khóa using.

 

Phân biệt chữ thường và chữ hoa

 

Cũng giống như C/C++, C# là ngôn ngữ phân biệt chữ thường với chữ hoa, điều này có nghĩa rằng hai câu lệnh writeLine thì khác với WriteLine và cũng khác với WRITELINE.

Đáng tiếc là C# không giống như VB, môi trường phát triển C# sẽ không tự sửa các lỗi này, nếu chúng ta viết hai chữ với cách khác nhau thì chúng ta có thể đưa vào chương trình gỡ rối tìm ra các lỗi này.

Để trách việc lãnh phí thời gian và công sức, người ta phát triển một số qui ước cho cách đặt tên biến, hằng, hàm, và nhiều định danh khác nữa. Qui ước trong giáo trình này dùng cú pháp lạc đà (camel notation) cho tên biến và cú pháp Pascal cho hàm, hằng, và thuộc tính.

Ví dụ :

 

Biến myDictionary theo cách đặt tên cú pháp lạc đà.

Hàm DrawLine, thuộc tính ColorBackground theo cách đặt tên cú pháp Pascal.

 

Từ khóa static

 

Hàm Main() trong ví dụ minh họa trên có nhiều hơn một cách thiết kế. Trong minh họa này hàm Main() được khai báo với kiểu trả về là void, tức là hàm này không trả về bất cứ giá trị nào cả. Đôi khi cần kiểm tra chương trình có thực hiện đúng hay không, người lập trình có thể khai báo hàm Main() trả về một giá trị nào đó để xác định kết quả thực hiện của chương trình.

Trong khai báo của ví dụ trên có dùng từ khóa static:

 

static void Main()

 

{

 

…….

 

}

 

Từ  khóa  này  chỉ  ra  rằng  hàm  Main()  có  thể  được  gọi  mà  không  cần  phải  tạo  đối  tượng ChaoMung. Những vấn đề liên quan đến khai báo lớp, phương thức, hay thuộc tính sẽ được trình bày chi tiết trong các chương tiếp theo.

Phát triển chương trình minh họa

 

Có tối thiểu là hai cách để soạn thảo, biên dịch và thực thi chương trình trong cuốn sách này:

Sử dụng môi trường phát triển tích hợp (IDE) Visual Studio .NET

Sử dụng chương trình soạn thảo văn bản bất kỳ như Notepad rồi dùng biên dịch dòng lệnh.

Mặc dù chúng ta có thể phát triển phần mềm bên ngoài Visual Studio .NET, IDE cung cấp nhiều các tiện ích hỗ trợ cho người phát triển như: hỗ trợ phần soạn thảo mã nguồn như canh lề, màu sắc, tích hợp các tập tin trợ giúp, các đặc tính intellisense,…Nhưng điều quan trọng nhất là IDE phải  có  công cụ debug mạnh  và một  số công cụ trợ giúp  phát triển ứng dụng khác.

Trong cuốn sách này giả sử rằng người đọc đang sử dụng Visual Studio .NET. Phần trình này sẽ tập trung vào ngôn ngữ và platform hơn là công cụ phát triển. Chúng ta có thể sao chép tất cả những mã nguồn ví dụ vào trong một chương trình soạn thảo văn bản như Notepad hay Emacs, lưu chúng dưới dạng tập tin văn bản, và biên dịch chúng bằng trình biên dịch dòng lệnh C#, chương trình này được phân phối cùng .NET Framework SDK. Trong những chương cuối về xây dựng các ứng dụng trên Windows và Web, chúng ta sẽ sử dụng công cụ Visual Studio .NET để tạo ra các Windows Form và Web Form, tuy nhiên chúng ta cũng có thể viết bằng tay trong Notepad nếu chúng ta quyết định sử dụng cách làm bằng tay thay vì dùng công cụ thiết kế.

 

Sử dụng Notepad soạn thảo

Đầu tiên chúng ta sẽ mở chương trình Notepad rồi soạn thảo chương trình minh họa trên, lưu ý là ta có thể sử dụng bất cứ trình soạn thảo văn bản nào chứ không nhất thiết là Notepad. Sau khi soạn thảo xong thì lưu tập tin xuống đĩa và tập tin này có phần mở rộng là *.cs, trong ví dụ này là chaomung.cs. Bước tiếp theo là biên dịch tập tin nguồn vừa tạo ra. Để biên dịch ta dùng trình biên dịch dòng lệnh C# (csc.exe) chương trình này được chép vào máy trong quá trình cài .NET Framework. Để biết csc.exe nằm chính xác vị trí nào trong đĩa ta có thể dùng chức năng tìm kiếm của Windows.

Để thực hiện biên dịch chúng ta mở một cửa sổ dòng lệnh rồi đánh vào lệnh theo mẫu sau:

 

csc.exe [/out: <file thực thi>]  <file nguồn>

Ví dụ: csc.exe /out:d:\chaomung.exe  d:\chaomung.cs

Thường thì khi biên dịch ta chỉ cần hai phần là tên của trình biên dịch và tên tập tin nguồn mà thôi. Trong mẫu trên có dùng một trong nhiều tùy chọn khi biên dịch là /out, theo sau là tên của chương trình thực thi hay chính là kết quả biên dịch tập tin nguồn.

Các tham số tùy chọn có rất nhiều nếu muốn tìm hiểu chúng ta có thể dùng lệnh:

 

csc.exe /?

Lệnh này xuất ra màn hình toàn bộ các tùy chọn biên dịch và các hướng dẫn sử dụng.

Hai hình sau minh họa quá trình nhập mã nguồn chương trình C# bằng một trình soạn thảo văn bản đơn giản như Notepad trong Windows. Và sau đó biên dịch tập tin mã nguồn vừa tạo ra bằng chương trình csc.exe một trình biên dịch dòng lệnh của C#. Kết quả là một tập tin thực thi được tạo ra và ta sẽ chạy chương trình này.

 

 

Hình 2.2: Mã nguồn được soạn thảo trong Notepad.

 

 

 

 

Hình 2.3: Biên dịch và thực thi chương trình.

 

 

Sử dụng Visual Studio .NET để tạo chương trình

 

Để tạo chương trình chào mừng trong IDE, lựa chọn mục Visual Studio .NET trong menu Start hoặc icon của nó trên desktop, sau khi khởi động xong chương trình, chọn tiếp chức năng File   New     Project trong menu. Chức năng này sẽ gọi cửa sổ New Project (hình 2.4 bên dưới). Nếu như chương trình Visual Studio .NET được chạy lần đầu tiên, khi đó cửa sổ New Project sẽ xuất hiện tự động mà không cần phải kích hoạt.

Để tạo ứng dụng, ta lựa chọn mục Visual C# Projects trong cửa sổ Project Type bên trái. Lúc này chúng ta có thể nhập tên cho ứng dụng và lựa chọn thư mục nơi lưu trữ các tập tin này. Cuối cùng, kích vào OK khi mọi chuyện khởi tạo đã chấm dứt và một cửa sổ mới sẽ xuất hiện (hình 2.4 bên dưới), chúng ta có thể nhập mã nguồn vào đây.

Lưu ý rằng Visual Studio .NET tạo ra một namespace dựa trên tên của project mà ta vừa cung cấp (ChaoMung), và thêm vào chỉ dẫn sử dụng namespace System bằng lệnh using, bởi hầu như  mọi  chương  trình  mà  chúng  ta  viết  đều  cần  sử  dụng  các  kiểu  dữ  liệu  chứa  trong namespace System.

 

Hình 2.4: Tạo ứng dụng C# console trong Visual Studio .NET.

 

 

 

Hình 2.5:  Phần soạn thảo mã nguồn cho project.

 

 

Visual  Studio  .NET  tạo  một  lớp  tên  là Class1,  lớp  này  chúng  ta  có  thể  tùy  ý  đổi  tên  của chúng. Khi đổi tên của lớp, tốt nhất là đổi tên luôn tập tin chứa lớp đó (Class1.cs). Giả sử trong ví dụ trên chúng ta đổi tên của lớp thành ChaoMung, và đổi tên tập tin Class1.cs (đổi tên tập tin trong cửa sổ Solution Explorer).

Cuối cùng, Visual Studio .NET tạo một khung sườn chương trình, và kết thúc với chú thích TODO là vị trí bắt đầu của chúng ta. Để tạo chương trình chào mừng trong minh họa trên, ta bỏ tham số string[] args của hàm Main() và xóa tất cả các chú thích bên trong của hàm. Sau đó nhập vào dòng lệnh sau bên trong thân của hàm Main()

 

// Xuat ra man hinh

 

System.Console.WriteLine(“Chao Mung”);

Sau  tất  cả  công  việc  đó,  tiếp  theo  là  phần  biên  dịch  chương  trình  từ  Visual  Studio  .NET. Thông thường để thực hiện một công việc nào đó ta có thể chọn kích hoạt chức năng trong menu, hay các button trên thanh toolbar, và cách nhanh nhất là sử dụng các phím nóng hay các phím kết hợp để gọi nhanh một chức năng.

Trong ví dụ, để biên dịch chương trình nhấn Ctrl-Shift-B hoặc chọn chức năng:

Build     Build Solution. Một cách khác nữa là dùng nút lệnh trên thanh toolbar:

Để chạy chương trình vừa được tạo ra mà không sử dụng chế độ debug chúng ta có thể nhấn

Ctrl-F5 hay chọn Debug Start Without Debugging hoặc nút lệnh trên thanh toolbar của Visual Studio . NET

Ghi chú: Tốt hơn hết là chúng ta nên bỏ ra nhiều thời gian để tìm hiểu hay khám phá môi trường phát triển Visual Studio .NET. Đây cũng là cách thức tốt mà những người phát triển ứng dụng và chúng ta nên thực hiện. Việc tìm hiểu Visual Studio .NET và thông thạo nó sẽ giúp cho chúng ta rất nhiều trong quá trình xây dựng và phát triển ứng dụng sau này.

Câu hỏi và trả lời

 

Câuhỏi 1: Một chương trình C# có thể chạy trên bất cứ máy nào?

Trả lời 1: Không phải tất cả. Một chương trình C# chỉ chạy trên máy có Common Language Runtime (CLR) được cài đặt. Nếu chúng ta copy một chương trình exe của C# qua một máy không  có  CLR  thì  chúng  ta  sẽ  nhận  được  một  lỗi.  Trong  những  phiên  bản  của  Windows không có CLR chúng ta sẽ được bảo rằng thiếu tập tin DLL.

Câu hỏi 2:  Nếu  muốn  đưa  chương  trình  mà  ta  viết  cho  một  người  bạn  thì  tập  tin  nào  mà chúng ta cần đưa?

Trả lời 2: Thông thường cách tốt nhất là đưa chương trình đã biên dịch. Điều này có nghĩa rằng sau khi mã nguồn được biên dịch, chúng ta sẽ có một chương trình thực thi (tập tin có phần mở rộng *.exe ). Như vậy, nếu chúng ta muốn đưa chương trình Chaomung cho tất cả những người bạn của chúng ta thì chỉ cần đưa tập tin Chaomung.exe. Không cần thiết phải đưa tập tin nguồn Chaomung.cs. Và những người bạn của chúng ta không cần thiết phải có trình biên dịch C#. Họ chỉ cần có C# runtime trên máy tính (như CLR của Microsoft) là có thể chạy được chương trình của chúng ta.

Câuhỏi 3: Sau khi tạo ra được tập tin thực thi .exe. Có cần thiết giữ lại tập tin nguồn không?

Trả lời 3: Nếu chúng ta từ bỏ tập tin mã nguồn thì sau này sẽ rất khó khăn cho việc mở rộng hay thay đổi chương trình, do đó cần thiết phải giữ lại các tập tin nguồn. Hầu hết các IDE

tạo ra các các tập tin nguồn (.cs) và các tập tin thực thi. Cũng như giữ các tập tin nguồn chúng ta cũng cần thiết phải giữ các tập tin khác như là các tài nguyên bên ngoài các icon, image, form.. Chúng ta sẽ lưu giữ những tập tin này trong trường hợp chúng ta cần thay đổi hay tạo lại tập tin thực thi.

Câu hỏi 4: Nếu trình biên dịch C# đưa ra một trình soạn thảo, có phải nhất thiết phải sử dụng nó?

Trả lời 4: Không hoàn toàn như vậy. Chúng ta có thể sử dụng bất cứ trình soạn thảo văn bản nào và lưu mã nguồn dưới dạng tập tin văn bản. Nếu trình biên dịch đưa ra một trình soạn thảo thì chúng ta nên sử dụng nó. Nếu chúng ta có môt trình soạn thảo khác tốt hơn chúng ta có thể sử dụng nó. Một số các tiện ích soạn thảo mã nguồn có thể giúp cho ta dễ dàng tìm các lỗi cú pháp, giúp tạo một số mã nguồn tự động đơn giản…Nói chung là tùy theo chúng ta

nhưng theo tôi thì Visual Studio .NET cũng khá tốt để sử dụng

Câuhỏi 5: Có thể không quan tâm đến những cảnh báo khi biên dịch mã nguồn

Trả lời 5:  Một vài cảnh báo không ảnh hưởng đến chương trình khi chạy, nhưng một số khác

có thể ảnh hưởng đến chương trình chạy. Nếu trình biên dịch đưa ra cảnh báo, tức là tín hiệu cho một thứ gì đó không đúng. Hầu hết các trình biên dịch cho phép chúng ta thiết lập mức độ cảnh báo. Bằng cách thiết lập mức độ cảnh báo chúng ta có thể chỉ quan tâm đến những cảnh báo nguy hiểm, hay nhận hết tất cả những cảnh báo. Nói chung cách tốt nhất là chúng ta nên xem tất cả những cảnh báo để sửa chữa chúng, một chương trình tạm gọi là đạt yêu cầu khi không có lỗi biên dịch và cũng không có cảnh báo (nhưng chưa chắc đã chạy đúng

kết quả!).

 

Câu hỏi thêm

 

Câuhỏi 1: Hãy đưa ra 3 lý do tại sao ngôn ngữ C# là một ngôn ngữ lập trình tốt? Câuhỏi 2: IL và CLR viết tắt cho từ nào và ý nghĩa của nó?

Câuhỏi 3: Đưa ra các bước cơ bản trong chu trình xây dựng chương trình?

Câu hỏi 4: Trong biên dịch dòng lệnh thì lệnh nào được sử dụng để biên dịch mã nguồn .cs và lệnh này gọi chương trình nào?

Câuhỏi 5: Phần mở rộng nào mà chúng ta nên sử dụng cho tập tin mã nguồn C#?

Câu hỏi 6: Một tập tin .txt chứa mã nguồn C#   có phải là một tập tin mã nguồn C# hợp lệ hay không? Có thể biên dịch được hay không?

Câu hỏi 7: Ngôn ngữ máy là gì? Khi biên dịch mã nguồn C# ra tập tin .exe thì tập tin này là ngôn ngữ gì?

Câu hỏi 8:  Nếu  thực  thi  một  chương  trình  đã  biên  dịch  và  nó  không  thực  hiện  đúng  như mong đợi của chúng ta, thì điều gì chúng ta cần phải làm?

Câuhỏi 9: Một lỗi tương tự như bên dưới thường xuất hiện khi nào?

 

mycode.cs(15,5): error CS1010: NewLine in constan

Câuhỏi 10: Tại sao phải khai báo static cho hàm Main của lớp?

Câu hỏi 11: Một mã nguồn C# có phải chứa trong các lớp hay là có thể tồn tại bên ngoài lớp như C/C++?

Câu hỏi 12: So sánh sự khác nhau cơ bản giữa C# và C/C++, C#  với Java, hay bất cứ ngôn ngữ cấp cao nào mà bạn đã biết?

Câu hỏi 13: Con trỏ có còn được sử dụng trong C# hay không? Nếu có thì nó được quản lý như thế nào?

Câu hỏi 14: Khái niệm và ý nghĩa của namespace trong C#? Điều gì xảy ra nếu như ngôn ngữ lập trình không hỗ trợ namespace?

Bài tập

 

Bài tập 1: Dùng trình  soạn  thảo văn  bản  mở chương trình  exe mà ta  đã  biên  dịch  từ  các chương trình nguồn trước và xem sự khác nhau giữa hai tập tin này, lưu ý sao khi đóng tập

tin này ta không chọn lưu tập tin.

Bài tập 2: Nhập vào chương trình sau và biên dịch nó. Cho biết chương trình thực hiện điều gì?

—————————————————————————–

 

using System;

 

class variables

 

{

 

public static void Main()

 

{

 

int radius = 4;

 

const double PI = 3.14159;

 

double circum, area;

 

area = PI * radius* radius;

 

circum = 2 * PI * radius;

 

// in kết quả

 

Console.WriteLine(“Ban kinh = {0}, PI = {1}”, radius, PI); Console.WriteLine(“Dien tich {0}”, area); Console.WriteLine(“Chu vi {0}”, circum);

}

 

}

 

—————————————————————————–

Bài tập3: Nhập vào chương trình sau và biên dịch. Cho biết chương trình thực hiện điều gì?

—————————————————————————–

 

class AClass

 

 

{

 

static void Main()

 

{

 

int x, y;

 

for( x = 0; x < 10; x++, System.Console.Write(“\n”));

 

for( y = 0 ; y < 10; y++, System.Console.WriteLine(“{0}”,y));

 

}

 

}

 

—————————————————————————–

Bài tập4: Chương trình sau có chứa lỗi. Nhập vào và sửa những lỗi đó

—————————————————————————–

 

 

—————————————————————————–

Bài tập5: Sửa lỗi và biên dịch chương trình sau

—————————————————————————–

 

class Test

 

{

 

pubic static void Main()

 

{

 

 

 

Console.WriteLine(“Xin chao”);

 

Consoile.WriteLine(“Tam biet”);

 

}

 

}

 

—————————————————————————–

Bài tập6: Sửa lỗi và biên dịch chương trình sau

—————————————————————————–

 

class Test

 

{

 

pubic void Main()

 

{

 

Console.WriteLine(‘Xin chao’); Consoile.WriteLine(‘Tam biet’);

}

 

}

 

—————————————————————————–

Bài tập 7: Viết chương trình xuất ra bài thơ:

 

 

Rằm Tháng Giêng

 

Rằm xuân lồng lộng trăng soi,

 

Sông xuân nước lẫn màu trời thêm xuân. Giữa dòng bàn bạc việc quân

Khuya về bát ngát trăng ngân đầy thuyền.

 

Hồ Chí Minh.

 

Hết chương 2 .      

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.

Leave A Reply

Your email address will not be published.