1.C#中類是否支持多繼承雌续?請(qǐng)說明原因。
答:不支持,需要用接口來實(shí)現(xiàn)多繼承
2.我們都知道一個(gè)類可以有多個(gè)構(gòu)造函數(shù)瓣履,并且C#會(huì)在我們創(chuàng)建類的時(shí)候默認(rèn)的提供一個(gè)無參的構(gòu)造函數(shù),當(dāng)我實(shí)現(xiàn)了另外一個(gè)有參數(shù)的構(gòu)造函數(shù)的時(shí)候练俐,我還能調(diào)用無參數(shù)的構(gòu)造函數(shù)嗎袖迎?請(qǐng)說明原因。
答:不能痰洒,因?yàn)橐坏┠銓?shí)現(xiàn)了一個(gè)構(gòu)造函數(shù)瓢棒,C#就不會(huì)再提供默認(rèn)的構(gòu)造函數(shù)了,所以需要自己手動(dòng)寫入一個(gè)無參數(shù)的構(gòu)造函數(shù)丘喻。
3.請(qǐng)簡(jiǎn)略描述重載和重寫的區(qū)別脯宿?
答:方法重載提供了一個(gè)相同的方法但是方法簽名的參數(shù)不同的調(diào)用的實(shí)現(xiàn)。
重寫提供了子類中改變父類方法行為的實(shí)現(xiàn)泉粉。
4.請(qǐng)問能設(shè)置類A可被繼承连霉,但類A中的某個(gè)方法不能被重寫嗎?
答:能嗡靡,將類A的修飾符標(biāo)記為public跺撼、標(biāo)記類A中的不允許重寫的方法為sealed
sealed關(guān)鍵字不僅可以限制類,也可以限制方法讨彼。
5.const和readonly有什么區(qū)別歉井?
答:const關(guān)鍵字用來聲明編譯時(shí)的常量
readonly用來聲明運(yùn)行時(shí)的常量
6.什么時(shí)候必須聲明一個(gè)類為抽象類?
答:(1)當(dāng)這個(gè)類中有抽象方法的時(shí)候哈误,必須聲明類為抽象類
(2)該類沒有完全實(shí)現(xiàn)父類的抽象方法時(shí)哩至,也需要聲明為抽象類
7.接口和抽象類的區(qū)別是什么躏嚎?
答:接口中所有的方法都不能有實(shí)現(xiàn),并且不能指定方法的修飾符
抽象類中可以有方法的實(shí)現(xiàn)菩貌,也可以指定方法的訪問修飾符
第一個(gè)繼承接口的類必須實(shí)現(xiàn)接口里的所有方法
而抽象類中抽象方法的實(shí)現(xiàn)是由第一個(gè)非抽象的派生類來實(shí)現(xiàn)
8.類的私有成員會(huì)被子類繼承嗎卢佣?請(qǐng)說明原因。
答:會(huì)被子類繼承箭阶,但是不能被訪問虚茶。所以看上去是不能被繼承的,實(shí)際上確實(shí)被繼承了仇参。
9.請(qǐng)寫出C#中的單例模式
答:
public class Single
{
private static Single instance;
private Single (){}
public static Single GetInstance ()
{
if (instance == null) {
instance = new Single ();
}
return instance;
}
}
10.現(xiàn)有一個(gè)整數(shù)number嘹叫,請(qǐng)寫一個(gè)方法判斷這個(gè)整數(shù)是否是2的N次方
答:
private static bool GetFlag(int num)
{
if (num < 1) return false;
return (num & num - 1) == 0;
}
11.追加一個(gè)雙重鎖定的單例模式
using System;
using System.Collections.Generic;
/// <summary>
/// 適用于在多線程的情況下保證只有一個(gè)實(shí)例化對(duì)象的情況,例如銀行的操作系統(tǒng)
/// </summary>
namespace DoubleLockInstance
{
//----------------------------------
// 雙重鎖定單例
public sealed class Singleton
{
// 定義一個(gè)類對(duì)象冈敛,用于內(nèi)部實(shí)現(xiàn)
private static Singleton myInstance;
// readonly - 這個(gè)成員只能在“類初始化”時(shí)賦值 ,所謂的類初始化待笑,就是直接在類里面初始化
// 變量標(biāo)記為 readonly,第一次引用類的成員時(shí)創(chuàng)建實(shí)例
private static readonly object lockRoot = new object ();
// 設(shè)置構(gòu)造方法為私有抓谴,這樣就不能在外部實(shí)例化類對(duì)象了
private Singleton ()
{
}
// 實(shí)例化對(duì)象的方法
public static Singleton GetInstance ()
{
// 外部不能實(shí)例化對(duì)象暮蹂,但是能調(diào)用類里面的靜態(tài)方法
// 外部需要調(diào)用這個(gè)方法來使用類對(duì)象,如果對(duì)象不存在就創(chuàng)建
// 這里面使用兩個(gè)判斷是否為null的原因是癌压,我們不需要每次都對(duì)實(shí)例化的語句進(jìn)行加鎖仰泻,只有當(dāng)對(duì)象不存在的時(shí)候加鎖就可以了
if (myInstance == null) {
// 鎖定的作用就是為了保證當(dāng)多線程同時(shí)執(zhí)行這句代碼的時(shí)候保證對(duì)象的唯一性
// 鎖定會(huì)讓同時(shí)執(zhí)行這段代碼的線程排隊(duì)執(zhí)行
// lock里面需要用一個(gè)已經(jīng)存在的對(duì)象來判斷,所以不能使用myInstance
lock (lockRoot) {
// 這里還需要一個(gè)判斷的原因是滩届,如果多線程都通過了外層的判斷進(jìn)行排隊(duì)
// 那將會(huì)實(shí)例化多個(gè)對(duì)象出來集侯,所以這里還需要進(jìn)行一次判斷,保證線程的安全
if (myInstance == null) {
myInstance = new Singleton ();
}
}
}
return myInstance;
}
}
}