1. 值類型與引用類型
- 結(jié)構(gòu)是值類型,值類型在堆棧上分配地址,所有的基類型都是結(jié)構(gòu)類型,例如int對應(yīng)System.int32結(jié)構(gòu)。
- 類是引用類型,引用類型在堆上分配地址。
注解:
- 對結(jié)構(gòu)變量所做的改變不會影響其的原值,而對于類,改變其變量的值會改變其原值。
- 堆棧的執(zhí)行效率要比堆的執(zhí)行效率高,可是堆棧的資源有限,不適合處理大的邏輯復(fù)雜的對象。
- 雖然結(jié)構(gòu)和類的類型不一樣,可是他們的基類型都是對象,C#中所有的類型的基類型都是object。
2. 繼承性
- 結(jié)構(gòu)不能從另一個結(jié)構(gòu)或者類繼承,本身也不能被繼承,雖然結(jié)構(gòu)沒有明確的用sealed聲明,可是結(jié)構(gòu)是隱式的sealed。
- 類完全可擴(kuò)展的,除非顯示的聲明sealed,否則類可以繼承其他類和接口,自身也能被繼承。
注解:雖然結(jié)構(gòu)不能被繼承,可是結(jié)構(gòu)能夠繼承接口,方法和類繼承接口一樣。
3. 內(nèi)部結(jié)構(gòu)
- 結(jié)構(gòu)沒有默認(rèn)的構(gòu)造函數(shù),但是可以添加構(gòu)造函數(shù),沒有析構(gòu)函數(shù),沒有abstract 和sealed(因?yàn)椴荒鼙焕^承),沒有protected修飾符,可以不適用new初始化。
- 類有默認(rèn)的構(gòu)造函數(shù),有析構(gòu)函數(shù),可以使用abstract和sealed,有protected修飾符,必須使用new初始化。
4. 申明結(jié)構(gòu)用Struct關(guān)鍵字,申明類用class關(guān)鍵字。
code practice:

code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StructAndClass
{
class Program
{
interface ITestInterface
{
void Paint();
}
// define a struct
public struct TestStruct: ITestInterface
{
public string Name;
public int height;
public bool overWeight()
{
return true;
}
public void Paint() { }
}
// define a class
public class TestClass: ITestInterface
{
public string Name = "Time";
public void Paint() { }
~TestClass()
{
Console.WriteLine("Test class destructor.");
}
}
public sealed class ClassExtend: TestClass
{
public ClassExtend()
{
Console.WriteLine("Test class is extended. However, this class can not be extended.");
}
}
static void Main(string[] args)
{
//TestStruct structOne = new TestStruct();
TestStruct structOne;
structOne.Name = "Tim";
structOne.height = 10;
TestClass classOne = new TestClass();
// error
//TestClass classOne;
//classOne.Name = "Tim";
Console.WriteLine("Struct's base class is object: " + ((structOne is object) ? "Yes" : "No"));
Console.WriteLine("Class's base class is object: " + ((classOne is object) ? "Yes" : "No"));
ClassExtend classExtend = new ClassExtend();
structOne.Name = "Tim Changed";
classOne.Name = "Tim Changed";
Console.WriteLine("Test to change struct variable,name is changed: " + (structOne.Name == "Tim Changed" ? "Yes" : "No") + " Name: " + structOne.Name);
Console.WriteLine("Test to change class variable, name is changed: " + (classOne.Name == "Tim Changed" ? "Yes" : "No") + " Name: " + classOne.Name);
Console.ReadKey();
}
}
}
聯(lián)系方式

個人微信

公眾號_DotNet微說.jpg