C là một ngôn ngữ lập trình đơn giản, hiện đại, mục đích tổng quát, hướng đối tượng được phát triển bởi Microsoft bên trong phần khởi đầu. NET của họ, được phát triển chủ yếu bởi Anders Hejlsberg, một kiến trúc sư phần mềm nổi tiếng với các sản phẩm Turbo Pascal, Delphi, J++, WFC.
Trang 1http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 1
Mục lục
Học C# cơ bản và nâng cao 8
Đối với độc giả 8
Điều kiện tiền đề 8
Tổng quan về C# 8
Các đặc điểm lập trình mạnh mẽ của C# 9
Cài đặt môi trường C# 9
Giới thiệu Net Framework 10
Integrated Development Environment (IDE) cho C# 10
Viết chương trình C# trên Linux hoặc Mac OS 11
Cấu trúc chương trình C# 11
Tạo chương trình Hello World trong C# 11
Biên dịch và thực thi chương trình C# 13
Cú pháp C# cơ bản 14
Từ khóa using trong C# 16
Từ khóa class trong C# 16
Comments trong C# 16
Biến thành viên trong C# 16
Hàm thành viên trong C# 16
Thuyết minh một Class trong C# 16
Định danh (Identifier) trong C# 17
Từ khóa trong C# 17
Kiểu dữ liệu trong C# 18
Kiểu giá trị trong C# 19
Kiểu tham chiếu trong C# 21
Kiểu object trong C# 21
Kiểu Dynamic trong C# 21
Kiểu string trong C# 22
Trang 2http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 2
Kiểu con trỏ trong C# 22
Chuyển đổi kiểu trong C# 22
Phương thức chuyển đổi kiểu trong C# 23
Biến trong C# 26
Định nghĩa biến trong C# 27
Khởi tạo biến trong C# 27
Nhận giá trị từ người dùng trong C# 29
Biểu thức lvalue và rvalue trong C# 29
Hằng (Constant/Literal) trong C# 29
Hằng số nguyên trong C# 30
Hằng số thực trong C# 31
Hằng ký tự trong C# 31
Hằng chuỗi trong C# 33
Định nghĩa hằng trong C# 33
Toán tử trong C# 34
Toán tử số học trong C# 34
Toán tử quan hệ trong C# 35
Toán tử logic trong C# 36
Toán tử so sánh bit trong C# 37
Toán tử gán trong C# 40
Các toán tử hỗn hợp trong C# 42
Thứ tự ưu tiên toán tử trong C# 43
Điều khiển luồng trong C# 44
Toán tử ? : trong C# 46
Vòng lặp trong C# 46
Các lệnh điều khiển vòng lặp trong C# 47
Vòng lặp vô hạn trong C# 47
Ví dụ 48
Tính đóng gói trong C# 48
Trang 3http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 3
Public Access Specifier trong C# 49
Private Access Specifier trong C# 50
Protected Access Specifier trong C# 52
Internal Access Specifier trong C# 52
Protected Internal Access Specifier trong C# 54
Phương thức trong C# 54
Định nghĩa phương thức trong C# 54
Ví dụ 55
Gọi phương thức trong C# 56
Gọi phương thức đệ qui trong C# 58
Truyền tham số cho phương thức trong C# 59
Nullable trong C# 60
Toán tử ?? trong C# 61
Mảng (Array) trong C# 62
Khai báo mảng trong C# 62
Khởi tạo mảng trong C# 63
Gán giá trị cho một mảng trong C# 63
Truy cập các phần tử mảng trong C# 64
Sử dụng vòng lặp foreach trong C# 65
Chi tiết về mảng trong C# 66
Chu ỗi (String) trong C# 67
Tạo một đối tượng String trong C# 67
Các thuộc tính của lớp String trong C# 69
Phương thức của lớp String trong C# 69
Ví dụ 74
Cấu trúc (Structure) trong C# 77
Định nghĩa cấu trúc trong C# 77
Đặc điểm của cấu trúc trong C# 79
Phân biệt Class và Structure trong C# 80
Trang 4http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 4
Enum trong C# 82
Khai báo biến enum trong C# 82
Ví dụ 83
Lớp (Class) trong C# 83
Định nghĩa một Class trong C# 84
Hàm thành viên và tính đóng gói trong C# 86
Constructor trong C# 88
Destructor trong C# 91
Thành viên Static của một Class trong C# 92
Tính kế thừa trong C# 95
Lớp cơ sở (Base Class) và Lớp thừa kế (Derived Class) trong C# 95
Khởi tạo Lớp cơ sở (Base Class) trong C# 97
Đa kế thừa trong C# 99
Tính đa hình trong C# 101
Đa hình static trong C# 101
Nạp chồng hàm trong C# 102
Đa hình dynamic trong C# 103
Nạp chồng toán tử trong C# 107
Triển khai Nạp chồng toán tử trong C# 107
Toán tử có thể nạp chồng và không thể nạp chồng trong C# 110
Ví dụ 111
Interface trong C# 117
Khai báo Interface trong C# 117
Ví dụ 117
Namespace trong C# 120
Định nghĩa một Namespace trong C# 120
Từ khóa using trong C# 121
Lồng Namespace trong C# 123
Chỉ thị tiền xử lý trong C# 125
Trang 5http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 5
Các chỉ thị tiền xử lý trong C# 125
Chỉ thị tiền xử lý #define trong C# 126
Chỉ thị có điều kiện (Conditional Directive) trong C# 127
Regular Expression trong C# 128
Construct cho định nghĩa Regular Expression trong C# 128
Lớp Regex trong C# 129
Ví dụ 1 130
Ví dụ 2 131
Ví dụ 3 132
Xử lý ngoại lệ (Exception Handling) trong C# 133
Cú pháp 134
Lớp Exception trong C# 135
Xử lý ngoại lệ ( Exception Handling) trong C# 136
Tạo User-Defined Exception trong C# 137
Ném các Object trong C# 139
File I/O trong C# 139
Lớp I/O trong C# 139
Lớp FileStream trong C# 140
Ví dụ 142
Hoạt động File nâng cao trong C# 143
Attribute trong C# 143
Xác định một Attribute trong C# 144
Attribute được định nghĩa trước trong C# 144
AttributeUsage trong C# 144
Conditional trong C# 145
Obsolete trong C# 147
Tạo Custom Attribute trong C# 148
Khai báo một Custom Attribute trong C# 149
Xây dựng Custom Attribute trong C# 149
Trang 6http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 6
Áp dụng Custom Attribute trong C# 151
Reflection trong C# 152
Các ứng dụng của Reflection 152
Quan sát Metadata trong C# 153
Ví dụ 155
Thu ộc tính (Property) trong C# 159
Accessor trong C# 160
Ví dụ 161
Thuộc tính trừu tượng trong C# 164
Indexer trong C# 166
Cú pháp 167
Sự sử dụng của Indexer trong C# 167
Nạp chồng Indexer trong C# 170
Delegate trong C# 173
Khai báo Delegate trong C# 173
Khởi tạo Delegate trong C# 173
Multicast một Delegate trong C# 175
Cách sử dụng Delegate trong C# 177
Sự kiện (Event) trong C# 178
Sử dụng Delegate với Event trong C# 179
Khai báo Event trong C# 179
Ví dụ 1 179
Ví dụ 2 181
Collection trong C# 185
Các lớp Collection và cách sử dụng của chúng trong C# 185
Generic trong C# 186
Đặc điểm của Generic trong C# 189
Các phương thức Generic trong C# 190
Generic Delegate trong C# 191
Trang 7http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 7
Phương thức nặc danh trong C# 193
Viết một Phương thức nặc danh trong C# 193
Ví dụ 194
Unsafe code trong C# 195
Con trỏ (Pointer) trong C# 196
Thu hồi giá trị dữ liệu bởi sử dụng con trỏ trong C# 197
Truyền Con trỏ như là các Tham số tới phương thức trong C# 198
Truy cập các phần tử mảng bởi sử dụng một con trỏ trong C# 199
Biên dịch Unsafe Code trong C# 200
Đa luồng (Multithread) trong C# 201
Vòng đời của Thread trong C# 201
Main Thread trong C# 202
Thuộc tính và Phương thức của lớp Thread trong C# 203
Tạo Thread trong C# 208
Quản lý Thread trong C# 209
Hủy Thread trong C# 210
Tài liệu tham khảo C# 212
Link hữu ích về C# 212
Trang 8http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 8
Học C# cơ bản và nâng cao
C# là một ngôn ngữ lập trình đơn giản, hiện đại, mục đích tổng quát, hướng đối tượng được phát triển bởi Microsoft bên trong phần khởi đầu NET của họ, được phát triển chủ yếu bởi Anders Hejlsberg, một kiến trúc sư phần mềm nổi tiếng với các sản phẩm Turbo Pascal, Delphi, J++, WFC Loạt bài hướng dẫn này sẽ cung cấp cho bạn kiến thức cơ bản về lập trình C# qua các khái niệm
từ cơ bản đến nâng cao liên quan tới ngôn ngữ lập trình C#
Loạt bài hướng dẫn của chúng tôi dựa trên nguồn tài liệu của: Tutorialspoint
Đối với độc giả
Loạt bài hướng dẫn này được xây dựng cho người mới học để giúp họ hiểu các khái niệm cơ bản
về lập trình C#
Điều kiện tiền đề
Ngôn ngữ lập trình C# là dựa trên các ngôn ngữ lập trình C và C++, vì thế, nếu bạn đã hiểu cơ bản
về C và C++, thì điều này sẽ giúp bạn học tập C# dễ dàng hơn
Tổng quan về C#
C# là một ngôn ngữ lập trình đơn giản, hiện đại, mục đích tổng quát, hướng đối tượng được phát triển bởi Microsoft và được phê chuẩn bởi European Computer Manufacturers Association (ECMA)
và International Standards Organization (ISO)
C# được phát triển bởi Anders Hejlsberg và team của ông trong khi phát triển Net Framework C# được thiết kế cho Common Language Infrastructure (CLI), mà gồm Executable Code và Runtime Environment, cho phép chúng ta sử dụng các ngôn ngữ high-level đa dạng trên các nền tảng và cấu trúc máy tính khác nhau
Dưới đây là các lý do làm C# là ngôn ngữ lập trình chuyên nghiệp được sử dụng rộng rãi:
Nó là một ngôn ngữ lập trình hiện đại, mục đích tổng quát
Nó là hướng đối tượng
Trang 9http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 9
Nó dễ dàng để học
Nó là một ngôn ngữ được cấu trúc
Nó tạo các chương trình hiệu quả
Nó có thể được biên dịch trên nhiều nền tảng máy tính khác nhau
Nó là một phần của Net Framework
Các đặc điểm lập trình mạnh mẽ của C#
Cấu trúc C# khá gần với các ngôn ngữ high-level truyền thống, C và C++, và là một ngôn ngữ lập trình hướng đối tượng Nó có sự giống nhau mạnh mẽ với Java, nó có nhiều đặc điểm lập trình mạnh mẽ mà làm cho nó trở nên ưa thích với các lập trình viên trên toàn thế giới
Dưới đây là các đặc điểm quan trọng của C#:
Điều kiện Boolean
Tự động dọn rác bởi Garbage-Collector (GC)
Thư viện chuẩn (Standard Library)
Assembly
Property và sự kiện (Event)
Delegate Quản lý sự kiện
Dễ dàng để sử dụng Generic
Indexer
Biên dịch có điều kiện (Conditional Compilation)
Đa luồng dễ dàng (Multithreading)
LINQ và Lambda Expression
Tích hợp với Windows
Cài đặt môi trường C#
Trong chương này, chúng tôi sẽ giới thiệu các công cụ cần thiết để cài đặt môi trường C# Chúng tôi đã đề cập rằng C# là một phần của Net Framework và được sử dụng để viết các ứng dụng Net Vì thế, trước khi thảo luận về các công cụ có sẵn để chạy một chương trình C#, bạn nên hiểu cách C# liên quan tới Net Framework
Trang 10http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 10
Giới thiệu Net Framework
.Net Framework là một nền tảng mang tính cách mạng giúp bạn viết các kiểu ứng dụng sau:
Common Language Runtime (CLR)
Net Framework Class Library
Common Language Specification
Common Type System
Metadata và Assembly
Windows Form
ASP.Net và ASP.Net AJAX
ADO.Net
Windows Workflow Foundation (WF)
Windows Presentation Foundation
Windows Communication Foundation (WCF)
LINQ
Integrated Development Environment (IDE) cho C#
Microsoft cung cấp các công cụ phát triển sau cho lập trình C#:
Visual Studio 2010 (VS)
Visual C# 2010 Express (VCE)
Visual Web Developer
Trang 11http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 11
Hai công cụ sau là có sẵn và miễn phí tại Website chính thức của Microsoft Sử dụng các tool này, bạn có thể viết tất cả các loại chương trình C# từ các ứng dụng dòng lệnh đơn giản tới các ứng dụng phức tạp hơn Bạn cũng có thể viết các tệp source code của C# bởi sử dụng một Text Editor
cơ bản, như Notepad, và biên dịch code đó vào trong Assembly bởi sử dụng Command-line Compiler, mà là một phần của Net Framework
Trong loạt bài này, chúng tôi sử dụng Visual C# 2010 Express và bạn có thể tải nó từ:Microsoft Visual Studio Nó được cài đặt tự động trên máy tính của bạn
Viết chương trình C# trên Linux hoặc Mac OS
Mặc dù Net Framework chạy trên Hệ điều hành Windows, nhưng cũng có một số phiên bản thay
thế làm việc trên các Hệ điều hành khác Mono là một phiên bản mã nguồn mở của Net
Framework mà gồm một C# compiler và chạy trên một số Hệ điều hành, gồm Linux và Mac OS Bạn có thể truy cập: Go Mono
Mục đích của Mono không chỉ để chạy trên các ứng dụng Net trên Microsoft, mà còn đem lại công
cụ phát triển cho các lập trình viên Linux Mono có thể chạy trên nhiều Hệ điều hành khác nhau, như Android, BSD, iOS, Linux, OS X, Windows, Solaris, và UNIX
Trang 12http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 12
Giờ chúng ta xem xét các phần của chương trình trên:
Dòng đầu tiên using System; Từ khóa using được sử dụng để bao Systemnamespace trong chương trình Nói chung, một chương trình có nhiều lệnh using
Dòng tiếp theo có khai báo namespace Một namespace là một tập hợp các
lớp.HelloWorldApplication namespace chứa class HelloWorld
Dòng tiếp theo có một khai báo class, class HelloWorld chứa các định nghĩa dữ liệu và
phương thức mà chương trình của bạn sử dụng Nói chung, class chứa nhiều phương
thức Các phương thức định nghĩa hành vi của class Tuy nhiên, lớpHelloWorld chỉ có một
phương thức Main
Dòng tiếp theo định nghĩa phương thức Main, mà là entry point cho tất cả chương trình C# Phương thức Main biểu diễn trạng thái lớp khi được thực thi
Dòng tiếp theo /*…*/ bị bỏ qua bởi compiler và nó là comment cho chương trình
Phương thức Main xác định hành vi của nó với lệnh Console.WriteLine("Hello World");
Trang 13http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 13
WriteLine là một phương thức của lớp Console được định nghĩa trong System namespace
Lệnh này làm thông báo “Hello, World!” được hiển thị trên màn hình
Dòng cuối cùng Console.ReadKey(); là cho VS.NET Users Nó làm chương trình đợi cho
một phím được nhấn và nó ngăn cản màn hình chạy và đóng một cách nhanh chóng khi chương trình được phát động từ Visual Studio.Net
Bạn nên ghi nhớ các điểm sau:
C# là phân biệt kiểu chữ (case sensitive)
Tất cả lệnh và biểu thức phải kết thúc với một dấu chấm phảy (;)
Sự thực thi chương trình bắt đầu tại phương thức Main
Không giống Java, tên file chương trình có thể khác tên lớp
Biên dịch và thực thi chương trình C#
Nếu bạn đang sử dụng Visual Studio.Net để biên dịch và thực thi các chương trình C#, bạn theo các bước sau:
Bắt đầu Visual Studio
Trên thanh menu, chọn File -> New -> Project
Chọn Visual C# từ các Template, và sau đó chọn Windows
Chọn Console Application
Xác định tên cho project và nhấn nút OK
Điều này tạo New Project trong Solution Explorer
Viết code trong Code Editor
Nhấn nút Run hoặc nhấn phím F5 để thực thi project Một cửa sổ Command Prompt xuất hiện mà chứa dòng Hello World
Bạn có thể biên dịch một chương trình C# bởi sử dụng command-line thay cho Visual Studio IDE:
Mở một Text Editor và thêm code trên vào
Trang 14http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 14
Lưu tệp dưới dạng helloworld.cs
Mở công cụ Command Prompt tool và tới thư mục nơi bạn lưu file đó
Soạn csc helloworld.cs và nhấn Enter để biên dịch code của bạn
Nếu không có lỗi nào trong code, thì Command prompt đưa bạn tới dòng tiếp theo và tạo
tệp helloworld.exe có thể thực thi (executable)
Soạn helloworld để thực thi chương trình của bạn
Bạn có thể thấy output là Hello World được in trên màn hình
Cú pháp C# cơ bản
C# là một ngôn ngữ lập trình hướng đối tượng Trong phương pháp lập trình hướng đối tượng, một chương trình gồm các đối tượng đa dạng mà tương tác với nhau các cách thức của action Các action mà một đối tượng có thể nhận được gọi là các phương thức Các đối tượng cùng loại được xem như là có cùng kiểu hoặc, được xem như là trong cùng lớp
Ví dụ, xét đối tượng Rectangle Nó có các thuộc tính như length và width Phụ thuộc vào thiết kế trên Nó có thể cần những cách để cấp nhận các giá trị của thuộc tính này, tính toán diện tích và hiển thị chi tiết
Bạn theo dõi ví dụ sau triển khai một lớp Rectangle và cú pháp C# cơ bản của chương trình này:
Trang 15http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 15
Console WriteLine ( "Length: {0}" , length );
Console WriteLine ( "Width: {0}" , width );
Console WriteLine ( "Area: {0}" , GetArea ());
Trang 16http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 16
Từ khóa using trong C#
Lệnh đầu tiên trong bất kỳ chương trình C# nào là:
using System ;
Từ khóa using được sử dụng để bao namespace trong chương trình Một chương trình C# có thể
bao nhiều lệnh using
Từ khóa class trong C#
Từ khóa class được sử dụng để khai báo một lớp trong C#
Comments trong C#
Comment được sử dụng để thuyết minh code Compiler bỏ qua các comment Các comment đa dòng trong các chương trình C# bắt đầu với /* và kết thúc với */ như sau:
/* This program demonstrates
The basic syntax of C# programming
Language */
Comment đơn dòng được chỉ dẫn bởi ký hiệu „//‟ Ví dụ:
} //end class Rectangle
Biến thành viên trong C#
Các biến là các thuộc tính hoặc thành viên dữ liệu của một lớp, được sử dụng để lưu giữ dữ liệu
Trong chương trình trước đó, lớp Rectangle có hai biến thành viên là length và width
Hàm thành viên trong C#
Hàm là tập hợp các lệnh mà thực hiện một tác vụ cụ thể Các hàm thành viên của một lớp được khai báo bên trong lớp đó Lớp Rectangle chứa 3 hàm thành viên
là: AcceptDetails,GetArea và Display
Thuyết minh một Class trong C#
Trong chương trình trên, lớp ExecuteRectangle chứa phương thức Main() và thuyết minh lớpRectangle
Trang 17http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 17
Định danh (Identifier) trong C#
Một định danh là một tên được sử dụng để nhận diện một lớp, biến, hàm hoặc bất kỳ mục tự định nghĩa (user-defined)
Một tên phải bắt đầu với một chữ cái mà có thể được theo sau bởi một dãy các chữ cái, ký
số (0-9) hoặc dấu gạch dưới (_) Ký tự đầu tiên của một định danh không thể là một ký số
Nó phải không chứa bất kỳ khoảng trống hoặc ký tự như ? - + ! @ # % ^ & * ( ) [ ] { } ; : " ' /
và \ Tuy nhiên, dấu gạch dưới có thể được sử dụng
Nó không nên là một từ khóa trong C#
Từ khóa trong C#
Từ khóa là các từ dành riêng (Reserved Keyword) được định nghĩa trước cho C# compiler Những
từ khóa này không thể được sử dụng làm định danh Tuy nhiên, nếu bạn muốn sử dụng các từ khóa này để làm định danh, bạn có thể đặt ký tự @ ở trước chúng
Trong C#, một số định danh có ý nghĩa đặc biệt trong ngữ cảnh của code, ví dụ như get và set được gọi là các contextual keyword (từ khóa thuộc ngữ cảnh)
Bảng sau liệt kê các từ khóa dành riêng và các từ khóa thuộc ngữ cảnh trong C#:
Reserved Keyword
modifier)
int
Trang 18http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 18
modifier)
volatile while
Contextual Keyword trong C#
(type)
partial
(method)
Kiểu dữ liệu trong C#
Các biến trong C# được phân chia thành các kiểu sau:
Kiểu giá trị (Value type)
Kiểu tham chiếu (Reference type)
Kiểu con trỏ (Pointer type)
Trang 19http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 19
Kiểu giá trị trong C#
Các biến kiểu giá trị có thể được gán một giá trị một cách trực tiếp Chúng được kế thừa từ
lớp System.ValueType
Kiểu giá trị trực tiếp chứa dữ liệu Một số ví dụ là int, char, và float, tương ứng giữ số nguyên, chữ cái, và số thực Khi bạn khai báo một kiểu int, hệ thống cấp phát bộ nhớ để lưu giá trị đó
Bảng sau liệt kê các kiểu giá trị có sẵn trong C# 2010:
mặc định
byte Kiểu unsigned integer
long Kiểu signed integer (64
bit)
-9,223,372,036,854,775,808 tới 9,223,372,036,854,775,807
0L
Trang 20http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 20
sbyte Kiểu signed integer (8
Để lấy kích cỡ chính xác của một kiểu hoặc một biến trên một nền tảng cụ thể, bạn có thể sử dụng
phương thức sizeof Biểu thức sizeof(type) hiển thị kích cỡ của đối tượng hoặc kiểu bằng giá trị
byte Ví dụ dưới đây để lấy kích cỡ của kiểu int trên bất kỳ máy tính:
Trang 21http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 21
Kiểu tham chiếu trong C#
Kiểu tham chiếu không chứa dữ liệu thực sự được lưu giữ trong một biến, nhưng chúng chứa một tham chiếu tới các biến
Nói cách khác, chúng tham chiếu tới một vị trí bộ nhớ Việc sử dụng nhiều biến, thì kiểu tham chiếu
có thể tham chiếu tới tới một vị trí bộ nhớ Nếu dữ liệu trong vị trí bộ nhớ bị thay đổi bởi một trong
số các biến, thì biến khác tự động phản ánh sự thay đổi về giá trị này Ví dụ các kiểu tham chiếu có
sẵn trong C# là: object, dynamic, và string
Kiểu object trong C#
Kiểu object là lớp cơ sở cơ bản cho tất cả kiểu dữ liệu trong C# Common Type System (CTS)
Object là một alias cho lớp System.Object Các kiểu object có thể được gán giá trị của bất kỳ kiểu, kiểu giá trị, kiểu tham chiếu, kiểu tự định nghĩa (user-defined) khác Tuy nhiên, trước khi gán các giá trị, nó cần một sự chuyển đổi kiểu
Khi một kiểu giá trị được chuyển đổi thành kiểu object, nó được gọi là boxing và ngược lại, khi một kiểu object được chuyển đổi thành kiểu giá trị, nó được gọi là unboxing
object obj ;
obj = 100 ; // this is boxing
Kiểu Dynamic trong C#
Bạn có thể lưu giữ bất kỳ kiểu giá trị nào trong biến kiểu dữ liệu dynamic Việc kiểm tra các kiểu biến này diễn ra tại run time
Cú pháp để khai báo một kiểu dynamic trong C# là:
dynamic <variable_name> value ;
Ví dụ
dynamic d = 20 ;
Kiểu dynamic là tương tự với kiểu object, ngoại trừ việc kiểm tra cho các biến kiểu object diễn ra tại compile time, trong khi việc kiểm tra các biến kiểu dynamic diễn ra tại run time
Trang 22http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 22
Kiểu string trong C#
Kiểu string trong C# cho phép bạn gán bất kỳ giá trị chuỗi nào cho một biến Kiểu string là
một alias cho lớp System.String Nó kế thừa từ kiểu object Giá trị cho một kiểu string có thể được
gán bởi sử dụng các hằng chuỗi trong hai mẫu: quoted và @quoted
Ví dụ:
String str = "Tutorials Point" ;
Và một hằng chuỗi @quoted trông như sau:
@ "Tutorials Point" ;
Các kiểu tự định nghĩa (user-defined) trong C# là: Class, Interface, hoặc Delegate Chúng ta sẽ bàn về các kiểu này trong các chương sau
Kiểu con trỏ trong C#
Các biến kiểu con trỏ lưu giữ địa chỉ bộ nhớ của kiểu khác Các con trỏ trong C# có khả năng như con trỏ trong C hoặc C++
Cú pháp để khai báo một kiểu con trỏ trong C# là:
type * identifier ;
Ví dụ:
char * cptr ;
int * iptr ;
Chúng ta sẽ thảo luận về kiểu con trỏ ở chương: Unsafe Code trong C#
Chuyển đổi kiểu trong C#
Chuyển đổi kiểu trong C# là biến đổi một kiểu dữ liệu này thành kiểu dữ liệu khác Nó còn được gọi
là Ép kiểu Trong C#, ép kiểu có hai mẫu sau:
Chuyển đổi kiểu ngầm định (implicit) - Việc chuyển đổi này được thực hiện bởi C# theo
một phương thức an toàn kiểu (type-safe) Ví dụ: việc chuyển đổi từ các lớp kế thừa thành các lớp cơ sở
Trang 23http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 23
Chuyển đổi kiểu tường minh (explicit) - Việc chuyển đổi này được thực hiện một cách rõ
ràng bởi người dùng bằng việc sử dụng các hàm được định nghĩa trước Các chuyển đổi kiểu tường minh cần một toán tử cast
Ví dụ sau minh họa một sự chuyển đổi kiểu tường minh trong C#:
Phương thức chuyển đổi kiểu trong C#
C# cung cấp các phương thức chuyển đổi kiểu có sẵn được liệt kê trong bảng sau:
STT Phương thức & Miêu tả
1 ToBoolean
Trang 24http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 24
Chuyển đổi một kiểu thành một giá trị Boolean, nếu có thể
Trang 25http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 25
Chuyển đổi một kiểu thành một unsigned big integer
Ví dụ sau minh họa cách chuyển đổi các kiểu đa dạng thành kiểu string trong C#:
Trang 26http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 26
Console WriteLine ( ToString ());
Console WriteLine ( ToString ());
Console WriteLine ( ToString ());
Console WriteLine ( ToString ());
Các kiểu giá trị cơ bản trong C# có thể được phân chia thành:
Kiểu Integral sbyte, byte, short, ushort, int, uint, long, ulong, và char
Kiểu Floating point float và double
Trang 27http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 27
C# cũng cho phép định nghĩa các kiểu giá trị khác của biến như kiểu enum và các kiểu tham chiếu của biến như class, sẽ được bàn luận trong các chương tới
Định nghĩa biến trong C#
Cú pháp để định nghĩa biến trong C# là:
<data_type> <variable_list> ;
Ở đây, data_type phải là một kiểu dữ liệu hợp lệ trong C#, gồm: char, int, double hoặc bất kỳ kiểu
dữ liệu tự định nghĩa (user-defined) nào và variable_list có thể chứa một hoặc nhiều tên định danh
được phân biệt bởi dấu phảy
Dưới đây là một số định nghĩa biến hợp lệ trong C#:
Biến được khởi tạo (được gán một giá trị) với một dấu bằng được theo sau bởi một biểu thức hằng Form chung cho khởi tạo biến trong C# là:
Trang 28http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 28
Một số ví dụ về khởi tạo biến trong C# là:
int d = 3 f = 5 /* initializing d and f */
byte z = 22 ; /* initializes z */
double pi = 3.14159 ; /* declares an approximation of pi */
char x = 'x' ; /* the variable x has the value 'x' */
Việc khởi tạo biến một cách chính xác là một bài thực hành tốt cho bạn, nếu không thì chương trình có thể tạo ra kết quả không mong đợi
Ví dụ sau sử dụng các kiểu biến đa dạng trong C#:
Trang 29http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 29
a = 10, b = 20, c = 30
Nhận giá trị từ người dùng trong C#
Lớp Console trong System namespace cung cấp hàm ReadLine() để nhận đầu vào từ người
dùng và lưu nó vào trong một biến
Ví dụ:
int num ;
num = Convert ToInt32 ( Console ReadLine ());
Hàm Convert.ToInt32() chuyển đổi dữ liệu đã nhập bởi người dùng thành kiểu dữ liệu int, bởi
vì Console.ReadLine() chấp nhận dữ liệu trong định dạng chuỗi
Biểu thức lvalue và rvalue trong C#
Có hai loại biểu thức trong C#:
lvalue: Một biểu thức mà là một lvalue có thể xuất hiện hoặc bên trái hoặc bên phải của phép gán trong C#
rvalue: Một biểu thức mà là một rvalue có thể xuất hiện bên phải nhưng không thể ở bên trái của một phép gán trong C#
Các biến là lvalue và vì thế chúng có thể xuất hiện ở bên trái của một phép gán Các hằng số là rvalue và vì thế chúng không thể được gán và không thể xuất hiện ở bên trái của một phép gán Sau đây là một lệnh hợp lệ trong C#:
Trang 30http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 30
Constant là một kiểu dữ liệu thay thế cho Literal, còn Literal thể hiện chính nó Trong ví dụ: const PI
= 3.14 thì Constant ở đây là PI, còn Literal là 3.14
Constant có thể là bất kỳ kiểu dữ liệu cơ bản nào trong C#, và có thể được phân chia thành giá trị hằng số nguyên, hằng số thực, hằng ký tự, hằng chuỗi và Boolean literal (tạm dịch: hằng logic) Ngoài ra, C# cũng có các kiểu hằng liệt kê
Ngoài ra, constant được đối xử giống như các biến thông thường, ngoại trừ việc giá trị của chúng
là không thể thay đổi sau khi định nghĩa
Hằng số nguyên trong C#
Hằng số nguyên có thể là decimal (cơ số 10), octal (cơ số 8) hay hexadecimal (cơ số 16) Giá trị
có tiền tố (prefix) là 0 cho octal, là 0x hay 0X cho hexadecimal và không có gì cho decimal
Một hằng số nguyên cũng có các hậu tố (suffix) U hay L thể hiện kiểu unsigned hay long Hậu tố có thể là chữ hoa hoặc chữ thường và có thể trong bất kỳ thứ tự nào
Ví dụ về các hằng số nguyên:
212 /* Legal */
215u /* Legal */
0xFeeL /* Legal */
078 /* Illegal: 8 is not an octal digit */
032UU /* Illegal: cannot repeat a suffix */
Dưới đây là các kiểu hằng số nguyên đa dạng:
Trang 31http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 31
Hằng số thực trong C#
Một hằng số thực bao gồm phần nguyên (integer part), dấu chấm thập phân (decimal point), phần
lẻ (fraction part) và phần mũ (exponent part) Chúng ta có thể biểu diễn hằng số thực theo dạng decimal hay dạng mũ
Xét các ví dụ sau:
3.14159 /* Legal */
314159E-5L /* Legal */
510E /* Illegal: incomplete exponent */
210f /* Illegal: no decimal or exponent */
e55 /* Illegal: missing integer or fraction */
Khi thể hiện dạng decimal phải bao gồm dấu chấm thập phân, phần mũ hoặc cả hai Khi thể hiện dạng mũ phải gồm phần nguyên, phần lẻ hoặc cả hai Dạng mũ đi kèm với kí tự E hoặc e
Hằng ký tự trong C#
Các hằng kí tự trong C# mở đầu và kết thúc bởi dấu nháy đơn Nếu hằng ký tự bắt đầu với L (ví
dụ L„x‟) thì nó là kiểu wchar_t Nếu không thì, nó là hằng ký tự kiểu char, ví dụ như „x‟
Hằng kí tự có thể là một kí tự (như „X‟), một escape sequence (như „\t‟) hay một kí tự mở rộng (như
„\u02c0′)
Một số kí tự trong C# khi được đứng trước bởi dấu \ thì chúng sẽ mang một ý nghĩa đặc biệt như bắt đầu dòng mới „\n‟ hay tạo một tab „\t‟ Chúng được biết như là escape sequence (dãy thoát) Bảng dưới đây thể hiện một số mã escape sequence phổ biến:
Dãy thoát Ý nghĩa
Trang 32http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 32
\xhh Số thập lục phân của một hoặc nhiều ký số
Sau đây là ví dụ để chỉ một số ký tự dãy thoát:
Trang 33http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 33
Hằng chuỗi chứa trong dấu nháy kép, ví dụ “abc” Một chuỗi sẽ chứa các kí tự tương tự hằng kí
tự, gồm các ký tự thuần, escape sequence, và các ký tự mở rộng
Có thể ngắt một dòng dài thành nhiều dòng bởi sử dụng hằng chuỗi và phân biệt chúng bởi sử dụng khoảng trắng (whitespace)
Xét ví dụ một hằng chuỗi trong C# thể hiện theo 3 cách khác nhau:
Hằng trong C# được định nghĩa bởi sử dụng từ khóa const Cú pháp để định nghĩa một hằng là:
const <data_type> <constant_name> value ;
Chương trình sau minh họa cách định nghĩa và sử dụng một hằng trong chương trình C# của bạn:
Trang 34http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 34
// constant declaration
double r ;
Console WriteLine ( "Enter Radius: " );
r = Convert ToDouble ( Console ReadLine ());
Trang 35http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 35
Ví dụ
Toán
tử
Toán tử quan hệ trong C#
Bảng dưới đây liệt kê các toán tử quan hệ được hỗ trợ bởi ngôn ngữ C# Giả sử biến A giữ giá trị
Trang 36http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 36
!= Kiểm tra 2 toán hạng có giá trị khác nhau hay không Nếu không bằng thì
điều kiện là true
(A != B) là true
> Kiểm tra nếu toán hạng bên trái có giá trị lớn hơn toán hạng bên phải hay
không Nếu lớn hơn thì điều kiện là true
(A >
B) là không đúng
< Kiểm tra nếu toán hạng bên trái nhỏ hơn toán hạng bên phải hay không Nếu
nhỏ hơn thì là true
(A <
B) là true
>= Kiểm tra nếu toán hạng bên trái có giá trị lớn hơn hoặc bằng giá trị của toán
hạng bên phải hay không Nếu đúng là true
(A >= B) là không đúng
<= Kiểm tra nếu toán hạng bên trái có giá trị nhỏ hơn hoặc bằng toán hạng bên
phải hay không Nếu đúng là true
(A <= B) là true
Toán tử logic trong C#
Bảng dưới đây chỉ rõ tất cả các toán tử logic được hỗ trợ bởi ngôn ngữ C# Giả sử biến A có giá trị
&& Được gọi là toán tử logic AND (và) Nếu cả hai toán tử đều có giá trị khác 0
thì điều kiện trở lên true
(A
&&
B) là false
Trang 37http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 37
|| Được gọi là toán tử logic OR (hoặc) Nếu một trong hai toán tử khác 0, thì
điều kiện là true
(A || B) là true
! Được gọi là toán tử NOT (phủ định) Sử dụng để đảo ngược lại trạng thái
logic của toán hạng đó Nếu điều kiện toán hạng là true thì phủ định nó sẽ là
false
!(A
&&
B) là true
Toán tử so sánh bit trong C#
Toán tử so sánh bit làm việc trên đơn vị bit, tính toán biểu thức so sánh từng bit Bảng dưới đây về
&, |, và ^ như sau:
Trang 38http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 38
~A = 1100 0011
Các toán tử so sánh bit được hỗ trợ bởi ngôn ngữ C# được liệt kê trong bảng dưới đây Giá sử ta
có biến A có giá tri 60 và biến B có giá trị 13, ta có:
là 12, tức là
0000
1100
| Toán tử OR (hoặc) nhị phân sao chép một bit tới kết quả nếu nó tồn tại trong
một hoặc hai toán hạng
(A | B) sẽ cho kết quả
là 61, tức là
0011
1101
^ Toán tử XOR nhị phân sao chép bit mà nó chỉ tồn tại trong một toán hạng mà
không phải cả hai
(A ^ B) sẽ cho kết quả
là 49, tức là
0011
0001
Trang 39http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 39
sẽ cho kết quả
là
-61, tức là
1100
0011
<< Toán tử dịch trái Giá trị toán hạng trái được dịch chuyển sang trái bởi số các
bit được xác định bởi toán hạng bên phải
A <<
2 sẽ cho kết quả
240, tức là
1111
0000 (dịch sang trái hai bit)
>> Toán tử dịch phải Giá trị toán hạng trái được dịch chuyển sang phải bởi số
các bit được xác định bởi toán hạng bên phải
A >>
2 sẽ cho kết quả
là 15, tức là
0000
1111 (dịch sang phải hai bit)
Trang 40http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Trang 40
= C *
A