Thắc mắc về việc dùng kiểu object và var trong vòng lặp foreach

Chào mn ạ. Mn giải đáp giúp em tại sao khi dùng kiểu var cho vòng lặp foreach kết quả chạy chương trình lại khác so với dùng kiểu object với ạ? Cụ thể là ở phương thức Show(List < Product > products). Ban đầu em để foreach(var p in products) với phần comment thì chạy ra được kết quả mong muốn. Sau đó em có thay var bằng object thì kết quả chạy ra bị sai ạ.
Em cảm ơn mn nhiều ạ!!

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

namespace ProductManagement
{

    internal class Program
    {
        static void Main(string[] args)
        {
            List<Product> products = new List<Product>();
            Product.Initiallize(products);
            Console.WriteLine("==================================");
            Console.WriteLine("Danh sach cac san pham ");
            Product.Show(products);
            Console.WriteLine("==================================");
            Console.WriteLine("Phan loai san pham");
            Console.WriteLine("San pham co gia ca tren 500,000 VND: ");
            var productsUpto500000 = products.Where(p => p.Price >= 500000);
            foreach (var p in productsUpto500000)
            {
                Console.WriteLine(p.Name);
            }
            Console.WriteLine("San pham co xuat xu tu Han Quoc: ");
            var productsOfKorea = from p in products where p.Origin == "Han Quoc" select p;
            foreach (var p in productsOfKorea)
            {
                Console.WriteLine(p.Name);
            }
            Console.WriteLine("===================================");
            Console.WriteLine("Danh sach rut gon: ");
            var shortList = products.Select(
                (p) =>
                {
                    return "Ten san pham: " + p.Name + " - " + "Ma san pham: " + p.Id;
                }
            );
            foreach (var item in shortList)
            {
                Console.WriteLine(item);
            }
        }
    }
  internal class Product
    {

        private string _name;
        private string _origin;
        private decimal _price;
        private string _id;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        public string Origin
        {
            get { return _origin; }
            set { _origin = value; }
        }
        public decimal Price
        {
            get { return _price; }
            set { _price = value; }
        }
        public string Id
        {
            get { return _id; }
            set { _id = value; }
        }
        public static List<Product> Initiallize(List<Product> products)
        {
            int i = 1;
            while (true)
            {
                Console.WriteLine("San pham so " + i);
                products.Add(new Product()
                {
                    Name = null,
                    Origin = null,
                    Price = 0,
                    Id = null
                });
                Console.Write("Ten san pham: "); products[i - 1].Name = Console.ReadLine();
                Console.Write("Xuat xu: "); products[i - 1].Origin = Console.ReadLine();
                Console.Write("Gia san pham: "); products[i - 1].Price = decimal.Parse(Console.ReadLine());
                Console.Write("Ma san pham: "); products[i - 1].Id = Console.ReadLine();    
                i++;
                if (Console.ReadLine() == "stop") break;
            }
            return products;
        }
        public static void Show(List< Product > products)
        {
            int number = 1;
            foreach (object p in products)
            {
                Console.WriteLine("San pham so " + number);
                Console.WriteLine($"{ p }");
                // Console.WriteLine($"Ten san pham: {p.Name}");
                //  Console.WriteLine($"Xuat xu: {p.Origin}");               
                // Console.WriteLine($"Gia thanh: {string.Format("{0:0,0}", p.Price)} VND");
                // Console.WriteLine($"Ma san pham: {p.Id} \n");
                number++;
            }
        }
    }
}

Sai như thế nào thì bạn không nói nhỉ?

Bạn nên biết khác biệt giữa từ khóa varkiểu object.
Có phải khi bạn dùng var thì 4 dòng dưới chạy được, còn khi dùng object thì lúc chạy 4 dòng dưới lỗi?
Đối với var, kiểu dữ liệu sẽ được tự nhận dạng theo kiểu trả về (rất linh động), nên hoàn toàn có thể gọi đến phương thức, thuộc tính của kiểu trả về.
Còn object là kiểu dữ liệu cơ bản nhất và thấp nhất của hướng đối tượng, bạn muốn truy xuất các phương thức của lớp (thực tế) cao hơn thì phải ép kiểu lên (upper-cast).

4 Likes

Dạ, anh/chị nói đúng ý thắc mắc của em rồi ạ. Cho em hỏi thêm là nếu vậy thì có cách nào dùng object mà từ hàm show đó vẫn in ra được 4 dòng dưới như khi dùng var không ạ?
Lúc em dùng object theo kiểu ở trên thì nó in ra là ProductManagement.Product ạ.
Em cảm ơn anh/chị nhiều.

Ghi đè (override) phương thức ToSring của object là được.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?