2016-03-24 12:01:16 4104瀏覽
2016年最新C#面試題匯總及答案解答,希望對剛出來找工作的Android程序員有所幫助。
1、C#中類是否支持多繼承?請說明原因。
答:不支持,需要用接口來實現(xiàn)多繼承。
2、我們都知道一個類可以有多個構造函數(shù),并且C#會在我們創(chuàng)建類的時候默認的提供一個無參的構造函數(shù),當我實現(xiàn)了另外一個有參數(shù)的構造函數(shù)的時候,我還能調(diào)用無參數(shù)的構造函數(shù)嗎?請說明原因。
答:不能,因為一旦你實現(xiàn)了一個構造函數(shù),C#就不會再提供默認的構造函數(shù)了,所以需要自己手動寫入一個無參數(shù)的構造函數(shù)。
3、請簡略描述重載和重寫的區(qū)別?
答:方法重載提供了一個相同的方法但是方法簽名的參數(shù)不同的調(diào)用的實現(xiàn)。
重寫提供了子類中改變父類方法行為的實現(xiàn)。
4、請問能設置類A可被繼承,但類A中的某個方法不能被重寫嗎?
答:能,將類A的修飾符標記為public、標記類A中的不允許重寫的方法為sealed
sealed關鍵字不僅可以限制類,也可以限制方法。
5、const和readonly有什么區(qū)別?
答:const關鍵字用來聲明編譯時的常量
readonly用來聲明運行時的常量
6、什么時候必須聲明一個類為抽象類?
(1)當這個類中有抽象方法的時候,必須聲明類為抽象類
(2)該類沒有完全實現(xiàn)父類的抽象方法時,也需要聲明為抽象類
7、接口和抽象類的區(qū)別是什么?
答:接口中所有的方法都不能有實現(xiàn),并且不能指定方法的修飾符抽象類中可以有方法的實現(xiàn),也可以指定方法的訪問修飾符第一個繼承接口的類必須實現(xiàn)接口里的所有方法,而抽象類中抽象方法的實現(xiàn)是由第一個非抽象的派生類來實現(xiàn)。
8、類的私有成員會被子類繼承嗎?請說明原因。
答:會被子類繼承,但是不能被訪問。所以看上去是不能被繼承的,實際上確實被繼承了。
9、請寫出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)有一個整數(shù)number,請寫一個方法判斷這個整數(shù)是否是2的N次方
答:
private static bool GetFlag(int num)
{
if (num < 1) return false;
return (num & num - 1) == 0;
}
11、追加一個雙重鎖定的單例模式
[csharp] view plain[blog.csdn.net/sinat_20559947/article/details/48825209#] copy[blog.csdn.net/sinat_20559947/article/details/48825209#]
using System;
using System.Collections.Generic;
///
/// 適用于在多線程的情況下保證只有一個實例化對象的情況,例如銀行的操作系統(tǒng)
///
namespace DoubleLockInstance
{
//----------------------------------
// 雙重鎖定單例
public sealed class Singleton
{
// 定義一個類對象,用于內(nèi)部實現(xiàn)
private static Singleton myInstance;
// readonly - 這個成員只能在“類初始化”時賦值 ,所謂的類初始化,就是直接在類里面初始化
// 變量標記為 readonly,第一次引用類的成員時創(chuàng)建實例
private static readonly object lockRoot = new object ();
// 設置構造方法為私有,這樣就不能在外部實例化類對象了
private Singleton ()
{
}
// 實例化對象的方法
public static Singleton GetInstance ()
{
// 外部不能實例化對象,但是能調(diào)用類里面的靜態(tài)方法
// 外部需要調(diào)用這個方法來使用類對象,如果對象不存在就創(chuàng)建
// 這里面使用兩個判斷是否為null的原因是,我們不需要每次都對實例化的語句進行加鎖,只有當對象不存在的時候加鎖就可以了
if (myInstance == null) {
// 鎖定的作用就是為了保證當多線程同時執(zhí)行這句代碼的時候保證對象的唯一性
// 鎖定會讓同時執(zhí)行這段代碼的線程排隊執(zhí)行
// lock里面需要用一個已經(jīng)存在的對象來判斷,所以不能使用myInstance
lock (lockRoot) {
// 這里還需要一個判斷的原因是,如果多線程都通過了外層的判斷進行排隊
// 那將會實例化多個對象出來,所以這里還需要進行一次判斷,保證線程的安全
if (myInstance == null) {
myInstance = new Singleton ();
}
}
}
return myInstance;
}
}
}
最后想要了解更多關于面試題的文章,請關注扣丁學堂資訊欄目、微博、微博等平臺,站內(nèi)還有關于程序員的Android培訓視頻和iOS開發(fā)視頻供廣大學者學習。