C# là gì ?C# hay C sharp là một ngôn ngữ lập trình đơn giản, được phát triển bởi độingũ kỹ sư của Microsoft vào năm 2000, trong đó người dẫn đầu là Anders Hejlsbergvà Scott Wiltamuth.C#
TỔNG QUAN VỀ NGÔN NGỮ C#
C# là gì ?
C# (hay C sharp) là một ngôn ngữ lập trình đơn giản, được phát triển bởi đội ngũ kỹ sư của Microsoft vào năm 2000, trong đó người dẫn đầu là Anders Hejlsberg và Scott Wiltamuth.
C# là ngôn ngữ lập trình hiện đại, hướng đối tượng và nó được xây dựng trên nền tảng của hai ngôn ngữ mạnh nhất là C++ và Java.
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.
C# với sự hỗ trợ mạnh mẽ của NET Framework giúp cho việc tạo một ứng dụng Windows Forms hay WPF (Windows Presentation Foundation), trở nên rất dễ dàng.
Mục tiêu của việc phát triển C#
Tiêu chuẩn ECMA liệt kê các mục tiêu của việc thiết kế ngôn ngữ C#:
- Ngôn ngữ được dự định là một ngôn ngữ lập trình đơn giản, hiện đại, hướng đến nhiều mục đích sử dụng, và là một ngôn ngữ lập trình hướng đối tượng.
- Ngôn ngữ và việc triển khai đáp ứng các nguyên tắc của ngành kỹ thuật phần mềm như kiểm tra chặt chẽ kiểu dữ liệu, kiểm tra giới hạn mảng, phát hiện các trường hợp sử dụng các biến chưa có dữ liệu, và tự động thu gom rác Tính mạnh mẽ, sự bền bỉ, và năng suất của việc lập trình là rất quan trọng đối với ngôn ngữ này.
- Ngôn ngữ sẽ được sử dụng để phát triển các thành phần của phần mềm theo hướng thích hợp cho việc triển khai trong các môi trường phân tán.
- Khả năng di chuyển (portability) là rất quan trọng, đặc biệt là đối với những lập trình viên đã quen với C và C++.
- Hỗ trợ quốc tế hóa (i18n).
- Ngôn ngữ sẽ được thiết kế để phù hợp với việc viết các ứng dụng cho cả hai hệ thống: hosted và nhúng, từ các phần mềm quy mô lớn, đến các phần mềm chỉ có các chức năng đơn giản.
- Mặc dù các ứng dụng C# có tính kinh tế đối với các yêu cầu về bộ nhớ và chế độ xử lý, ngôn ngữ này không cạnh tranh trực tiếp về hiệu năng và kích thước đối với ngôn ngữ C hoặc assembly.
Reading TEST 3 - ôn anh văn buh nance 100% (3)13
Các đặc trưng của ngôn ngữ C#
C# là ngôn ngữ đơn giản: Như ta đã biết thì ngôn ngữ C# dựng trên nền tảng
C++ và Java nên ngôn ngữ C# khá đơn giản 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.
C# là ngôn ngữ hiện đại: Một vài khái niệm khá mới mẻ khá mơ hồ với các bạn vừa mới học lập trình, như xử lý ngoại lệ, những kiểu dữ liệu mở rộng, bảo mật mã nguồn v v Đây là những đặc tính được cho là của một ngôn ngữ hiện đại cần có Và C# chứa tất cả các đặt tính ta vừa nêu trên Các bạn sẽ dần tìm hiểu được các đặt tính trên qua các bài học trong series này.
C# là một ngôn ngữ lập trình thuần hướng đối tượng: Lập trình hướng đối tượng (tiếng Anh: Object-oriented programming, viết tắt: OOP) là một phương pháp lập trình có 4 tính chất Đó là tính trừu tượng (abstraction), tính đóng gói (encapsulation), tính đa hình (polymorphism) và tính kế thừa (inheritance) C# hỗ trợ cho chúng ta tất cả những đặc tính trên Và để hiểu rõ hơn thì chúng ta sẽ có một chương trình bày về phần này.
C# là một ngôn ngữ ít từ khóa: C# được mô tả là ngôn ngữ sử dụng giới hạn những từ khóa (gồm khoảng 80 từ khóa và mười mấy kiểu dữ liệu xây dựng sẵn). Nếu bạn nghĩ rằng ngôn ngữ có càng nhiều từ khóa thì sẽ càng mạnh mẽ hơn Điều này không phải sự thật, lấy ví dụ ngôn ngữ C# làm điển hình nhé Nếu bạn học sâu về C# bạn sẽ 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.
Ưu điểm và nhược điểm
1 Dễ học và sử dụng: C# được thiết kế để dễ học và sử dụng cho các lập trình viên, đặc biệt là cho những người đã có kinh nghiệm với ngôn ngữ lập trình C++ hoặc
2 Hỗ trợ mạnh mẽ cho lập trình hướng đối tượng: C# là một ngôn ngữ lập trình hướng đối tượng (OOP) mạnh mẽ với tính chất kế thừa, đa hình, trừu tượng và đóng gói.
3 Tích hợp tốt với nền tảng
Microsoft: C# là ngôn ngữ chính thức của nền tảng Microsoft, nên có sự tích hợp tốt với các công cụ và dịch vụ của Microsoft, như NET Framework và Visual Studio.
4 Hiệu năng tốt: C# có hiệu năng tương đối tốt, đặc biệt là khi được biên dịch thành mã máy.
5 Bảo mật: C# có cơ chế bảo mật mạnh mẽ, bao gồm quản lý bộ nhớ tự động và kiểm soát truy cập vào dữ liệu, giúp tránh các lỗ hổng bảo mật phổ biến.
6 Hỗ trợ đa nền tảng: Với NET Core
(nay đã trở thành NET 5 và các phiên bản sau), C# hỗ trợ việc phát triển ứng dụng đa nền tảng, bao gồm Windows, macOS và
1 Phụ thuộc vào môi trường Microsoft: C# thường phụ thuộc vào các công cụ và framework của Microsoft, điều này có thể giới hạn tính đa nền tảng của ứng dụng nếu bạn muốn chạy trên các hệ thống không phải của Microsoft.
2 Tài liệu hạn chế: So với một số ngôn ngữ lập trình khác như Java hoặc Python, tài liệu và cộng đồng hỗ trợ C# có thể hạn chế hơn.
3 Tốn thời gian biên dịch:
Do C# là một ngôn ngữ tĩnh, mã nguồn cần được biên dịch thành mã máy trước khi chạy, điều này có thể làm tăng thời gian phát triển so với các ngôn ngữ biên dịch tức thời.
4 Giới hạn cho các ứng dụng đặc biệt: C# thường được sử dụng cho phát triển các ứng dụng Windows, trò chơi, ứng dụng di động (qua Xamarin), và các ứng dụng web ASP.NET Nếu bạn muốn phát triển một loại ứng dụng khác, có thể có những ngôn ngữ phù hợp hơn.
So sánh C# và Java
Nhà phát triển Phát triển bởi Microsoft và được sử dụng chủ yếu cho các ứng dụng Windows và nền tảng Microsoft.
Phát triển bởi Sun Microsystems (nay là Oracle) và là một ngôn ngữ đa nền tảng, có thể chạy trên nhiều hệ điều hành khác nhau.
Sử dụng Visual Studio là IDE
Có nhiều lựa chọn IDE, trong đó phổ biến nhất là Eclipse và IntelliJ IDEA.
Cú pháp C# có một số cú pháp đặc biệt như sự hỗ trợ mạnh mẽ cho thuộc tính (properties) và sự kiện (events).
C# và Java đều có cú pháp tương tự với các khái niệm cơ bản như lớp (class), phương thức (method), và biến (variable).
C# và Java đều là ngôn ngữ lập trình hướng đối tượng (OOP) mạnh mẽ với tính chất kế thừa, đa hình, trừu tượng và đóng gói.
Hiệu năng Cả C# và Java đều có hiệu năng tốt và gần với các ngôn ngữ lập trình gần với mã máy như C++.
Tích hợp và công nghệ liên quan
Tích hợp chặt chẽ với các công nghệ của Microsoft như NET Framework,
Sử dụng rộng rãi trong phát triển web (Java EE), phát triển ứng dụng Android (sử dụng Android Studio) và các ứng dụng phía máy chủ (Java Spring).
Cộng đồng và tài liệu
C# cũng có một cộng đồng lớn và nhiều tài liệu hữu ích, nhưng có thể không nhiều bằng Java.
Java có một cộng đồng lớn và nhiều tài liệu sẵn có do nó tồn tại từ lâu và được sử dụng rộng rãi. Đa nền tảng NET Core (hiện tại là NET 5 và các phiên bản sau) cung cấp hỗ trợ đa nền tảng, cho phép viết ứng dụng chạy trên
Java luôn hỗ trợ đa nền tảng, vì vậy ứng dụng Java có thể chạy trên nhiều hệ điều hành khác nhau.
NỀN TẢNG NGÔN NGỮ C#
Kiểu dữ liệu
Kiểu Biểu diễn Kích thước
Dãy giá trị Giá trị mặc định bool Giá trị
1 bít True hoặc False False byte Kiểu unsigned integer
0 tới 255 0 char Kiểu Unicode character
U +0000 tới U +ffff ‘\0’ decimal Kiểu thập phân
-3.4 x 1038 tới + 3.4 x 1038 0.0F int Kiểu integer 4 byte
-128 tới 127 0 short Kiểu signed integer
-32,768 tới 32,767 0 uint Kiểu unsigned integer
0 tới 4,294,967,295 0 ulong Kiểu unsigned integer
Biến và hằng
Một biến của C# là tên gọi của một vùng nhớ bên trong máy tính dùng để lưu trữ giá trị mà chương trình của chúng ta có thể tương tác được Giữa biến và kiểu dữ liệu có một mối liên hệ mật thiết với nhau, một kiểu dữ liệu phải có một biến để lưu trữ nó.
Mỗi biến trong C# bao gồm 3 phần sau: tên biến kiểu dữ liệu, và giá trị của biến đó.
-Tên biến là sự biểu diễn tượng trưng của vùng nhớ trong đó thông tin được lưu trữ.
-Kiểu dữ liệu dùng để xác định kích thước và loại giá trị có thể được lưu trữ.
-Giá trị là dữ liệu thực tế được lưu trữ trên biến và có thể thay đổi được.
Cách khai báo biến trong C#: có 2 cách Tuy nhiên chúng ta nên sử dụng cách 2.
Cách 1: ;
Cách 2: = ;
Trong đó, quy tắc đặt tên biến: phải được tuân theo quy tắc định danh và đồng thời tuân thủ quy tắc camelCase.
-Quy tắc camelCase: tên bắt đầu từ chữ cái thường, nếu tên bao gồm nhiều từ: chữ cái đầu mỗi từ tiếp theo sẽ viết hoa Ví dụ: bigIntrger, tinhTong,
+ Có thể chứa các chữ cái a-z, A-Z, chữ số 0-9, dấu gạch chân _ và ký tự @. + Ký tự a-z, A-Z, và _ có thể có mặt ở mọi vị trí trong tên.
+ Ký tự đầu tiên không được phép sử dụng chữ số.
+ Ký tự @ chỉ được phép đứng đầu ký tự (nhưng không khuyến khích sử dụng).
+ Có sự phân biệt giữa ký tự hoa và ký tự thường.
Ngoài ra, trong C# còn có một cách khác để khai báo là sử dụng từ khóa var.
Trong cách khai báo này, tên kiểu được thay bằng từ khóa var Trình biên dịch C# khi gặp dòng lệnh này sẽ tự “suy đoán” ra kiểu của biến dựa vào giá trị gán cho nó Nghĩa là dòng lệnh trên được C# tự động hiểu thành: float i = 1,2;
Kết quả của của hai lệnh trên là như nhau.
Khi sử dụng từ khóa var phải tuân thủ quy tắc: Biến phải được khởi tạo lúc khai báo, nếu không trình biên dịch sẽ không có căn cứ nào để suy đoán cả
Hằng là một biến lưu trữ giá trị mà biến đó không thể thay đổi giá trị thêm một lần nữa, để lưu trữ lại các giá trị khoa học hay bất cứ giá trị nào không thể thay đổi. Để khai báo hằng chúng ta sử dụng từ khóa “const”, cú pháp như sau: const = ;
Ví dụ: const int mxN = ;15 const double pi = 3.14; const int a = 7, b = 8, c = 10; const string s = "Lap trinh";
Khi khai báo hằng bắt buột phải có giá trị khởi tạo.
Một hằng không thể thay đổi giá trị nên khi chúng ta cố gắng thay đổi giá trị của nó chương trình sẽ báo lỗi.
Những câu lệnh mà 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ị cũng gọi là biểu thức: var1 = 24;
Trong câu lệnh trên phép đánh giá hay định lượng chính là phép gán có giá trị 24 cho biến var1 Lưu ý là toán tử gán (‘=’) không phải là toán tử so sánh Do vậy khi sử dụng toán tử này thì biến bên trái sẽ nhận giá trị của phấn bên phải
Do var1 = 24 là một biểu thức được định giá trị là 24 nên biểu thức này có thể được xem như phần bên phải của một biểu thức gán khác: var2 = var1 = 24;
Lệnh này sẽ thực hiện từ bên phải sang khi đó biến var1 sẽ nhận được giá trị là
14 và tiếp sau đó thì var2 cũng được nhận giá trị là 24 Do vậy cả hai biến đều cùng nhận được một giá trị là 24 Có thể dùng lệnh trên để khởi tạo nhiều biến có cùng một giá trị như: a = b = c = d = 24;
CHƯƠNG TRÌNH CON
Khái niệm
Hàm hay thủ tục là một kiểu dữ liệu cho phép chúng ta thực thi một hay nhiều câu lệnh một cách riêng biệt bằng cách gọi đến và truyền tham số.
Các tiện ích của hàm
Là một module chương trình, giải quyết một công việc hoàn chỉnh, được dùng nhiều lần trong chương trình.
Tránh việc viết lại các đoạn trình giống nhau trong chương trình
Phân cấp (chia) chương trình theo tư tưởng: chia để trị => chương trình dễ hiểu, dễ quản lý, dễ bảo trì.
Các loại hàm trong C#
Các hàm thư viện (Library Functions): Là các hàm được khai báo trong namespace
Các hàm do người lập trình định nghĩa (User-defined functions): Là các hàm do lập trình viên định nghĩa. Định nghĩa hàm: Để định nghĩa hay tạo một hàm, ta có thể sử dụng cú pháp như sau:
[static] kiểu_trả_về Tên_hàm([danh_sách_tham_số]) { khai_báo_các_biến_của_hàm; //Nếu cần khối_lệnh;
- [static]: Nếu muốn hàm được gọi trực tiếp từ hàm static thì ta cần sử dụng từ khóa static này, nhưng nếu muốn gọi hàm thông qua một đối tượng thì không có từ khóa này.
- Kiểu_trả_về: là kiểu của dữ liệu mà ta muốn hàm trả về.
- Tên_hàm: do ta tự đặt nhưng không được trùng với bất kỳ từ khóa nào.
Trong C# thường đặt tên theo cách thức viết hoa ký tự đầu của từng từ, ví dụ như TinhTong, TinhBieuThuc,
- [danh_sách_tham_số]: dung để tiếp nhận dữ liệu cho hàm Nếu hàm cần dữ liệu thì ta cần sử dụng danh_sách_tham_số để tiếp nhận, nhưng nếu hàm không cần dữ liệu để xử lí thì sẽ không có danh_sách_tham_số.
- [return giá_trị]: Lệnh này dùng để trả về giá trị cho hàm, nếu kiểu_trả_về của hàm không phải void thì lệnh này buộc phải có, ngược lại thì không có hoặc lệnh sẽ thành return; giá_trị có thể là một hằng, giá trị của biến, giá trị của biểu thức hoặc giá trị trả về từ một lời gọi hàm khác.
Một số lưu ý đối với hàm:
- Có thể gọi một hàm từ hàm khác nhưng không được định nghĩa hàm bên trong hàm (kể cả hàm main ()).
- Kiểu dữ liệu của giá_trị nên tương ứng kiểu (có thể nhỏ hơn nhưng không được lớn hơn) với kiểu_trả_về của hàm.
- Có thể định nghĩa hàm nằm trên hoặc nằm dưới hàm Main ().
- Mỗi hàm chỉ có thể trả về được duy nhất một giá_trị Trong trường hợp muốn trả về nhiều hơn một giá_trị thì có thể sử dụng phương pháp tham chiếu.
Gọi hàm có tham số
Sau khi định nghĩa hàm xong thì hàm không thể tự thực hiện thay vào đó ta cần phải gọi hàm.
Trong c# có 3 cách gọi hàm đó là gọi bằng giá trị (call by value), gọi bằng tham chiếu (call by Reference) và dùng tham số out.
Trong C#, gọi bằng giá trị tức là tham số truyền vào là bản sao của giá trị gốc, vì vậy dù cho bên trong thân hàm có thay đổi giá trị của tham số truyền vào thì sau khi kết thúc gọi hàm thì giá trị gốc vẫn không thay đổi.
C # cung cấp một từ khóa ref để truyền đối số dưới dạng tham chiếu Tức là tham số truyền vào bằng địa chỉ ô nhớ của biến gốc vì vậy bên trong thân hàm thay đổi giá trị tham số truyền vào thì giá trị gốc cũng thay đổi theo
Tham số out giống như kiểu tham chiếu, ngoại trừ việc nó không yêu cầu biến khởi tạo trước khi truyền.
Cần phân biệt ref và out như sau:
- Giá trị phải được khởi tạo trước
- Bên trong thân hàm có thể đọc vào thay đổi giá trị nó
- Giá trị không được khởi tạo trước và bên trong thân hàm không đọc được nó cho đến khi nó được gán giá trị
- Hàm phải gán giá trị cho biến out trước khi trả giá trị về
Một số ví dụ
5.1 Hàm không có tham số và không có kiểu trả về:
5.2 Hàm có tham số nhưng không có kiểu trả về:
5.3 Hàm có tham số và có kiểu trả về
Tong hai so 3 va 2 la: 5
MẢNG MỘT CHIỀU
Khái niệm mảng
Tập hợp các đối tượng có cùng kiểu dữ liệu.
Mỗi đối tượng trong mảng được gọi là một phần tử.
Các phần tử phân biệt với nhau bằng chỉ số phần tử Trong C# chỉ số phần tử là các số nguyên không âm và bắt đầu từ 0 1 2 3…
Đặc điểm của mảng
Các phần tử trong mảng dùng chung một tên và được truy xuất thông qua chỉ số phần tử.
Một mảng cần có giới hạn số phần tử mà mảng có thể chứa.
Phải cấp phát vùng nhớ mới có thể sử dụng mảng.
Vị trí ô nhớ của các phần tử trong mảng được cấp phát liền kề nhau.
Lợi ích khi sử dụng mảng
Gom nhóm các đối tượng có chung tính chất lại với nhau giúp code gọn gàng hơn. Để thao tác, dễ quản lý, nâng cấp sửa chữa Vì lúc này việc thay đổi số lượng sinh viên ta chỉ cần thay đổi số phần tử của mảng là được.
Dễ dàng áp dụng các cấu trúc lặp vào để xử lý dữ liệu.
Khai báo và khởi tạo mảng
Để sử dụng được mảng ta phải khởi tạo giá trị hoặc cấp phát vùng nhớ cho mảng.
Có 3 cách khai báo và khởi tạo sau:
Cách 1 Khai báo: và cấp phát vùng nhớ:
[] = new [];
Ví dụ: string[] Array = new string[3];
Cách 2 Khai báo cấp phát: , và khởi tạo giá trị cho mảng:
[] = new []{,
Ví dụ: string[] Nhom = new string[] { "Diem_My", "Mai_Trinh" };
Cách 3: Khai báo và khởi tạo giá trị cho mảng:
[] = { , , };
Một số thuộc tính và phương thức đặc trưng của mảng một chiều
Tên thuộc tính hoặc phương thức Ý nghĩa
Length Thuộc tính trả về số nguyên kiểu int là số phần tử tối đa của mảng.
LongLength Thuộc tính trả về số nguyên kiểu long là số phần tử tối đa của mảng.
Trả về số nguyên kiểu int là số phần tử trong chiều đã xác định Lưu ý chiều của mảng là các số nguyên và được đánh số từ 0 Cho nên đối với mảng 1 chiều thì số chiều là 0.
Tương tự GetLength nhưng trả về số nguyên kiểu long.
Sort() Phương thức thực hiện sắp xếp mảng theo một thứ tự.
Clear() Phương thức xóa hết dữ liệu trong mảng và đưa về giá trị mặc định của kiểu Lưu ý là chỉ xóa giá trị, vùng nhớ vẫn còn đó và có thể tiếp tục sử dụng mà không cần cấp phát.
Copy() Thực hiện copy giá trị của mảng ra một vùng nhớ mới
(phép gán thông thường thì 2 đối tượng sẽ dùng chung vùng nhớ rất nguy hiểm vì đối tượng này thay đổi dẫn đến đối tượng kia cũng thay đổi).
Reverse() Phương thức thực hiện đảo ngược thứ tự của mảng một chiều.
Cách duyệt mảng một chiều
Để truy xuất đến các phần tử của mảng cần thông qua chỉ số phần tử mà chỉ số phần tử là các số nguyên tăng dần Từ đó, ta có thể tận dụng vòng lặp để tăng giá trị
1 biến lên rồi xem biến đó như là chỉ số phần tử của mảng.
Ví dụ: int[] Nhom = new int[3];
//Sử dụng thuộc tính Length để khi thay đổi số phần tử thì chỉ cần thay đổi ở khai báo. for (int i = 0; i < Nhom.Length; i++)
ĐOẠN CHƯƠNG TRÌNH VỀ MẢNG MỘT CHIỀU
Kết quả: Khi ta nhập 5 phần tử với các giá trị lần lượt là: 2 , 4 , 1 , 5 , 8 và chọn lần lượt các chức năng, ta sẽ có kết quả như sau:
Nhap so phan tu cua mang: 5 a[0]=2 a[1]=4 a[2]=1 a[3]=5 a[4]=8
Cac gia tri trong mang: 2 4 1 5 8
3 Sap xep theo thu tu tang dan.
===========================================Nhap lua chon cua ban: 1
Tong gia tri cua mang la: 20
Nhap lua chon cua ban: 2
Nhap gia tri can tim trong mang: 5
Tim thay gia tri can tim o phan tu a[3]
Nhap lua chon cua ban: 3
Cac gia tri trong mang: 1 2 4 5 8
Nhap lua chon cua ban: 4
Nhap vi tri can xoa trong mang: 2 Cac gia tri trong mang: 1 2 5 8
Nhap lua chon cua ban: 5
Nhap vi tri muon them: 2
Nhap gia tri can them: 4
Cac gia tri trong mang: 1 2 4 5 8
Nhap lua chon cua ban: 0
Cam on va hen gap lai ban.