Description this lesson

Các nội dung chính Access modifier (phạm vi truy cập), trạng thái Static, hàm For, If else, String, List, ArrayList...

Cấu trúc điều khiển if - else trong C#

Bài vừa rồi chúng ta đã tìm hiểu về các toán tử trong C# cũng như làm một số bài tập để cũng cố kiến thức. Các bài tập từ đầu series đến giờ ngoài những câu ghi chú thì tất cả mọi dòng lệnh đều được biên dịch và chạy. Vậy khi câu lệnh hoặc khối lệnh nào đó bắt buộc phải có điều kiện mới được biên dịch và chạy thì chúng ta làm như thế nào ? Hôm nay chúng ta sẽ tìm hiểu cấu trúc điều khiển if - else 

Vậy cấu trúc điều khiển if - else là gì ? Nó hoạt động như thế nào ? Nào start thôi =)

Câu lệnh if - else

Câu lệnh phân nhánh if - else dựa trên một điều kiện. Điều kiện là một biểu thức sẽ được kiểm tra giá trị ngay khi bắt đầu gặp câu lệnh đó. Nếu điều kiện được kiểm tra là đúng, thì câu lệnh hay một khối các câu lệnh bên trong thân của câu lệnh if được thực hiện.

Câu lệnh if

Câu lệnh if cho phép ta thực hiện một lệnh hoặc khối lệnh nếu điều kiện đó đúng:

Cú pháp:

if (biểu thức điều kiện)
{
    
}

Trong đó biểu thức điều kiện là một biểu thức logic trả về kết quả true hoặc fale.

Ví dụ: Tìm số lớn hơn trong hai số nhập từ bàn phím.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace anhtester.com
{
    class anhtester
    {
        static void Main(string[] args)
        {
            int num1, num2, max;
            Console.Write("Nhap vao so thu nhat: ");
            num1 = Convert.ToInt32(Console.ReadLine());
 
            Console.Write("Nhap vao so thu hai: ");
            num2 = Convert.ToInt32(Console.ReadLine());
            max = num1;
 
            if (num1 < num2)
            {
                max = num2;
                Console.WriteLine("so lon nhat trong hai so la {0}", max);
            }
 
            Console.WriteLine("\nfreetuts.net chuc ban hoc tot");
            Console.ReadKey();
 
        }
    }
}

 

Kết quả sau khi biên dịch đoạn code trên:

if else 1 PNG


Câu lệnh if - else

Trong câu điều kiện if - else thì else là phần tùy chọn. Các câu lệnh bên trong thân của else chỉ được thực hiện khi điều kiện của if là sai. Do vậy khi câu lệnh đầy đủ if - else được dùng thì chỉ có một trong hai if hoặc else được thực hiện. Ta có cú pháp câu điều kiện if - else sau:

Cú pháp
if (biểu thức điều kiện)

[else
]


Nếu các câu lệnh trong thân của if hay else mà lớn hơn một lệnh thì các lệnh này phải được bao trong một khối lệnh, tức là phải nằm trong dấu khối { }:

if (biểu thức điều kiện)
{
    
    
    ....
}
else
{
    
    
    ...
}


Ta sẽ quay lại ví dụ trên nhưng sẽ không khai báo biến max nhé.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace anhtester.com
{
    class anhtester
    {
        static void Main(string[] args)
        {
            int num1, num2;
            Console.Write("Nhap vao so thu nhat: ");
            num1 = Convert.ToInt32(Console.ReadLine());
            Console.Write("Nhap vao so thu hai: ");
            num2 = Convert.ToInt32(Console.ReadLine());
            if (num1 < num2)
            Console.WriteLine("so lon nhat trong hai so la: {0}",num2);
            else
            Console.WriteLine("so lon nhat trong hai so la: {0}",num1);
            Console.WriteLine("\nfreetuts.net chuc ban hoc tot");
            Console.ReadKey();
        }
    }
}

và kết quả cũng sẽ không thay đổi:

if else 1 PNG


Câu lệnh if - else lồng nhau

Các lệnh điều kiện if có thể lồng nhau để phục vụ cho việc xử lý các câu điều kiện phức tạp. Việc này cũng thường xuyên gặp khi lập trình. Giả sử chúng ta cần viết một chương trình có yêu cầu kiểm tra xem một sinh viên có phải là sinh viên xuất sắc không dựa trên một số thông tin như sau:

  • Sinh viên phải đạt điểm trung bình môn xuất sắc (trên 9.0)
  • Sinh viên phải đạt điểm rèn luyện xuất sắc (trên 90đ)
  • Điểm môn học thấp nhất là 6.0

Dựa trên các yêu cầu trên ta có thể dùng các lệnh if lồng nhau để thực hiện. Ví dụ sau sẽ minh họa cho việc thực hiện các yêu cầu trên.

Ví dụ:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace anhtester.com
{
    class anhtester
    {
        static void Main(string[] args)
        {
            float dhoctap,dmin;
            int drenluyen;
            Console.Write("\nNhap vao diem hoc tap: ");
            dhoctap = Convert.ToSingle(Console.ReadLine());
            Console.Write("\nNhap vao diem thap nhat: ");
            dmin = Convert.ToSingle(Console.ReadLine());
            Console.Write("\nNhap vao diem ren luyen: ");
            drenluyen = Convert.ToInt32(Console.ReadLine());
 
            if (dhoctap > 9.0)
            {
                if (drenluyen > 90)
                {
                    if (dmin > 6.0)
                        Console.WriteLine("\nchuc mung ban da duoc sinh vien xuat sac !");
                    else
                        Console.WriteLine("\nDiem thap nhat cua ban phai tren 6.0");
                }
                else
                    Console.WriteLine("\nDiem ren luyen cua ban phai tren 90");
            }
            else
                Console.WriteLine("\nDiem hoc tap cua ban phai tren 9.0");
 
            Console.WriteLine("\nfreetuts.net chuc ban hoc tot");
            Console.ReadKey();
}
}
}

Biên dịch chương trình và cho kết quả như sau:

if else 2 PNG

Theo trình tự kiểm tra thì câu lệnh if đầu tiên được thực hiện, biểu thức điều kiện đúng do điểm học tập trên 9.0. Khi đó khối lệnh trong if sẽ được tiếp tục thực thi. Ở khối này lại xuất hiện một lệnh if khác để kiểm tra xem điểm rèn luyện của bạn có trên 90 điểm không. Và điều này thỏa khiến khối lệnh trong if lại được tiếp tục thực thi. Kết quả trả lại là "chuc mung ban da duoc sinh vien xuat sac !" vì câu lệnh if thứ ba cũng thỏa nốt.


 

Vòng lặp for trong C#

Hôm nay chúng ta sẽ cùng tìm hiểu một cấu trúc mới trong lập trình, đó là vòng lặp trong C#. Vòng lặp giúp chúng ta giảm thiểu công sức khi chúng ta viết code cho những vấn đề thường xuyên lặp lại, ví dụ như muốn tính tổng từ 1 đến 10 chẳng hạn. Nếu không có vòng lặp thì chúng ta sẽ viết như nào nhỉ ? Tong = 1+2+3+4+5+...+10. Vậy nếu ta muốn tính tổng từ 1 đến 20.000 thì sao ? Rõ ràng là ta không thể ngồi bấm từ 1 đến 20.000 được. Vì thế vòng lặp ra đời để giải quyết những vấn đề tương tự.

Trong C# có nhiều cấu trúc lặp:

  • Cấu trúc vòng lặp for.
  • Cấu trúc vòng lặp while.
  • Cấu trúc vòng lặp do - while.
  • Cấu trúc vòng lặp foreach.
  • Và có một vòng lặp đặt biệt đó là đệ quy.
  • Ngoài ra chúng ta có thể tạo ra vòng lặp không chính quy bằng cách sử dụng lệnh goto.

Hôm nay chúng ta sẽ cùng tìm hiểu cấu trúc vòng lặp for và những bài tập cơ bản áp dụng vòng lặp này nhé !!!

Cấu trúc vòng lặp for

Sử dụng vòng lặp for cho chúng ta biết trước số lần lặp của lệnh hoặc khối lệnh. Ta hoàn toàn xác định được số lần lặp lại của lệnh hay đoạn lệnh trong phần thân của vòng lặp. Vì thế đây là một vòng lặp được sử dụng khá linh hoạt và thường xuyên trong các ngôn ngữ lập trình nói chung và C# nói riêng.

Cú pháp sử dụng vòng lặp for như sau:

for ([ phần khởi tạo] ; [biểu thức điều kiện]; [bước lặp])
{
   
}

 

Trong đó:

  • Phần khởi tạo là chứa đoạn mã khởi tạo giá trị, đoạn lệnh này sẽ được chạy đầu tiên và chỉ được gọi một lần duy nhất trong vòng đời của vòng lặp.
  • Biểu thức điều kiện là biểu thức logic trả về kết quả true hoặc fasle, nếu chúng ta bỏ trống thì kết quả của biểu thức điều kiện được hiểu là true.
  • Bước lặp là bước nhảy của biến khởi tạo sau mỗi lần lặp.

Lưu ý: 

  • Trong vòng lặp for có thể thiếu sự góp mặt của các biểu thức, tuy nhiên dấu ; bắt buộc phải có.
  • Mỗi phần khởi tạo, biểu thức điều kiện hoặc bước nhảy có thể có nhiều hơn một biểu thức. Vậy các biểu thức phải đặt cách nhau bởi dấu và được thực hiện từ trái sang phải.

Một ví dụ nhỏ dùng vòng lặp for:

Hãy tính tổng từ 1 đến 5 bằng cách dùng vòng lặp.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


    namespace anhtester.com
    {
        class anhtester
        {
            static void Main(string[] args)
            {
                int tong = 0;
                for (int i = 1 ;i<=5;i++ ){
                   tong += i;
                }
            Console.WriteLine("\n\ntong cac so tu 1 den 5 la {0}", tong);
            Console.ReadKey();
         }
    }
}

 

Biên dịch và chạy chương trình sẽ cho kết quả:

for01 JPG

Giải thích:

  • khởi tạo biến i = 1, biến i <=5 nên thực hiện cộng tong = tong +i;
  • Tăng i lên 1 đơn vị và kiểm tra. lúc này i = 2 vài<=5nên vẫn thực hiện tong = tong + i;
  • Tương tự tăng i thêm 1 đơn vị giá trị của i lần lượt là 3,4,5 và thực hiện tong = tong +i;
  • Khi tăng i lên đến 6 thì ta thấy điều kiện không thỏa (i<=5) cho nên thoát khỏi vòng lặp
  • Hiển thị biến tong ra màng hình với câu lệnh Console.WriteLine();


Ví dụ 2

Cho bài toán: in dãy số từ 0 đến 50 ra màn hình console.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
    namespace anhtester.com
    {
        class anhtester
        {
            static void Main(string[] args)
            {
                for (int i = 0; i <= 50; i++)
                Console.Write(i+" ");
                Console.ReadKey();
            }
        }
    }

 

Biên dịch chương trình sẽ cho kết quả:

for02 JPG

Vì nó hoạt động khá đơn giản nên mình sẽ không giải thích nhé.


Ở ví dụ sau đây mình sẽ cho các bạn sử dụng hai vòng lặp for lồng với nhau. Hãy xem có gì thú vị nhé:

In ra màn hình ma trận gồm 9 dòng và mỗi dòng bắt đầu từ 0 đến 9:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace anhtester.com
{
    class anhtester
    {
        static void Main(string[] args)
        {
             for (int i = 0; i <= 9; i++)
             {
                  for (int j = 0; j <= 9; j++)
                  Console.Write(j+"  ");
                  Console.WriteLine("\n");
            }
        Console.ReadKey();
        }
    }
}

 

Biên dịch chương trình ta được:

for03 JPG

Giải thích xíu nè:

  • Bước 1: Vòng for bên ngoài khởi tạo biếni = 0 và i<=9 nên sẽ sang bước 2.
  • Bước 2: Vòng for thứ hai khởi tạo biếnj = 0 và in ra giá trị của biến j.
  • Bước 3: Tăng giá trị của biến j lên 2,3,4,5,6,7,8,9 và in giá trị của biến j ra màn hình.
  • Bước 4: Khi biến j tăng đến 10 thì thoát vòng for và thực hiện dòng lệnh xuống dòng.
  • Bước 5: Tăng giá trị của i lên 2 và tiếp tục thực hiện sang bước 2.
  • Đến khi biếni = 10 thì kết thúc và thoát khỏi cả hai vòng lặp.


Hàm trong c#

Hàm (function) trong C# dùng để thực thi một khối lệnh nào đó.

  Tên hàm ()  
{  
      // Thân hàm
      // Giá trị trả về;
}

Trong đó:

  • Tên hàm: Nó là một tên duy nhất được sử dụng để gọi hàm. Ví dụ: getValue(), Add(int a, int b)...
  • Kiểu trả về: Nó được sử dụng để chỉ rõ kiểu dữ liệu của hàm được trả về.
  • Thân hàm: Nó là khối lệnh sẽ được thực thi khi hàm được gọi.
  • Quyền truy cập: Nó được sử dụng để xác định khả năng truy cập hàm trong ứng dụng.
  • Tham số: Nó là một danh sách các tham số mà chúng ta truyền vào khi gọi hàm
Lưu ý: Kiểu trả về, quyền truy cập và tham số là không bắt buộcphải có khi định nghĩa hàm

Ví dụ

Hàm không có tham số và kiểu trả về

using System;
 
namespace ConsoleApp1
{
    class Program
    {
        void print()
        {
            Console.WriteLine("-----muc dich ham chi in chu ra man hinh khong can tham so va kieu tra ve-----");
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Goi ham print:");
            Program p = new Program();
            p.print();
            Console.ReadKey();
        }
    }
}

Và kết quả sau khi thực thi đoạn code kết:

csharp function ex1 PNG


Hàm có tham số nhưng không có kiểu trả về

using System;
 
namespace ConsoleApp2
{
    class Program
    {
        void print(string name)
        {
            Console.WriteLine("---------------Xin chao: " + name + "---------------------");
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Goi ham print:");
            Program p = new Program();
            p.print("Viet Tut");
            Console.ReadKey();
        }
    }
}

Và kết quả sau khi thực thi đoạn code trên:

csharp function ex2 PNG

 

Hàm có tham số và có kiểu trả về

using System;
 
namespace ConsoleApp3
{
    class Program
    {
        string print(string name)
        {
            return "-------------Xin chao: " + name + "--------------";
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Goi ham print:");
            Program p = new Program();
            string name = p.print("Viet Tut");
            Console.WriteLine(name);
            Console.ReadKey();
        }
    }
}

Và kết quả sau khi thực thi đoạn code trên:

csharp function ex3 PNG

Như vậy là chúng ta đã cùng tìm hiểu về hàm là gì, ví dụ một số loại hàm. Phần tiếp theo mình cùng tìm hiểu một phần quan trong đó là cách gọi hàm có tham số.


Cách gọi hàm có tham số

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.

Gọi bằng giá trị (call by value)

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.

Trong ví dụ sau, chúng ta truyền tham số giá trị khi gọi hàm:

using System;
 
namespace AnhTester
{
    class Program
    {
        public void Print(int val)
        {
            val += val;  
            Console.WriteLine("Gia tri ben trong ham: " + val);  
        }
 
        static void Main(string[] args)
        {
            int val = 100;
            Program p = new Program();
            Console.WriteLine("Gia tri truoc khi goi ham: " + val);
            p.Print(val);            
            Console.WriteLine("Gia tri sau khi goi ham: " + val);
            Console.ReadKey();
        }
    }
}

Và kết quả sau khi thực thi đoạn code trên:

csharp function ex4 PNG

 



String trong C#

Trong C #, chuỗi là một đối tượng của lớp System.String đại diện cho chuỗi các ký tự. Chúng ta có thể thực hiện nhiều thao tác trên các chuỗi như nối, so sánh, lấy chuỗi con, tìm kiếm, cắt, thay thế, v.v.

string với String

Trong C #, string là từ khóa là bí danh cho lớp System.String. Đó là lý do tại sao string và String là tương đương. Chúng ta được tự do sử dụng bất kỳ quy ước đặt tên.

string s1 = "hello";//Tạo chuỗi sử dụng từ khóa string  
String s2 = "welcome";//Tạo chuỗi sử dụng lớp String

Ví dụ về String:

using System;  
public class StringExample  
{  
    public static void Main(string[] args)  
    {  
        string s1 = "hello";  
  
        char[] ch = { 'c', 's', 'h', 'a', 'r', 'p' };  
        string s2 = new string(ch);  
         
        Console.WriteLine(s1);  
        Console.WriteLine(s2);  
    }  
}  

Kết quả:

hello 
csharp

 

 

Phương thức của lớp String trong C#

Lớp String có một số phương thức mà hữu ích cho bạn trong khi làm việc với các đối tượng String trong C#. Bảng dưới đây liệt kê các phương thức được sử dụng phổ biến nhất:

public static int Compare(string strA, string strB): So sánh hai đối tượng String cụ thể và trả về một integer mà chỉ vị trí có liên quan của chúng trong thứ tự sắp xếp.

public static int Compare(string strA, string strB, bool ignoreCase): So sánh hai đối tượng String cụ thể và trả về một integer mà chỉ vị trí có liên quan của chúng trong thứ tự sắp xếp. Tuy nhiên, nó bỏ qua sự phân biệt kiểu nếu tham số Boolean là true.

public static string Concat(string str0, string str1): Nối chuỗi hai đối tượng String.

public static string Concat(string str0, string str1, string str2): Nối chuỗi ba đối tượng String.

public static string Concat(string str0, string str1, string str2, string str3): Nối chuỗi bốn đối tượng String.

public bool Contains(string value): Trả về một giá trị chỉ dẫn có hay không đối tượng String đã cho xuất hiện bên trong chuỗi này.

public static string Copy(string str): Tạo một đối tượng String mới với cùng giá trị như chuỗi đã cho.

public void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count): Sao chép một số ký tự cụ thể từ một vị trí đã cho của đối tượng String tới một vị trí đã xác định trong một mảng các ký tự Unicode.

public bool EndsWith(string value): Xác định có hay không phần kết thúc của đối tượng String là so khớp với chuỗi đã cho.

public bool Equals(string value): Xác định có hay không đối tượng String hiện tại và đối tượng String đã cho là có cùng giá trị.

public static bool Equals(string a, string b): Xác định có hay không hai đối tượng String đã cho có cùng giá trị.

public static string Format(string format, Object arg0): Thay thế một hoặc nhiều mục định dạng trong một chuỗi đã cho với biểu diễn chuỗi của một đối tượng cụ thể.

public int IndexOf(char value): Trả về chỉ mục (dựa trên cơ sở 0) cho sự xuất hiện đầu tiên của ký tự Unicode đã cho trong chuỗi hiện tại.

public int IndexOf(string value): Trả về chỉ mục (dựa trên cơ sở 0) cho sự xuất hiện đầu tiên của chuỗi đã cho trong Instance (sự thể hiện) này.

public int IndexOf(char value, int startIndex): Trả về chỉ mục (dựa trên cơ sở 0) cho sự xuất hiện đầu tiên của ký tự Unicode đã cho trong chuỗi này, bắt đầu tìm kiếm tại vị trí của ký tự đã cho.

public int IndexOf(string value, int startIndex): Trả về chỉ mục (dựa trên cơ sở 0) cho sự xuất hiện đầu tiên của chuỗi đã cho trong Instance (sự thể hiện) này, bắt đầu tìm kiếm tại vị trí của ký tự đã cho.

public int IndexOfAny(char[] anyOf): Trả về chỉ mục (dựa trên cơ sở 0) cho sự xuất hiện đầu tiên của Instance (sự thể hiện) này của bất kỳ ký tự nào trong một mảng ký tự Unicode đã xác định.

public int IndexOfAny(char[] anyOf, int startIndex): Trả về chỉ mục (dựa trên cơ sở 0) cho sự xuất hiện đầu tiên của Instance (sự thể hiện) này của bất kỳ ký tự nào trong một mảng ký tự Unicode đã xác định, bắt đầu tìm kiếm tại vị trí của ký tự đã cho.

public string Insert(int startIndex, string value): Trả về một chuỗi mới trong đó một chuỗi đã cho được chèn tại một vị trí có chỉ mục đã xác định trong đối tượng String hiện tại.

public static bool IsNullOrEmpty(string value): Chỉ rằng có hay không chuỗi đã cho là null hoặc là một chuỗi Empty.

public static string Join(string separator, params string[] value): Nối chuỗi tất cả phần tử của một mảng chuỗi, bởi sử dụng Separator (bộ tách) đã cho giữa mỗi phần tử.

public static string Join(string separator, string[] value, int startIndex, int count): Nối chuỗi các phần tử đã xác định của một mảng chuỗi, bởi sử dụng Separator (bộ tách) đã cho giữa mỗi phần tử.

public static string Join(string separator, string[] value, int startIndex, int count): Nối chuỗi các phần tử đã xác định của một mảng chuỗi, bởi sử dụng Separator (bộ tách) đã cho giữa mỗi phần tử.

public int LastIndexOf(char value): Trả về chỉ mục (dựa trên cơ sở 0) cho sự xuất hiện cuối cùng của ký tự Unicode đã cho bên trong đối tượng String hiện tại.

public int LastIndexOf(string value): Trả về chỉ mục (dựa trên cơ sở 0) cho sự xuất hiện cuối cùng của một chuỗi đã cho bên trong đối tượng String hiện tại.

public string Remove(int startIndex): Gỡ bỏ tất cả ký tự trong Instance hiện tại, bắt đầu tại vị trí đã xác định và tiếp tục tới vị trí cuối cùng, và trả về chuỗi đó.

public string Remove(int startIndex, int count): Gỡ bỏ số ký tự đã cho trong chuỗi hiện tại bắt đầu tại một vị trí đã xác định và trả về chuỗi đó.

public string Replace(char oldChar, char newChar): Thay thế tất cả ký tự Unicode đã cho xuất hiện trong đối tượng String hiện tại với ký tự Unicode đã xác định và trả về chuỗi mới.

public string Replace(string oldValue, string newValue): Thay thế tất cả chuỗi đã cho xuất hiện trong đối tượng String hiện tại với đối tượng string đã xác định và trả về chuỗi mới.

public string[] Split(params char[] separator): Trả về một mảng chuỗi mà chứa các chuỗi phụ trong đối tượng String hiện tại, được giới hạn bởi các phần tử của một mảng ký tự Unicode đã cho.

public string[] Split(char[] separator, int count): Trả về một mảng chuỗi mà chứa các chuỗi phụ trong đối tượng String hiện tại, được giới hạn bởi các phần tử của một mảng ký tự Unicode đã cho. Tham số int xác định số chuỗi phụ tối đa để trả về.

public bool StartsWith(string value): Xác định có hay không phần bắt đầu của instance của chuỗi này so khớp với chuỗi đã cho.

public char[] ToCharArray(): Trả về một mảng ký tự Unicode với tất cả ký tự trong đối tượng String hiện tại.

public char[] ToCharArray(int startIndex, int length): Trả về một mảng ký tự Unicode với tất cả ký tự trong đối tượng String hiện tại, bắt đầu từ chỉ mục đã xác định và tới độ dài đã cho.

public string ToLower(): Trả về một bản sao của chuỗi này đã được biến đổi thành chữ thường.

public string ToUpper(): Trả về một bản sao của chuỗi này đã được biến đổi thành chữ hoa.

public string Trim(): Gỡ bỏ tất cả ký tự whitespace từ đối tượng String hiện tại.

Bạn có thể vào thư viện MSDN để lấy danh sách đầy đủ các phương thức và constructor của lớp String.


Ví dụ vễ chuỗi trong C#

Ví dụ sau minh họa một số phương thức trên:

So sánh chuỗi trong C#

using System;
namespace StringApplication
{
   class StringProg
   {
      static void Main(string[] args)
      {
         string str1 = "This is test";
         string str2 = "This is text";
 
         if (String.Compare(str1, str2) == 0)
         {
            Console.WriteLine(str1 + " and " + str2 +  " la 2 chuoi giong nhau.");
         }
         else
         {
            Console.WriteLine(str1 + " and " + str2 + " la 2 chuoi khong giong nhau.");
         }
         Console.ReadKey() ;
      }
   }
}

Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta nhìn kết quả một cách rõ ràng hơn.

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

This is test and This is text la 2 chuoi khong giong nhau.

 


Nối chuỗi  trong C#

using System;
namespace StringApplication
{
   class StringProg
   {
      static void Main(string[] args)
      {
         string[] starray = new string[]{"Down the way nights are dark",
         "And the sun shines daily on the mountain top",
         "I took a trip on a sailing ship",
         "And when I reached Jamaica",
         "I made a stop"};
         string str = String.Join("\n", starray);
         Console.WriteLine(str);

         Console.ReadKey();
      }
   }
}

 

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

Down the way nights are dark
And the sun shines daily on the mountain top
I took a trip on a sailing ship
And when I reached Jamaica
I made a stop


Tìm kiếm chuỗi  trong C#

using System;
namespace StringApplication
{
   class StringProg
   {
      static void Main(string[] args)
      {
         string str = "This is test";
         if (str.Contains("test"))
         {
            Console.WriteLine("Tu \"test\" duoc tim thay trong chuoi.");
         }
         Console.ReadKey() ;
      }
   }
}

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

	
Tu "test" duoc tim thay trong chuoi "This is test".

 

 

Cắt chuỗi trong C#

using System;
namespace StringApplication
{
   class StringProg
   {
      static void Main(string[] args)
      {
         string str = "Toi qua toi mo thay con ma";
         Console.WriteLine(str);
         string substr = str.Substring(20);
         Console.WriteLine(substr);

         Console.ReadKey();
      }
   }
}

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

con ma​




ArrayList trong C#

ArrayList trong C# biểu diễn một tập hợp được sắp xếp của một đối tượng mà có thể được lập chỉ mục cho từng item riêng rẽ. Về cơ bản, nó là một sự thay thế cho một mảng. Tuy nhiên, không giống như trong mảng, bạn có thể thêm và gỡ bỏ các item từ một list tại một vị trí được chỉ định bằng cách sử dụng một chỉ mục và mảng tự động thay đổi kích thước. Nó cũng cho phép cấp phát bộ nhớ động, thêm, tìm kiếm và sắp xếp các item trong một list.

Phương thức và Thuộc tính của lớp ArrayList trong C#:

Dưới đây là các thuộc tính được sử dụng phổ biến của lớp ArrayList trong C#:

Thuộc tính Mô tả
Capacity Lấy hoặc thiết lập số phần tử mà ArrayList có thể chứa.
Count Lấy số phần tử thực sự được chứa trong ArrayList.
IsFixedSize Lấy một giá trị chỉ rằng có hay không ArrayList là có một kích cỡ cố định.
IsReadOnly Lấy một giá trị chỉ rằng có hay không ArrayList là read-only.
Item Lấy hoặc thiết lập phần tử tại chỉ mục đã xác định.

Dưới đây là các phương thức được sử dụng phổ biến của lớp ArrayList trong C#:

  • public virtual int Add(object value);: Thêm một đối tượng vào phần cuối của ArrayList.
  • public virtual void AddRange(ICollection c);: Thêm các phần tử của một ICollection vào phần cuối của ArrayList.
  • public virtual void Clear();: Gỡ bỏ các phần tử từ ArrayList đó.
  • public virtual bool Contains(object item);: Xác định có hay không một phần tử là nằm trong ArrayList.
  • public virtual ArrayList GetRange(int index, int count);: Trả về một ArrayList mà biểu diễn một tập con của các phần tử trong ArrayList nguồn.
  • public virtual int IndexOf(object);: Trả về chỉ mục (dựa trên cơ sở 0) của lần xuất hiện đầu tiên của một giá trị trong ArrayList hoặc một phần của nó.
  • public virtual void Insert(int index, object value);: Chèn một phần tử vào ArrayList tại chỉ mục đã xác định.
  • public virtual void InsertRange(int index, ICollection c);: Chèn một phần tử của một collection vào ArrayList tại chỉ mục đã xác định.
  • public virtual void Remove(object obj);: Gỡ bỏ lần xuất hiện đầu tiên của một đối tượng đã xác định tại chỉ mục đã xác định.
  • public virtual void RemoveAt(int index);: Gỡ bỏ phần tử tại chỉ mục đã xác định của ArrayList.
  • public virtual void RemoveRange(int index, int count);: Gỡ bỏ một dãy phần tử từ ArrayList.
  • public virtual void Reverse();: Đảo ngược thứ tự phần tử trong ArrayList.
  • public virtual void SetRange(int index, ICollection c);: Sao chép các phần tử của một collection qua một dãy các phần tử trong ArrayList.
  • public virtual void Sort();: Sắp xếp các phần tử trong ArrayList.
  • public virtual void TrimToSize();: Thiết lập capacity tới số phần tử thực sự trong ArrayList.

 

Ví dụ về ArrayList

Dưới đây là ví dụ minh họa các thuộc tính và phương thức của lớp ArrayList trong C#:

using System;
using System.Collections;
 
namespace CollectionApplication
{
  public class Program
   {
      public static void Main(string[] args)
      {
         ArrayList al = new ArrayList();  //Khai báo một ArrayList
         
         Console.WriteLine("Thêm một số phần tử:");
         al.Add(45);
         al.Add(78);
         al.Add(33);
         al.Add(56);
         al.Add(12);
         al.Add(23);
         al.Add(9);
         
         Console.WriteLine("Suc chua: {0} ", al.Capacity);
         Console.WriteLine("So phan tu: {0}", al.Count);
         
         Console.Write("Noi dung: ");
         foreach (int i in al)
         {
            Console.Write(i + " ");
         }
         
         Console.WriteLine();
         Console.Write("Sap xep noi dung: ");
         al.Sort();
         foreach (int i in al)
         {
            Console.Write(i + " ");
         }
       
      }
   }
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra các kết quả như sau:

Nhập một số phần tử: 
Suc chua: 8
So phan tu: 7
Noi dung: 45 78 33 56 12 23 9
Sap xep noi dung: 9 12 23 33 45 56 78​





Các loại phạm vi truy cập trong C#

Trong C# có 5 loại phạm vi truy cập:

Phạm vi truy cập
Ý nghĩa

public
Thành phần mang thuộc tính này có thể được truy cập ở bất kỳ vị trí nào.
Không hạn chế khả năng truy cập.
private
Nghĩa là thành phần riêng, chỉ nội bộ bên trong lớp chứa nó mới có quyền truy cập.
protected
Tương tự như private, ngoài ra thì có thể truy cập từ lớp dẫn xuất lớp chứa nó. (Tính kế thừa)
internal
Chỉ được truy cập trong cùng một Assembly (cùng project). Thuộc tính này thường được dùng cho class.
protected internal
Tương tự như internal, ngoài ra thì có thể truy cập từ lớp dẫn xuất lớp chứa nó. (Tính kế thừa)

Lưu ý:
- Nếu khai báo lớp mà không chỉ ra phạm vi cụ thể thì phạm vi mặc định là internal.
- Nếu khai báo thành phần bên trong lớp mà không chỉ ra phạm vi cụ thể thì phạm vị mặc định là private.
Quy định phạm vi truy cập là thể hiện tính đóng gói trong lập trình hướng đối tượng. Tùy từng thành phần mà chúng ta quy định phạm vi truy cập cho chúng. Có những thành phần mà có thể cho mọi người đều truy cập được, có những thành phần sẽ phải hạn chế người truy cập. Thậm chí còn phải che giấu đi thông tin, chi tiết cài đặt.

1. Sử dụng từ khóa public

public access modifier là mạnh mẽ nhất và có thể truy cập ở mọi nơi. Nó có phạm vi truy cập rộng nhất so với các modifier khác.

using System;  
namespace AnhTesterModifier
{  
    class PublicTest  
    {  
        public string name = "Shantosh Kumar";  
        public void Msg(string msg)  
        {  
            Console.WriteLine("Hello " + msg);  
        }  
    }  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            PublicTest publicTest = new PublicTest();  
            // Accessing public variable  
            Console.WriteLine("Hello " + publicTest.name);  
            // Accessing public function  
            publicTest.Msg("Peter Decosta");  
        }  
    }  
}  

 Kết quả:

Hello Shantosh Kumar
Hello Peter Decosta​

 

2. Sử dụng từ khóa truy cập private

private access modifier chỉ cho phép truy cập trong nội bộ một class.

Ví dụ 1:

using System;  
namespace AnhTesterModifier
{  
    class PrivateTest  
    {  
        private string name = "Shantosh Kumar";  
        private void Msg(string msg)  
        {  
            Console.WriteLine("Hello " + msg);  
        }  
    }  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            PrivateTest privateTest = new PrivateTest();  
            // Accessing private variable  
            Console.WriteLine("Hello " + privateTest.name);  
            // Accessing private function  
            privateTest.Msg("Peter Decosta");  
        }  
    }  
}  

Kết quả:

Compile time error
'PrivateTest.name' is inaccessible due to its protection level.

 

Ví dụ 2:

using System;  
namespace AnhTesterModifier
{  
    class Program  
    {  
        private string name = "Shantosh Kumar";  
        private void Msg(string msg)  
        {  
            Console.WriteLine("Hello " + msg);  
        }  
        static void Main(string[] args)  
        {  
            Program program = new Program();  
            // Accessing private variable  
            Console.WriteLine("Hello " + program.name);  
            // Accessing private function  
            program.Msg("Peter Decosta");  
        }  
    }  
}  

Kết quả:

Hello Shantosh Kumar
Hello Peter Decosta

3. Sử dụng từ khóa Protected

protected access modifier có thể truy cập bên trong package, hoặc bên ngoài package nhưng phải thông qua tính kế thừa.

protected access modifier chỉ áp dụng cho fieldmethod và constructor. Nó không thể áp dụng cho class (class, interface, ..).

Ví dụ 1:

using System;  
namespace AnhTesterModifier
{  
    class ProtectedTest  
    {  
        protected string name = "Shashikant";  
        protected void Msg(string msg)  
        {  
            Console.WriteLine("Hello " + msg);  
        }  
    }  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            ProtectedTest protectedTest = new ProtectedTest();  
            // Accessing protected variable  
            Console.WriteLine("Hello "+ protectedTest.name);  
            // Accessing protected function  
            protectedTest.Msg("Swami Ayyer");  
        }  
    }  
}

 Kết quả:

Compile time error
'ProtectedTest.name' is inaccessible due to its protection level.

Ví dụ 2

Trong ví dụ này chúng ta  đang truy cập các thành viên được bảo vệ trong lớp con bằng cách thừa kế.

using System;  
namespace AnhTesterModifier
{  
    public class ProtectedTest  
    {  
        protected string name = "Shashikant";  
        protected void Msg(string msg)  
        {  
            Console.WriteLine("Hello " + msg);  
        }  
    }  
    class Program : ProtectedTest  
    {  
        static void Main(string[] args)  
        {  
            Program program = new Program();  
            // Accessing protected variable  
            Console.WriteLine("Hello " + program.name);  
            // Accessing protected function  
            program.Msg("Swami Ayyer");  
        }  
    }      
}  

Kết quả:

Hello Shashikant
Hello Swami Ayyer

 


Đối tượng và lớp trong C#

C# là ngôn ngữ hướng đối tượng, chương trình được thiết kế bằng các đối tượng và lớp trong C #.

1. Đối tượng trong C#

Trong C#, đối tượng là một thực thể trong thế giới thực, ví dụ: ghế, xe hơi, bút, điện thoại di động, máy tính xách tay, v.v.

Nói cách khác, đối tượng là một thực thể có trạng thái và hành vi. Ở đây, trạng thái có nghĩa là dữ liệu và hành vi có nghĩa là chức năng.

Đối tượng là một thực thể được tạo ra trong thời gian chạy.

Đối tượng là một thể hiện của một lớp. Tất cả các thành viên của lớp có thể được truy cập thông qua đối tượng.

hãy xem một ví dụ để tạo đối tượng bằng từ khóa new.

Student s1 = new Student();//Đang tạo một đối tượng 

Trong ví dụ này, Student là đối tượng và s1 là biến đề truy cập các thuộc tính và phương thức của lớp Student. Từ khóa new cung cấp  bộ nhớ trong thời gian chạy.

 

2. Lớp trong C#

Trong C #, lớp là một nhóm các đối tượng giống nhau. Nó là một mẫu mà từ đó các đối tượng được tạo ra. Nó chứa các trường, phương thức v.v.
Trong C#, tất cả các lớp được dẫn xuất từ lớp cơ sở System.Object. Mỗi lớp thường được định nghĩa trong một file .cs và file này được thêm vào project. Ví dụ sau đây minh hoạ việc xây dựng một class. Trong class này chỉ có một thuộc tính là name và một phương thức là Speak(). Cũng giống như các ngôn ngữ C++ và Java, C# cung cấp con trỏ this dùng để tham chiếu đến một thể hiện (instance) của class đang xét.

Chúng ta hãy xem một ví dụ về lớp C# chỉ có hai trường.

public class Student  
 {  
     int id;//trường hoạc thành viên dữ liệu 
     String name;//trường hoạc thành viên dữ liệu 
 }  

Trong lớp có một phương thức mặc định dùng để khởi tạo đối tượng được gọi là phương thức khởi tạo (constructor). Phương thức khởi tạo được được đặt tên trùng với tên lớp và có chỉ dẫn truy cập bắt buộc là public để phương thức này có thể được triệu gọi từ bên ngoài phương thức. Các chỉ dẫn biên dịch (accessibility) bao gồm: public, internal, protected, private được mô tả chi tiết theo hình sau.

 Chỉ dẫn truy cập Mô tả
 public   Biến và phương thức có thể được truy cập từ bất kỳ
nơi đâu (bên ngoài cũng như bên trong lớp)
 internal  Biến và phương thức chỉ có thể được truy cập trong
cùng một gói
 protected  Biến và phương thức chỉ được truy cập ngay trong
lớp đó hoặc được được truy cập từ trong lớp kế thừa
của nó
 private  Biến và phương thức chỉ được truy cập ngay trong
phạm vi của lớp đó

Ví dụ về lớp và đối tượng trong C#

Trong ví dụ về lớp có hai trường: id và name. Chúng ta tạo một tượng của lớp, có phương thức khởi tạo đối tượng và phương thức in giá trị đối tượng.

using System;  
   public class Student  
    {  
        int id;//thành viên dữ liệu (biến thực thể)   
        String name;//thành viên dữ liệu (biến thực thể)    
         
    public static void Main(string[] args)  
        {  
            Student s1 = new Student();//Tạo đối tượng Student tại đây    
            s1.id = 101;  
            s1.name = "Sonoo Jaiswal";  
            Console.WriteLine(s1.id);  
            Console.WriteLine(s1.name);  
  
        }  
    }  

Kết quả:

101
Sonoo Jaiswal

 

Ví dụ 2: Có Main() trong lớp khác

Ví dụ chúng ta đang có phương thức Main () trong một lớp khác. Trong trường hợp như vậy, lớp  phải được public.

using System;  
   public class Student  
    {  
        public int id;   
        public String name;  
   }  
   class TestStudent{  
       public static void Main(string[] args)  
        {  
            Student s1 = new Student();    
            s1.id = 101;  
            s1.name = "Sonoo Jaiswal";  
            Console.WriteLine(s1.id);  
            Console.WriteLine(s1.name);  
  
        }  
    }  

Kết quả:

101
Sonoo Jaiswal

Ví dụ 3: Khởi tạo dữ liệu và hiển thị dữ liệu thông qua phương thức.

Xem ví dụ về lớp. Chúng ta Khởi tạo dữ liệu và hiển thị dữ liệu thông qua phương thức.

using System;  
   public class Student  
    {  
        public int id;   
        public String name;  
        public void insert(int i, String n)  
        {  
            id = i;  
            name = n;  
        }  
        public void display()  
        {  
            Console.WriteLine(id + " " + name);  
        }  
   }  
   class TestStudent{  
       public static void Main(string[] args)  
        {  
            Student s1 = new Student();  
            Student s2 = new Student();  
            s1.insert(101, "Ajeet");  
            s2.insert(102, "Tom");  
            s1.display();  
            s2.display();  
  
        }  
    }

  Kết quả:

101 Ajeet
102 Tom

 

Ví dụ 4:  Lưu trữ và hiển thị thông tin Employee

using System;  
   public class Employee  
    {  
        public int id;   
        public String name;  
        public float salary;  
        public void insert(int i, String n,float s)  
        {  
            id = i;  
            name = n;  
            salary = s;  
        }  
        public void display()  
        {  
            Console.WriteLine(id + " " + name+" "+salary);  
        }  
   }  
   class TestEmployee{  
       public static void Main(string[] args)  
        {  
            Employee e1 = new Employee();  
            Employee e2 = new Employee();  
            e1.insert(101, "Sonoo",890000f);  
            e2.insert(102, "Mahesh", 490000f);  
            e1.display();  
            e2.display();  
  
        }  
    }

  Kết quả:

101 Sonoo 890000
102 Mahesh 490000

Teacher

Teacher

Anh Tester

Tester

Đường dẫu khó chân vẫn cần bước đi
Đời dẫu khổ tâm vẫn cần nghĩ thấu

Teach the world online

Create an online video course, reach students across the globe, and earn money

Course content