30/09/2018, 19:17

sự khác nhau của struct và class trong C#

Mình cũng đã đọc nhiều tài liệu phân biệt 2 cái này và biết:
Struct :

  • Struct là kiểu dữ liệu tham trị được lưu trong Stack.
  • Struct không hỗ trợ kế thừa
  • Không thể khai báo hàm khởi tạo(không đối số)

  • Classs :
  • Class là kiểu dữ liệu tham chiếu được lưu trong heap.
  • class có hỗ trợ kế thừa.

Mình vẫn chưa hiểu cái : class là kiểu dữ liệu reference type còn struture là value type
Ai có thể cho mình ví dụ cụ thể (1 đoạn code C# viết về struct sinhvien hoặc class sinhvien chẳng hạn) để chỉ ra sự khác nhau 2 cái này không? Mình là dân C,JAVA mới nhập cư sang C#
Mong mọi người chỉ giáo

明玉 viết 21:21 ngày 30/09/2018

Trong C#, những cái gì là reference type thì variable đều trỏ lên heap.
Còn value type thì variable thường nằm trên stack.

Khi bạn sử dụng value type làm tham số cho hàm, khi hàm đó chạy là cả 1 cục dữ liệu value type sẽ được bỏ vào hàm.
Còn nếu là reference type làm tham số thì chỉ có cái reference (có thể coi là 1 dạng pointer cao cấp) được bỏ vào hàm thôi, rồi từ reference đó truy cập đến dữ liệu thật.

Theo mình biết thì thường khi gọi hàm, các tham số sẽ được push vào stack, dùng kiểu reference thì tiết kiệm được stack, nhưng tốc độ chạy thì chưa chắc vì làm thế này là dùng heap vốn không nhanh hơn stack, thường thì những dữ liệu loại nhỏ mà được sử dụng liên tục thì có thể dùng stack, quy tắc của Microsoft để lựa chọn class và struct.

À mà bởi vì reference type nó kiểu như con trỏ, nên có thể gán null, value type không như vậy được.

Có 1 ví dụ khá hay trên này nói về việc gán dữ liệu giữa 2 loại: gán biến class thì nó gán reference, gán biến struct thì nó gán cả khối dữ liệu (ngoại trừ trường hợp bạn đi overload operator nhé).

using System;    
// PrintedPage is a value type
struct PrintedPage
{
    public string Text;
}

// WebPage is a reference type
class WebPage
{
    public string Text;
}

class Demonstration
{
    static void Main()
    {
         // First look at value type behaviour
         PrintedPage originalPrintedPage = new PrintedPage();
         originalPrintedPage.Text = "Original printed text";

         // Copy all the information
         // ở đây là struct nên sẽ copy cả khối dữ liệu - tất cả các biến trong struct
         PrintedPage copyOfPrintedPage = originalPrintedPage;

         // Change the new copy
         copyOfPrintedPage.Text = "Changed printed text";

         // Write out the contents of the original page.
         // Output=Original printed text
         Console.WriteLine ("originalPrintedPage={0}", originalPrintedPage.Text);


         // Now look at reference type behaviour
         WebPage originalWebPage = new WebPage();
         originalWebPage.Text = "Original web text";

         // Copy just the URL
         // ở đây là class nên chỉ copy reference
         WebPage copyOfWebPage = originalWebPage;

         // Change the page via the new copy of the URL
         copyOfWebPage.Text = "Changed web text";

         // Write out the contents of the page
         // Output=Changed web text
         Console.WriteLine ("originalWebPage={0}",
                   originalWebPage.Text);

         // Now change the copied URL variable to look at
         // a different web page completely
         copyOfWebPage = new WebPage();
         copyOfWebPage.Text = "Changed web page again";

         // Write out the contents of the first page
         // Output=Changed web text
         Console.WriteLine ("originalWebPage={0}", originalWebPage.Text);

    }
}
Interns viết 21:20 ngày 30/09/2018

Cảm ơn bạn mình đã hiểu rồi

GodOfGod viết 21:31 ngày 30/09/2018

FunFact:
Tất cả Reference type đều được lưu trên heap, hầu hết Value type được lưu trên stack

明玉 viết 21:27 ngày 30/09/2018

Ủa thế có Value type nào lưu trên heap vậy

viết 21:18 ngày 30/09/2018

value type nằm trong class chứ gì nữa

Bài liên quan
0