基礎題一

小脑虎爱学习發表於2024-08-20

每次看到你,我都會覺得心裡很甜,因為是你,讓我覺得世界都變得如此美好。 --zhu

1、C#中堆和棧的區別

棧:由編譯器自動分配、釋放。在函式體中定義的變數通常在棧上。
堆:一般由程式設計師分配釋放。用new、malloc等分配記憶體函式分配得到的就是在堆上。

棧:存放在棧中時要管儲存順序,保持著先進後出的原則,他是一片連續的記憶體域,有系統自動分配和維護;
堆:無序,是不連續的記憶體域,有使用者自己來控制和釋放,如果使用者自己不釋放,當記憶體達到一定值,透過垃圾回收器(GC)回收。
棧記憶體無需使用者管理,不受GC管理。當棧頂元素使用完立馬釋放。堆則需要GC清理。
使用引用型別的時候,一般是對指標的操作而非引用型別本身。值型別則操作本身。

2、C#中的委託是什麼?事件是不是一種委託

委託本質是一個類,委託是將一種方法作為引數代入到另一個方法。委託允許你將方法作為引數傳遞給其他方法,或者將方法作為回撥方法儲存在委託變數中。

public delegate void MyDelegate(string message);

事件(Event)是基於委託的一種特殊用法,它用於實現釋出-訂閱模式。事件允許物件向多個訂閱者通知其狀態的改變。事件本質上是一個具有特定簽名的多播委託。當事件發生時,所有訂閱了該事件的方法都會被呼叫。

public class EventPublisher
{
    // 宣告一個事件
    public event EventHandler MyEvent;

    // 觸發事件
    protected virtual void OnMyEvent()
    {
        MyEvent?.Invoke(this, EventArgs.Empty);
    }
}

public class EventSubscriber
{
    public void Subscribe(EventPublisher publisher)
    {
        publisher.MyEvent += new EventHandler(EventHandlerMethod);
    }

    private void EventHandlerMethod(object sender, EventArgs e)
    {
        // 事件處理邏輯
    }
}

3、C#靜態建構函式特點是什麼

最先被執行的建構函式,且一個類只允許有一個無參的靜態建構函式。
執行順序:靜態變數>靜態建構函式>例項變數>例項建構函式

4、CTS、CLS、CLR分別作何解釋

CTS(Common Type System) :公共型別系統。
是.NET框架中定義所有資料型別的基礎結構。定義了一套統一的資料型別規範:Int32、Int->string、Boolean->bool。

CLS(Common Language Specification) :公共語言規範。
是CTS的一個子集,它定義了一組規則,確保不同語言編寫的程式能夠在.NET環境中無縫協作。CLS規定了哪些特性是所有.NET語言都必須支援的,比如基本的資料型別、繼承、介面等。如果一個語言完全遵循了CLS,那麼用這個語言編寫的程式就可以與其他遵循CLS的語言編寫的程式一起工作,而不會存在相容性問題。

CLR(Common Language Runtime):公共語言執行時。CLR是.NET框架的核心元件,提供了程式碼執行和管理的環境。負責程式碼的編譯(JIT編譯)、執行、垃圾回收、異常處理、安全性等。

5、C#中什麼是值型別和引用型別

值型別:直接儲存資料值。包括:struct,enum,int,float,char,bool,decimal。可以分配在棧上,減少垃圾回收。
引用型別:儲存對資料的引用,而不是資料本身。包括:class,delegate,interface,array,object,string。分配在堆上,可能需要GC進行管理。

6、請詳述在C#中類(class)與結構(struct)的異同

1)記憶體管理:
類:是引用型別,儲存在堆(Heap)上。類的例項化需要分配堆記憶體,並使用引用(指標)訪問。
結構:是值型別,儲存在棧(Stack)上。結構的例項化直接分配在棧上或被複制到區域性變數中。

2)預設值:
類:預設情況下,類的例項如果未顯式初始化,其引用將為 null。
結構:預設情況下,結構的所有欄位將自動初始化為其型別的零值。

3)建構函式:
類:可以有多個建構函式,用於不同的初始化方式。
結構:也可以有多個建構函式,但預設情況下會自動生成一個無引數的建構函式,將所有欄位初始化為零值。

4)賦值和複製:
類:賦值操作複製的是引用(指標),即使使用 == 比較兩個類的例項,比較的也是它們引用的記憶體地址。
結構:賦值操作建立的是結構的副本,使用 == 比較結構例項時,實際上是在比較它們的欄位值。

5)使用場景:
類:適用於建立具有複雜行為的物件,或者需要繼承和多型特性的場景。
結構:適用於儲存輕量級資料,且不需要繼承和多型特性的場景

7、new關鍵字的作用

運算子:建立物件例項
修飾符:在派生類定義一個重名的方法,隱藏掉基類方法
約束:泛型約束定義,約束可使用的泛型型別。

8、int?和int有什麼區別

int?為可空型別,預設值可以是null
int預設值是0
int?是透過int裝箱為引用型別實現

9、C#中值傳遞與引用傳遞的區別是什麼

值傳遞時,系統首先為被呼叫方法的形參分配記憶體空間,並將實參的值按位置一一對應複製給形參,此後,被呼叫方法中形參值得任何改變都不會影響到相應的實參。

引用傳遞時,系統不是將實參本身值複製後傳遞給形參,而是將其引用值(即地址值)傳遞給形參,因此,形參所引用的該地址上的變數與傳遞的實參相同,方法體內相應形參值得任何改變都將影響到作為引用傳遞的實參。
可以透過ref和out來決定引數是否按照引用傳遞。

10、C#中引數傳遞ref與out的區別

1)ref指定的引數在函式呼叫時必須先初始化(但這是從C# 7.0開始的要求),而out不用。
2)out指定的引數在進入函式時會清空自己,因此必須在函式內部進行初始化賦值操作,而ref不用
總結:ref可以把值傳到方法裡,也可以把值傳到方法外;out只可以把值傳到方法外。

11、C#中什麼是裝箱和拆箱

裝箱:把值型別轉換成引用型別
拆箱:把引用型別轉換成值型別
在裝箱時不需要顯示型別轉換,拆箱需要顯式的型別轉換。
int i=0;
System.Object obj=i;//裝箱
int j=(int)obj;//拆箱

12.C#實現多型的過程中overload過載與override重寫的區別

過載:是方法的名稱相同,引數或引數型別不同,進行多次過載以適應不同的需要;過載是程序導向的概念。
重寫:是對基類中虛方法進行重寫。重寫是面對物件的概念。

13、C#中static關鍵字的作用

對類有意義的欄位和方法使用static關鍵字修飾,稱為靜態成員,透過類名加訪問運算子"."進行訪問;對類的例項有意義的欄位和方法不加static關鍵字,則稱為非靜態成員或例項成員。
注:靜態欄位在記憶體中只有一個複製,非靜態欄位則是在每個例項物件中擁有一個複製。而方法無論是否為靜態,在記憶體中自會有一份複製,區別只是透過類名來訪問還是透過例項名訪問。

14、C#成員變數和成員函式前加static的作用

它們被稱為常成員變數和常成員函式,又稱為類成員變數額類成員函式。
分別用來反映類的狀態。
比如類成員變數可以用來統計類例項的數量,類成員函式。負責這種統計的動作,不用new。

相關文章