在 C# 中,類和結構都用於定義自定義數據類型,但它們之間存在一些差異。
繼承:類可以繼承其他類,但結構不能。換句話說,一個類可以從另一個類派生,但結構不能。
引用類型與值類型:類是引用類型,這意味著當您創建類的對象時,會創建對該對象的引用,並且在使用該引用的任何地方都會反映對該對象的更改。另一方麵,結構是一種值類型,這意味著當您創建結構類型的變量時,該變量的實際值存儲在內存中,並且對該變量的更改不會反映在其他地方。
- 默認構造函數:類總是有一個默認構造函數,在創建該類的對象時調用該構造函數。另一方麵,結構默認沒有默認構造函數。但是,如果需要,您可以在結構中定義默認構造函數。
- 初始化:當您創建類的對象時,其成員將被初始化為其默認值(即引用類型為 null,值類型為 0)。當您創建結構類型的變量時,其成員也會初始化為其默認值。但是,您也可以在創建結構類型的變量時為該結構的成員提供初始值。
- 大小和性能:結構的大小通常比類小,因為它們不包含任何引用變量或開銷。這意味著結構作為參數傳遞或複製比類更快。
A 類是用戶定義的藍圖或原型,用於創建對象。本質上,一個類將字段和方法(定義操作的成員函數)組合成一個單元。
例子:
C#
// C# program to illustrate the
// concept of class
using System;
// Class Declaration
public class Author {
// Data members of class
public string name;
public string language;
public int article_no;
public int improv_no;
// Method of class
public void Details(string name, string language,
int article_no, int improv_no)
{
this.name = name;
this.language = language;
this.article_no = article_no;
this.improv_no = improv_no;
Console.WriteLine("The name of the author is : " + name
+ "\nThe name of language is : " + language
+ "\nTotal number of article published "
+ article_no + "\nTotal number of Improvements:"
+" done by author is : " + improv_no);
}
// Main Method
public static void Main(String[] args)
{
// Creating object
Author obj = new Author();
// Calling method of class
// using class object
obj.Details("Ankita", "C#", 80, 50);
}
}
The name of the author is : Ankita The name of language is : C# Total number of article published 80 Total number of Improvements: done by author is : 50
A 結構體是單個單元下不同數據類型的變量的集合。它幾乎類似於類,因為兩者都是用戶定義的數據類型,並且都保存一堆不同的數據類型。
例子:
C#
// C# program to illustrate the
// concept of structure
using System;
// Defining structure
public struct Car
{
// Declaring different data types
public string Brand;
public string Model;
public string Color;
}
class GFG {
// Main Method
static void Main(string[] args)
{
// Declare c1 of type Car
// no need to create an
// instance using 'new' keyword
Car c1;
// c1's data
c1.Brand = "Bugatti";
c1.Model = "Bugatti Veyron EB 16.4";
c1.Color = "Gray";
// Displaying the values
Console.WriteLine("Name of brand: " + c1.Brand
+ "\nModel name: " + c1.Model
+ "\nColor of car: " + c1.Color);
}
}
Name of brand: Bugatti Model name: Bugatti Veyron EB 16.4 Color of car: Gray
類和結構之間的區別
類 |
結構 |
---|---|
類是引用類型。 |
結構體是值類型。 |
所有引用類型都分配在堆內存上。 |
所有值類型都分配在堆棧內存上。 |
大引用類型的分配比大值類型的分配更便宜。 |
與引用類型相比,分配和 de-allocation 在值類型中更便宜。 |
類具有無限的函數。 |
結構體的函數有限。 |
類一般用在大型程序中。 |
結構體用於小程序中。 |
類可以包含構造函數或析構函數。 |
結構不包含無參數構造函數或析構函數,但可以包含參數化構造函數或靜態構造函數。 |
類使用 new 關鍵字來創建實例。 |
struct 可以創建一個實例,有或沒有 new 關鍵字。 |
一個類可以繼承另一個類。 |
不允許結構體繼承另一個結構體或類。 |
類的數據成員可以受到保護。 |
struct 的數據成員無法受到保護。 |
類的函數成員可以是虛擬的或抽象的。 |
結構體的函數成員不能是虛擬的或抽象的。 |
類的兩個變量可以包含同一個對象的引用,並且對一個變量的任何操作都可以影響另一個變量。 |
struct 中的每個變量都包含自己的數據副本(除了 ref 和 out 參數變量),對一個變量的任何操作都不會影響另一個變量。 |
總之,C# 中的類和結構之間的主要區別是繼承、引用類型與值類型、默認構造函數、初始化和大小/性能。類通常用於更大、更複雜的對象,而結構則用於更小、更簡單、經常使用且需要快速傳遞的對象。然而,類和結構都有各自的優點和缺點,它們之間的選擇最終取決於項目的具體要求。
相關用法
- C# Console.MoveBufferArea()用法及代碼示例
- C# Convert.ToBase64String()用法及代碼示例
- C# Convert.ToBase64CharArray()用法及代碼示例
- C# Char.GetUnicodeCategory(String, Int32)用法及代碼示例
- C# Console.WindowLeft用法及代碼示例
- C# Console.WindowWidth用法及代碼示例
- C# Char.CompareTo()用法及代碼示例
- C# Char.Equals()用法及代碼示例
- C# Char.GetHashCode()用法及代碼示例
- C# Char.GetNumericValue()用法及代碼示例
- C# Char.GetTypeCode()用法及代碼示例
- C# Char.IsDigit()用法及代碼示例
- C# Char.IsLetter()用法及代碼示例
- C# Char.IsLetterOrDigit()用法及代碼示例
- C# Char.IsLower()用法及代碼示例
- C# Char.IsNumber()用法及代碼示例
- C# Char.IsPunctuation()用法及代碼示例
- C# Char.IsSymbol()用法及代碼示例
- C# Char.IsUpper()用法及代碼示例
- C# Char.IsWhiteSpace()用法及代碼示例
- C# Char.Parse(String)用法及代碼示例
- C# Char.ToLowerInvariant(Char)用法及代碼示例
- C# Char.ToString()用法及代碼示例
- C# Char.ToUpperInvariant(Char)用法及代碼示例
- C# CharEnumerator.Clone()用法及代碼示例
注:本文由純淨天空篩選整理自ankita_saini大神的英文原創作品 Difference between Class and Structure in C#。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。