Sự khác nhau giữa struct và class trong C

Sự khác nhau giữa struct và class trong C
Sự khác biệt giữa lớp và cấu trúc trong C # - Công Nghệ

Sự khác biệt chính - Đẳng cấp so với cấu trúc trong C #  

C # là một ngôn ngữ lập trình hiện đại, đa năng và cấp cao được phát triển bởi Microsoft. Nó là một ngôn ngữ lập trình tương tự như Java. Nó chứa các tính năng lập trình mạnh mẽ như đại biểu, chỉ mục và Truy vấn tích hợp ngôn ngữ. Ưu điểm chính của C # là nó hỗ trợ Lập trình hướng đối tượng (OOP). OOP rất hữu ích để lập mô hình một chương trình hoặc một phần mềm phức tạp bằng cách sử dụng các đối tượng. Các đối tượng được tạo bằng cách sử dụng các lớp. Cấu trúc cũng là một khái niệm trong C #. Trong lập trình, một biến là một vùng lưu trữ có thể lưu trữ dữ liệu. Mỗi biến có một kiểu dữ liệu cụ thể để lưu trữ. Hai kiểu dữ liệu là kiểu giá trị và kiểu tham chiếu. Trong loại giá trị, một giá trị có thể được chỉ định trực tiếp. Một số ví dụ là int, char, float. Kiểu dữ liệu kiểu tham chiếu không lưu trữ dữ liệu thực tế, nhưng chúng chứa một tham chiếu đến biến. Lớp và Cấu trúc lưu giữ dữ liệu. Bài viết này thảo luận về sự khác biệt giữa Lớp và Cấu trúc trong C #. Các sự khác biệt chính giữa lớp và cấu trúc trong C # là, một lớp là kiểu dữ liệu kiểu tham chiếu trong khi cấu trúc là kiểu dữ liệu kiểu giá trị.


1. Tổng quan và sự khác biệt chính 2. Class trong C # là gì 3. Cấu trúc trong C # là gì 4. Điểm giống nhau giữa lớp và cấu trúc trong C # 5. So sánh song song - Lớp so với cấu trúc trong C # ở dạng bảng

6. Tóm tắt

Class trong C # là gì?

Trong OOP, mọi thứ được coi như một đối tượng. Trong một chương trình hoặc phần mềm, có bất kỳ số lượng đối tượng nào. Những đối tượng này không tồn tại biệt lập. Mỗi đối tượng tương tác với các đối tượng khác. Giao tiếp này xảy ra bằng cách sử dụng các hành động. Một đối tượng bao gồm các thuộc tính và phương thức. Các thuộc tính xác định các đặc tính của đối tượng và các phương thức xác định các hành động hoặc hành vi của đối tượng. Các đối tượng được tạo bằng cách sử dụng một lớp. Một lớp tương tự như một mô tả hoặc một bản thiết kế để tạo một đối tượng. Lớp có các thuộc tính và phương thức nên được chứa trong đối tượng. Tạo một đối tượng bằng cách sử dụng một lớp được gọi là khởi tạo. Để tạo một đối tượng kiểu Student, cần có một lớp gọi là Student. Để định nghĩa một lớp trong C #, từ khóa ‘class’ được sử dụng.


Một lớp chứa một phương thức khởi tạo. Nó là một hàm đặc biệt được thực thi bất cứ khi nào tạo một đối tượng mới của lớp. Một hàm tạo có cùng tên với lớp. Nó không có kiểu trả về. Hàm tạo mặc định không có bất kỳ tham số nào. Hàm tạo được tham số hóa chứa các tham số. Một lớp cũng có thể chứa một hàm hủy. Nó là một hàm đặc biệt thực thi khi một đối tượng của lớp vượt ra khỏi phạm vi. Destructor có cùng tên với tên lớp và bắt đầu bằng ~. Nó không trả về bất kỳ giá trị nào và không yêu cầu tham số.

Lớp Sinh viên chứa các thuộc tính và phương thức nên tồn tại trong các đối tượng được tạo.

sử dụng Hệ thống;

ứng dụng không gian tên1 {

sinh viên lớp {

int studentID;

tên chuỗi;

public Student (int sid, string sname) {

studentID = sid;

tên = sname;

}

~ Sinh viên ();

public void displayDetails () {

Bảng điều khiển. WriteLine (“ID sinh viên là {0}”, studentID);

Bảng điều khiển. WriteLine (“Tên sinh viên là {0}”, tên);


}

}

class StudentInfomation {

static void Main (string [] args) {

Student s = new Student (1, “Ann”);

s.displayDetails ();

Console.ReadLine ();

}

}

}

Theo chương trình trên, không gian tên được gọi là Ứng dụng 1. Không gian tên chứa một tập hợp các lớp có liên quan. Class Student có hai thuộc tính ID và tên học sinh. Trong chương trình chính, đối tượng Student được tạo. Đối tượng đó là '. Khi tạo đối tượng, hàm tạo sẽ đặt các giá trị. Sau đó, phương thức displayDetails được gọi. Điều đó sẽ in id và tên của sinh viên.

Sự khác nhau giữa struct và class trong C

Các lớp cũng có thể thực hiện kế thừa. Kế thừa là một tính năng trong Lập trình hướng đối tượng. Nó là sử dụng các thuộc tính và phương thức của một lớp đã tồn tại. Do đó, một lớp có thể kế thừa một lớp khác.

Cấu trúc trong C # là gì?

Cấu trúc là một kiểu dữ liệu kiểu giá trị trong C #. Nó là một biến duy nhất chứa nhiều kiểu dữ liệu. Cấu trúc có thể đại diện cho một bản ghi nhất định. Một cấu trúc chứa các thuộc tính. Một sinh viên có các thuộc tính như id, tên và tuổi. Một cấu trúc được xác định bằng từ khóa ‘struct’. Một chương trình có cấu trúc như sau.

sử dụng Hệ thống;

struct Sinh viên {

public int id;

tên chuỗi công khai;

};

lớp công khai Sinh viên () {

public static void main (string [] args) {

Sinh viên;

s.id = 1;

s.name = “Ann”;

Console.WriteLine (“Id sinh viên {0}”, s.id);

Console.WriteLine (“Tên sinh viên {0}”, s.name);

Console.ReadLine ();

}

}

Theo chương trình trên, cấu trúc chứa hai thuộc tính. Chúng là id và tên. Trong chương trình chính, câu lệnh Student khai báo s thuộc kiểu Student. Sau đó, id và tên đã được cung cấp các giá trị. Cuối cùng, chúng được in trên màn hình.

Không thể thay đổi hàm tạo mặc định của một cấu trúc vì hàm tạo mặc định được định nghĩa tự động. Cấu trúc không chứa hàm hủy. Không giống như trong lớp, một cấu trúc không thể kế thừa một lớp khác hoặc một cấu trúc khác.

Sự tương đồng giữa lớp và cấu trúc trong C # là gì?

  • Cả hai đều có thuộc tính và phương thức.
  • Cả Lớp và Cấu trúc đều có thể triển khai một hoặc nhiều giao diện.

Sự khác biệt giữa Lớp và Cấu trúc trong C # là gì?

Một lớp là một bản thiết kế được sử dụng để tạo một đối tượng.Cấu trúc là một kiểu dữ liệu kiểu giá trị có thể chứa dữ liệu liên quan của nhiều kiểu dữ liệu khác nhau.
Loại dữ liệu
Một lớp là một kiểu dữ liệu kiểu tham chiếu.Cấu trúc là một kiểu dữ liệu kiểu giá trị.
Di sản
Một Lớp có thể kế thừa từ các lớp hoặc cấu trúc khác.Một cấu trúc không thể kế thừa các lớp hoặc cấu trúc khác.
Thuyết minh
Một lớp khởi tạo một đối tượng bằng từ khóa mới.Một cấu trúc khởi tạo một đối tượng mà không cần sử dụng từ khóa mới.
Nhà xây dựng mặc định
Có thể thay đổi hàm tạo mặc định của một lớp.Không thể thay đổi hàm tạo mặc định của một cấu trúc. Hàm tạo mặc định được tự động xác định.
Kẻ hủy diệt
Lớp có thể có một hàm hủy.Cấu trúc không có hàm hủy.

Tóm tắt - Lớp so với cấu trúc trong C #

C # là một ngôn ngữ lập trình do Microsoft tạo ra. Trong lập trình, dữ liệu nên được lưu trữ. Dữ liệu được lưu trữ trong các vị trí bộ nhớ và chúng được biết đến như một biến. Mỗi biến có một loại dữ liệu cụ thể sẽ được lưu trữ. Có thể có kiểu dữ liệu kiểu giá trị và kiểu dữ liệu kiểu tham chiếu. Kiểu dữ liệu kiểu giá trị lưu trữ giá trị thực. Các kiểu dữ liệu kiểu tham chiếu lưu trữ một tham chiếu đến biến. Lớp và Cấu trúc có các kiểu dữ liệu khác nhau. Sự khác biệt giữa lớp và cấu trúc trong C # là, lớp là kiểu dữ liệu kiểu tham chiếu trong khi cấu trúc là kiểu dữ liệu kiểu giá trị.

Tải xuống bản PDF Lớp và Cấu trúc trong C #

Bạn có thể tải xuống phiên bản PDF của bài viết này và sử dụng nó cho các mục đích ngoại tuyến theo ghi chú trích dẫn. Vui lòng tải xuống phiên bản PDF tại đây: Sự khác biệt giữa lớp và cấu trúc trong C #

Đây là câu hỏi mà bạn rất dễ gặp phải trong các cuộc phỏng vấn lập trình viên iOS. Vậy Struct và Class có điểm gì khác gì nhau ? Chúng ta sẽ phân tích trong bài viết hôm nay
Trước khi đi vào phân biệt 2 khái niệm trên, hãy nhìn vào những điểm tương đồng giữa chúng.

Điểm giống nhau

Với người mới tiếp cận Swift, nhìn cách sử dụng Struct và Class thấy chúng tương đối giống nhau. Về cơ bản, Struct và Class đều thực hiện chung một nhiệm vụ là xây dựng một đối tượng.

  • Đều có thể khai báo các Stored Properties (thuộc tính lưu trữ) và các Functions (phương thức)
  • Hỗ trợ các Subscript Syntax để truy vấn giá trị theo các Subscript
class Count { subscript (index: Int) -> String { switch index: case 0: return "Zero" case 1: return "One" case 2: return "True" default: return "Many" } let count = Count() print (count[0]) print (count[57]) }
  • Cho phép tạo ra các hàm khởi tạo tuỳ theo mục đích và logic của lập trình viên
struct Employee { var code: Int? var name: String? var address: String? init(code: Int, name: String, address: String) { self.code = code self.name = name self.address = address } init(name: String, address: String) { self.name = name self.address = address } }
  • Có thể mở rộng với việc sử dụng Extension. Extension là một khái niệm mới trong Swift, cho phép chúng ta mở rộng các Class, Struct đã được xây dựng từ trước (kể cả các đối tượng của hệ thống như Int, Double, String, UIViewcontroller, ...)
extension Int { func double() -> Int { return self * 2 } } var a = 5 print(a.double())
  • Có thể implement các Protocol để mở rộng chức năng, hỗ trợ cho lập trình POP (Protocol Oriented Programming) Chúng ta đã nói về những điểm chung, vậy Struct và Class khác nhau ở điểm gì ???

Điểm khác nhau

  • Điểm khác nhau cơ bản và quan trọng nhất giữa Struct và Class mà bạn luôn phải nhớ đó là Struct là kiểu Value Type (tham trị) còn Class là Reference Type (tham chiếu).

Value Type: Mỗi instance giữ một bản sao duy nhất dữ liệu của nó. Nó sẽ tạo một instance mới (bản sao) khi được gán cho một biến, hoặc hằng, hoặc khi được truyền cho một hàm. Do đó, khi thay đổi giá trị của 1 instance, những instance khác không bị thay đổi theo. Xem ví dụ để hiểu hơn về khái niệm này

struct Employee { var code: Int var name: String var address: String } var a = Employee(code: 5, name: "BXH", address: "Sun*") var b = a b.name = "MH" print(a.name) print(b.name)

Reference Type: Mỗi instance chia sẻ một bản sao dữ liệu. Một kiểu mà khi được khởi tạo, khi được gán cho một biến hoặc hằng hoặc khi được truyền cho một hàm, sẽ trả về một tham chiếu đến cùng instance hiện có. Khái niệm thật khó hiểu đúng không. Đọc ví dụ để dễ hiểu hơn nhé

class Employee { var code: Int var name: String var address: String init(code: Int, name: String, address: String) { self.code = code self.name = name self.address = address } } var a = Employee(code: 5, name: "BXH", address: "Sun*") var b = a b.name = "MH" print(a.name) print(b.name)
  • Class có tính kế thừa (Inheritance), còn Struct thì không . Tính kế thừa cho phép lớp con (Subclass) mang đầy đủ thuộc tính, phương thức của lớp cha (Superclass). Ví dụ: Chúng ta có thể tạo ra những custom View sau khi kế thừa class UIView.
  • Khi tạo Struct, sẽ mặc định sinh ra một hàm khởi tạo với đầy đủ tham số tương ứng với tất cả Stored Properties (gọi là Memberwise Initializer). Còn Class thì không có. Do đó khi tạo một class, ta sẽ phải khai báo Optional cho các thuộc tính hoặc phải tự định nghĩa một hàm khởi tạo.
  • Class có hàm Denit (khi instance chuẩn bị được giải phóng khỏi bộ nhớ). Chúng ta có thể gọi hàm này để kiểm tra khi cần thiết (đảm bảo instance đã bị huỷ để kiểm tra Retain Cycle)
  • Class là kiểu Reference Type, do đó có thể thay đổi trực tiếp giá trị của các thuộc tính qua phương thức của nó. Còn với Struct ta phải khai báo từ khoá mutating trước phương thức để làm việc đó.
class Employee { var code: Int? func changeCode(newCode: Int) { self.code = newCode } struct OtherEmployee { var code: Int mutating func changeCode(newCode: Int) { self.code = newCode } }
  • Ngoài ra, Class hỗ trợ Type Casting, cho phép sử dụng toán tử is và as để kiểm tra hoặc ép kiểu thể hiện của một Class. Struct thì không.
  • Class là kiểu tham chiếu, do đó hỗ trợ các toán tử === và !== để kiểm tra các đối tượng có đang trỏ tới cùng một instance hay không.

Vậy khi nào sử dụng Class, khi nào sử dụng Struct

Apple định nghĩa Swift là ngôn ngữ theo hướng POP (Protocol Oriental Programming). POP xây dựng dựa trên tính linh hoạt của Struct và Protocol, do đó nhiều thư viện chuẩn của Swift sử dụng Struct (như Int, String, ...). Struct trong nhiều trường hợp cũng an toàn hơn Class trong việc quản lý bộ nhớ. Tuy nhiên không phải lúc nào chúng ta cũng sử dụng Struct.

Sử dụng Struct khi nào

  • Sử dụng Struct khi tạo đối tượng với nhiều thuộc tính có kiểu dữ liệu đơn giản, thường ở kiểu giá trị (như Int, Float, String, ...)
  • Khi làm việc đa luồng. Ví dụ kết nối database được thực hiện trên một luồng song với luồng Main, việc sử dụng Struct an toàn hơn do nó có thể copy giá trị từ luồng này sang luồng khác.
  • Sử dụng Struct sẽ đảm bảo không có phần nào trong code có được tham chiếu tới đối tượng của chúng ta trừ khi ta truy xuất thẳng tới chúng. Do đó, dễ quản lý, việc kiểm soát giá trị đối tượng khi bị thay đổi cũng trở nên đơn giản hơn.

Sử dụng Class khi nào

  • Class được sử dụng trong trường hợp chúng ta cần những tính chất đặc biệt của nó mà Struct không có (như đã nêu ở trên)
  • Khi muốn làm việc với cả trình biên dịch của Swift và Objective - C, bạn bắt buộc phải sử dụng Class. Ví dụ khi xây dựng Realm Model, phải khai báo từ khoá @objc hay và dynamic, do đó, bắt buộc phải sử dụng Class.
  • Việc copy các instance là không hợp lý hoặc không cần thiết. Ví dụ window hay UIViewController chỉ có 1 đối tượng active tại một thời điểm. Chúng ta sẽ luôn tạo mới một đối tượng controller để sử dụng thay vì copy giá trị chúng. Hoặc với những đối tượng như DatabaseConnection. Việc copy tạo ra nhiều instance cùng trỏ tới 1 file là không cần thiết, bởi chúng luôn kết nối tới cùng một dữ liệu như nhau. Trường hợp chỉ cần 1 wrapper để chứa các phương thức kết nối API trả về dữ liệu, chúng ta không cần sử dụng Struct. Việc copy instance là không cần thiết, hơn nữa lợi dụng tính kế thừa của Class trong trường hợp này sẽ giúp code chúng ta ngắn gọn và clean hơn. Nguồn tham khảo:

    https://medium.com/@abhimuralidharan/difference-between-a-struct-and-a-class-in-swift-53e08df73714


    https://learnappmaking.com/struct-vs-class-swift-how-to/
    https://viblo.asia/p/su-khac-nhau-giua-value-type-va-reference-type-trong-swift-naQZRYQdKvx