Trang chủ Liên hệ

Bài 8 C# cơ bản - Ép kiểu trong C#

CÔNG TY TNHH THIẾT BỊ ĐO LƯỜNG VÀ ĐIỀU KHIỂN 25/02/2023

Nội dung

Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về các phần:

 Trong bài học này, chúng ta sẽ cùng tìm hiểu các vấn đề:

Ép kiểu là gì? Tại sao phải ép kiểu?

Ép kiểu là biến đổi dữ liệu thuộc kiểu dữ liệu này thành kiểu dữ liệu khác.

Tại sao phải ép kiểu?

Có mấy loại ép kiểu? Cách sử dụng từng loại

Trong C#, ép kiểu có 4 loại:

Chuyển đổi kiểu ngầm định (implicit)

Việc chuyển đổi này được thực hiện bởi trình biên dịch và chúng ta không cần tác động gì.

Được thực hiện khi chuyển kiểu từ

int intValue = 10;
long longValue = intValue; /* Chuyển kiểu ngầm định vì kiểu long có miền giá trị lớn hơn kiểu int nên có thể chuyển từ int sang long.*/
float floatValue = 10.9f;
double doubleValue = floatValue; /* Tương tự vì kiểu double có miền giá trị lớn hơn kiểu float nên có thể chuyển từ float sang double.*/ 

Chuyển đổi kiểu tường minh (explicit)

Chuyển đổi kiểu tường minh là việc chuyển kiểu một cách rõ ràng và dùng từ khóa chỉ định chứ không dùng phương thức.

Một số đặc điểm của chuyển đổi kiểu tường minh:

Cú pháp: (<kiểu dữ liệu>) <biến cần ép kiểu>

Ý nghĩa:

Ép kiểu của <biến cần ép kiểu> về <kiểu dữ liệu> nếu thành công sẽ trả ra giá trị kết quả ngược lại sẽ báo lỗi chương trình. Đặc biệt đối với số:

Ví dụ:

int i = 300; // 300 có mã nhị phân là 100101100
byte b = (byte)i; 
/* do kiểu byte có giới hạn đến giá trị 255 thôi nên không thể chứa số 300 được mà kiểu byte có kích thước là 1 bytes tương đương 8 bit. Như vậy ta cần cắt mã nhị phân của số 300 về còn 8 bit là được. Mã nhị phân 300 là 100101100 cắt từ trái qua 1 bit ta được 00101100 (đủ 8 bit) tương đương với số 44. Cuối cùng biến b sẽ mang giá trị là 44.*/

Console.WriteLine(" i = " + i);
Console.WriteLine(" b = " + b);

Việc ép kiểu thế này làm mình nhớ lại một vấn đề nho nhỏ sau: Ở bài TOÁN TỬ TRONG C# ta có nói là toán tử “/” là thực hiện chia lấy phần nguyên nếu cả 2 toán hạng đều là số nguyên. Vậy nếu chúng ta muốn chia ra kết quả chính xác luôn thì phải làm sao?

Ví dụ:

double d = 2 / 3; // kết quả ra 0 vì 2 và 3 đều là số nguyên nên thực hiện 2 chia lấy phần nguyên với 3 được 0
            double k = (double)2 / 3; // Ép kiểu số 2 từ kiểu nguyên sang kiểu số thực. Như vậy kết quả phép chia sẽ ra số thực
            double t = 1.0 * 2 / 3; // Thực hiện nhân 1.0 với 2 mục đích để biến số 2 (số nguyên) thành 2.0 (số thực)

            Console.WriteLine(" d = {0} \n k = {1} \n t = {2}", d, k, t);

Sử dụng phương thức, lớp hỗ trợ sẵn

Phương thức Parse(), TryParse()

Parse()

Cú pháp: <kiểu dữ liệu>.Parse(<dữ liệu cần chuyển đổi>);

Ý nghĩa:

Ví dụ: 

string stringValue = "10";
int intValue = int.Parse(stringValue); // Chuyển chuỗi stringValue sang kiểu int và lưu giá trị vào biến intValue - Kết quả intValue = 10
double HowKteam = double.Parse("10.9"); // Chuyển chuỗi giá trị hằng "10.9" sang kiểu int và lưu giá trị vào biến HowKteam - Kết quả HowKteam = 10.9


TryParse()

Cú pháp:  <kiểu dữ liệu>.TryParse(<dữ liệu cần chuyển đổi>, out <biến chứa kết quả>);

Ý nghĩa:

int Result; // Biến chứa giá trị kết quả khi ép kiểu thành công
bool isSuccess; // Biến kiểm tra việc ép kiểu có thành công hay không
string Data1 = "10", Data2 = "Kteam"; // Dữ liệu cần ép kiểu

isSuccess = int.TryParse(Data1, out Result); // Thử ép kiểu Data1 về int nếu thành công thì Result sẽ chứa giá trị kết quả ép kiểu và isSuccess sẽ mang giá trị true. Ngược lại Result sẽ mang giá trị 0 và isSuccess mang giá trị false
Console.Write(isSuccess == true ? " Success !" : " Failed !"); // Sử dụng toán tử 3 ngôi để in ra màn hình việc ép kiểu đã thành công hay thất bại.
Console.WriteLine(" Result = " + Result); // In giá trị Result ra màn hình

isSuccess = int.TryParse(Data2, out Result); // Tương tự như trên nhưng thao tác với Data2
Console.Write(isSuccess == true ? " Success !" : " Failed !"); // Tương tự như trên
Console.WriteLine(" Result = " + Result); // Tương tự như trên

Vì Data1 có thể ép kiểu về int nên kết quả thành công và in giá trị ra. Còn Data2 không thể ép kiểu về kiểu int nên kết quả không thành công và in ra giá trị 0.

Lưu ý khi sử dụng Parse() và TryParse():

Lớp hỗ trợ sẵn (Convert)

Convert là lớp tiện ích được C# hỗ trợ sẵn cung cấp cho chúng ta nhiều phương thức chuyển đổi kiểu dữ liệu.

Các đặc điểm của các phương thức trong lớp Convert:

Một số phương thức chuyển kiểu mà Convert có:

Người dùng tự định nghĩa kiểu chuyển đổi

Khi chúng ta tạo ra một kiểu dữ liệu mới chúng ta cũng cần định nghĩa các chuyển đổi kiểu dữ liệu từ kiểu cơ bản sang kiểu tự định nghĩa và ngược lại.

Nhưng trong phạm vi kiến thức hiện tại thì mình chỉ có thể giới thiệu cho các bạn biết là mình có thể tự định nghĩa kiểu chuyển đổi còn việc thực hiện như thế nào sẽ được trình bày trong bài CLASS TRONG C#.

Ví dụ chương trình sử dụng ép kiểu

Ví dụ: viết chương trình nhập vào 2 số a và b sau đó in ra tổng, hiệu, tích, thương của 2 số đó

Gợi ý/Hướng giải quyết bài toán ví dụ:

Code:

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

namespace Bai_08_01
{
    class Program
    {
        static void Main(string[] args)
        {
            //khai bao
            string StrA, StrB;
            int A, B;
            int Tong, Hieu, Tich;
            double Thuong;

            //Nhap du lieu tu ban phim
            Console.Write("Nhap so A: ");
            StrA = Console.ReadLine();
            A = int.Parse(StrA);

            Console.Write("Nhap so B: ");
            StrB = Console.ReadLine();
            B = int.Parse(StrB);

            Tong = A + B;
            Hieu = A - B;
            Tich = A * B;
            Thuong = (double)A/B; //Ep so A ve thap phan de co ket qua la thap phan

            Console.WriteLine("Tong = " + Tong);
            Console.WriteLine("Hieu = " + Hieu);
            Console.WriteLine("Tich = " + Tich);
            Console.WriteLine("Thuong = " + Thuong);
            Console.ReadKey();
        }
    }
}

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

namespace Bai_08_01
{
    class Program
    {
        static void Main(string[] args)
        {
            //khai bao
            string StrA, StrB;
            int A, B;
            bool CheckStrA, CheckStrB; //Them vao de kiem tra tinh hop le nhap A,B
            int Tong, Hieu, Tich;
            double Thuong;

            //Nhap du lieu tu ban phim
            Nhap:
            Console.Write("Nhap so A: ");
            StrA = Console.ReadLine();
            CheckStrA = int.TryParse(StrA, out A);
            Console.WriteLine(CheckStrA == true ? "A hop le" : "A khong hop le");

            Console.Write("Nhap so B: ");
            StrB = Console.ReadLine();
            CheckStrB = int.TryParse(StrB, out B);
            Console.WriteLine(CheckStrB == true ? "B hop le" : "B khong hop le");

            if (CheckStrA & CheckStrB == true)
            {
                Tong = A + B;
                Hieu = A - B;
                Tich = A * B;
                Thuong = (double)A / B; //Ep so A ve thap phan de co ket qua la thap phan

                Console.WriteLine("Tong = " + Tong);
                Console.WriteLine("Hieu = " + Hieu);
                Console.WriteLine("Tich = " + Tich);
                Console.WriteLine("Thuong = " + Thuong);
            }
            else
            {
                Console.WriteLine("Ban nhap sai, vui long nhap lai");
                goto Nhap;
            }
           
            Console.ReadKey();
        }
    }
}

Kết luận

Nội dung bài này giúp các bạn nắm được:

Bài học sau chúng ta sẽ cùng tìm hiểu một khái niệm tiếp theo đó là CẤU TRÚC IF - ELSE TRONG C#

Bài viết liên quan