C#基礎(chǔ)面試題

1.簡(jiǎn)述private、protected、pubic、internal修飾符的訪(fǎng)問(wèn)權(quán)限

答:

  • private : 私有成員, 在類(lèi)的內(nèi)部才可以訪(fǎng)問(wèn)(只能從其聲明上下文中進(jìn)行訪(fǎng)問(wèn))
  • protected : 保護(hù)成員,該類(lèi)內(nèi)部和從該類(lèi)派生的類(lèi)中可以訪(fǎng)問(wèn)
  • Friend:友元 ,聲明 friend 元素的程序集中的代碼可以訪(fǎng)問(wèn)該元素,而不能從程序集外部訪(fǎng)問(wèn)
  • Protected Friend:在派生類(lèi)或同一程序集內(nèi)都可以訪(fǎng)問(wèn)
  • public : 公共成員,完全公開(kāi),沒(méi)有訪(fǎng)問(wèn)限制
  • internal: 在同一命名空間內(nèi)可以訪(fǎng)問(wèn)

2.C#中的委托是什么?事件是不是一種委托?

答:
委托是將一種方法作為參數(shù)代入到另一種方法。
是,事件是一種特殊的委托。 //比如:onclick事件中的參數(shù)就是一種方法。

3.實(shí)現(xiàn)多態(tài)的過(guò)程中 overload 重載 與override 重寫(xiě)的區(qū)別

答:
override 重寫(xiě)與 overload 重載的區(qū)別。重載是方法的名稱(chēng)相同。參數(shù)或參數(shù)類(lèi)型不同,進(jìn)行多次重載以適應(yīng)不同的需要 override 是進(jìn)行基類(lèi)中函數(shù)的重寫(xiě)。實(shí)現(xiàn)多態(tài)。

4.描述一下C#中索引器的實(shí)現(xiàn)過(guò)程,是否只能根據(jù)數(shù)字進(jìn)行索引

答:
C#通過(guò)提供索引器,可以象處理數(shù)組一樣處理對(duì)象。特別是屬性,每一個(gè)元素都以一個(gè)get或set方法暴露。索引器不單能索引數(shù)字(數(shù)組下標(biāo)),還能索引一些HASHMAP的字符串,所以,通常來(lái)說(shuō),C#中類(lèi)的索引器通常只有一個(gè),就是THIS,但也可以有無(wú)數(shù)個(gè),只要你的參數(shù)列表不同就可以了索引器和返回值無(wú)關(guān), 索引器最大的好處是使代碼看上去更自然,更符合實(shí)際的思考模式。

微軟官方一個(gè)示例:

索引器允許類(lèi)或結(jié)構(gòu)的實(shí)例按照與數(shù)組相同的方式進(jìn)行索引。
索引器類(lèi)似于屬性,不同之處在于它們的訪(fǎng)問(wèn)器采用參數(shù)。
在下面的示例中,定義了一個(gè)泛型類(lèi)(class SampleCollection<T>
),并為其提供了簡(jiǎn)單的 get 和 set訪(fǎng)問(wèn)器 方法(作為分配和檢索值的方法)。Program 類(lèi)為存儲(chǔ)字符串創(chuàng)建了此類(lèi)的一個(gè)實(shí)例。

class SampleCollection<T>
{
    private T[] arr = new T[100];
    public T this[int i]   //注意,定義索引器。this 關(guān)鍵字用于定義索引器。
    {
        get
        {
            return arr[i]; //訪(fǎng)問(wèn)器采用參數(shù)
        }
        set
        {
            arr[i] = value; //訪(fǎng)問(wèn)器采用參數(shù)
        }
    }
}
class Employee
    {
        public string firstName;
        public string middleName;
        public string lastName;

        public string this[string index]
        {
            set
            {
                switch (index)
                {
                    case "a":
                        firstName = value;
                        break;
                    case "b":
                        middleName = value;
                        break;
                    case "c":
                        lastName = value;
                        break;
                    default: throw new ArgumentOutOfRangeException("index");
                }
            }
            get
            {
                switch (index)
                {
                    case "a": return firstName;
                    case "b": return middleName;
                    case "c": return lastName;
                    default: throw new ArgumentOutOfRangeException("index");
                }
            }
        }
// This class shows how client code uses the indexer
class Program
{
    static void Main(string[] args)
    {
        SampleCollection<string> stringCollection = new SampleCollection<string>(); 
        stringCollection[0] = "Hello, World"; //這里 使用索引器進(jìn)行引用
        Console.WriteLine(stringCollection[0]);
        Employee ee = new Employee();
        ee.firstName = "胡";
        ee.middleName = "大";
        ee.lastName = "陽(yáng)";
        ee["a"] = "sa";
        Console.WriteLine("我的名字叫: {0}{1}{2}", ee["a"], ee["b"], ee["c"]);

    }
}
  • 索引器使得對(duì)象可按照與數(shù)組相似的方法進(jìn)行索引。

  • get 訪(fǎng)問(wèn)器返回值。set 訪(fǎng)問(wèn)器分配值。

  • this關(guān)鍵字用于定義索引器。

  • value關(guān)鍵字用于定義由 set 索引器分配的值。

  • 索引器不必根據(jù)整數(shù)值進(jìn)行索引,由您決定如何定義特定的查找機(jī)制。

  • 索引器可被重載。

  • 索引器可以有多個(gè)形參,例如當(dāng)訪(fǎng)問(wèn)二維數(shù)組時(shí)。

5.什么是裝箱和拆箱?

答:
裝箱就是隱式的將一個(gè)值型轉(zhuǎn)換為引用型對(duì)象。
拆箱就是將一個(gè)引用型對(duì)象轉(zhuǎn)換成任意值型。

int i=0;
System.Object obj=i; //這個(gè)過(guò)程就是裝箱!就是將 i 裝箱!
int j=(int)obj;//這個(gè)過(guò)程 obj 拆箱!

6.什么是受管制(托管)的代碼?

答:
托管代碼是運(yùn)行.NET 公共語(yǔ)言運(yùn)行時(shí)CLR的代碼
unsafe:非托管代碼。不經(jīng)過(guò)CLR運(yùn)行。程序員自行分配和釋放內(nèi)存空間

7.ADO.Net中常用的對(duì)象有哪些?分別描述一下答

答:

  • DataSet:數(shù)據(jù)集。
  • DataCommand:執(zhí)行語(yǔ)句命令。
  • DataAdapter:數(shù)據(jù)的集合,用語(yǔ)填充。
  • DataReader:數(shù)據(jù)只讀器
  • Connection 數(shù)據(jù)庫(kù)連接對(duì)像
  • Command 數(shù)據(jù)庫(kù)命令

8.什么是Code-Behind技術(shù)?

答:代碼后置

在.net中,配件的意思是?

答:程序集。(中間語(yǔ)言,源數(shù)據(jù),資源,裝配清單)

9.常用的調(diào)用WebService的方法有哪些?

答:
1.使用WSDL.exe命令行工具。
2.使用VS.NET中的Add Web Reference菜單選項(xiàng)

10.在C#中,string str1 = null 與 string str2 =""請(qǐng)盡量使用文字或圖象說(shuō)明其中的區(qū)別

答:string str1 = null 是不給他分配內(nèi)存空間,而string str2 = "" 給它分配長(zhǎng)度為空字符串的內(nèi)存空間,因此str1還不是一個(gè)實(shí)例化的對(duì)象,而str2已經(jīng)實(shí)例化
注意null不是對(duì)象,""是對(duì)象

11.請(qǐng)?jiān)斒鲈贑#中類(lèi)(class)與結(jié)構(gòu)(struct)的異同?

答:class可以被實(shí)例化,屬于引用類(lèi)型,class可以實(shí)現(xiàn)接口和單繼承其他類(lèi),還可以作為基類(lèi)型,是分配在內(nèi)存的堆上的struct屬于值類(lèi)型,不能作為基類(lèi)型,但是可以實(shí)現(xiàn)接口,是分配在內(nèi)存的棧上的.

12.GC是什么? 為什么要有GC?


GC是垃圾收集器。程序員不用擔(dān)心內(nèi)存管理,因?yàn)槔占鲿?huì)自動(dòng)進(jìn)行管理。要請(qǐng)求垃圾收集,可以調(diào)用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()

13.String s = new String("xyz");創(chuàng)建了幾個(gè)String Object?


兩個(gè)對(duì)象,一個(gè)是“xyx”,一個(gè)是指向“xyx”的引用對(duì)象s。

14.abstract class和interface有什么區(qū)別?

答:

  • abstract class
    abstract 聲明抽象類(lèi)抽象方法,一個(gè)類(lèi)中有抽象方法,那么這個(gè)類(lèi)就是抽象類(lèi)了。所謂的抽象方法,就是不含主體(不提供實(shí)現(xiàn)方法),必須由繼承者重寫(xiě)。因此,抽象類(lèi)不可實(shí)例化,只能通過(guò)繼承被子類(lèi)重寫(xiě)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication1
{
    public abstract class Bus
    {
        public abstract void getName();  //抽象方法
        public virtual void getTypes() //虛方法
        {
            Console.WriteLine("bus");
        }
        public void getID()//一般方法,若在派生類(lèi)中重寫(xiě),須使用new關(guān)鍵字
        {
            Console.WriteLine("滬A 00000");
        }
    }
    public class car : Bus
    {
        public override void getName() //繼承抽象類(lèi),重新抽象方法
        {
            Console.WriteLine("奧迪");
        }
        public override void getTypes()//繼承抽象類(lèi),重新虛方法
        {
            Console.WriteLine("car");
        }
    }
    class Program
    {
       
        static void Main(string[] args)
        {
            car mycar = new car();
            mycar.getName();
            mycar.getTypes();
            mycar.getID();
        }    
    }
 }

輸出:
奧迪
car
滬A 00000

  • interface
    聲明接口,只提供一些方法規(guī)約,不提供任何實(shí)現(xiàn);不能用public、abstract等修飾,無(wú)字段、常量,無(wú)構(gòu)造函數(shù)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication1
{
    public interface IBus
    {
        void getTypes();
    }
    public interface IPlane
    {
        void getfunc();
    }
    public class Car : IBus,IPlane
    {
        
        public void getTypes()
        {
            Console.WriteLine("car");
        }
        public void getfunc()
        {
            Console.WriteLine("fly");
        }
    }
    class Program
    {
       
        static void Main(string[] args)
        {
            Car  mycar = new Car ();
            mycar.getTypes();
            mycar.getfunc();
        }    
    }
}

輸出結(jié)果:
car
fly

  • 區(qū)別
    1.interface中不能有字段,而abstract class可以有;
    2.interface中不能有public等修飾符,而abstract class 可以有。
    3.interface 可以實(shí)現(xiàn)多繼承

15..try {}里有一個(gè)return語(yǔ)句,那么緊跟在這個(gè)try后的finally {}里的code會(huì)不會(huì)被執(zhí)行,什么時(shí)候被執(zhí)行,在return前還是后?

答:會(huì)執(zhí)行,在return前執(zhí)行。

16.C#中equal與==的區(qū)別

答:C#中,判斷相等有兩種方式,一種是傳統(tǒng)的==操作,一種是object提供的Equals方法。二者的區(qū)別在于:
一、==操作符判斷的是堆棧中的值,Equlas判斷的是堆中的值
C#提供值類(lèi)型和引用類(lèi)型,值類(lèi)型存儲(chǔ)在棧上,故用==判斷是直接判斷其值是否相等,因?yàn)橹殿?lèi)型不存在堆中的數(shù)據(jù),因此值類(lèi)型的Equals也是判斷數(shù)據(jù)。即,對(duì)于值類(lèi)型而言,==與Equals相同,均是判斷其值是否相等。

對(duì)于引用類(lèi)型而言,其棧中存儲(chǔ)的是對(duì)象的地址,那么==就是比較兩個(gè)地址是否相等,即是否指向同一個(gè)對(duì)象;Equals函數(shù)則是比較兩個(gè)對(duì)象在堆中的數(shù)據(jù)是否一樣,即兩個(gè)引用類(lèi)型是否是對(duì)同一個(gè)對(duì)象的引用。
二、String類(lèi)型特殊
String類(lèi)型雖然是引用類(lèi)型,但是對(duì)String對(duì)象的賦值卻按照值類(lèi)型操作。
例如:
String s1="hello";
String s2="hello";
對(duì)s2初始化的時(shí)候,并沒(méi)有重新開(kāi)辟內(nèi)存,而是直接將其地址指向s1的內(nèi)容“hello”。這樣一來(lái),string類(lèi)型雖然是引用類(lèi)型,但是其==操作和Equals操作都是一樣的,均比較值是否相等。
三、與GetHashCode()的關(guān)系
若兩對(duì)象Equals相等,那么其GetHashCode()必定相等;但是反過(guò)來(lái),若GetHashCode()相等,那么這兩個(gè)對(duì)象Equals方法比較結(jié)果不一定相同。(為了獲取最佳性能,hash函數(shù)為對(duì)象內(nèi)容生成的數(shù)字是隨機(jī)分布的,這就意味著,內(nèi)容不同的對(duì)象,有可能生成的數(shù)字是一樣的,但可以認(rèn)為這種概率非常?。?br> 下面示例說(shuō)明:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class People
    {
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public People(string name)
        {
            this.name = name;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
           string a = "hello";
            string b = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
            Console.WriteLine(a == b); //True
            Console.WriteLine(a.Equals(b));//True
            Console.WriteLine("*********");
            int m = 3;
            int n = 3;
            Console.WriteLine(n == m);//True
            Console.WriteLine(n.Equals(m));//True
            Console.WriteLine("*********");
            object g = a;
            object h = b;
            Console.WriteLine(g == h);//False
            Console.WriteLine(g.Equals(h));//True
            Console.WriteLine(g.GetHashCode() + "   " + h.GetHashCode()); //1025947313   1025947313
            Console.WriteLine("*********");
            People p1 = new People("Jimmy");
            People p2 = new People("Jimmy");
            Console.WriteLine(p1 == p2); //False
            Console.WriteLine(p1.Equals(p2)); //False
            Console.WriteLine(p1.GetHashCode() + "  " + p2.GetHashCode());//43495525  55915408
            Console.WriteLine("*********");
            People p3 = new People("Jimmy");
            People p4 = p3;
            Console.WriteLine(p3 == p4);//True
            Console.WriteLine(p3.Equals(p4));//True

        }
    }
}

在C#中,string 類(lèi)型的特點(diǎn)有:
(1)屬于基本數(shù)據(jù)類(lèi)型;
(2)是引用類(lèi)型;
(3)只讀;
(4) string a="1123"; string b="1123";
那么a和b指向同一個(gè)內(nèi)存地址;
但是并非2個(gè)相同值相等的字符串就對(duì)應(yīng)同一個(gè)內(nèi)存地址;

17.進(jìn)程和線(xiàn)程的區(qū)別?

答:進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的單位;線(xiàn)程是CPU調(diào)度和分派的單位,一個(gè)進(jìn)程可以有多個(gè)線(xiàn)程,這些線(xiàn)程共享這個(gè)進(jìn)程的資源。

18.堆和棧的區(qū)別?


棧:由編譯器自動(dòng)分配、釋放。在函數(shù)體中定義的變量通常在棧上。
堆:一般由程序員分配釋放。用new、malloc等分配內(nèi)存函數(shù)分配得到的就是在堆上。

19.請(qǐng)指出GAC的含義?

答:全局程序集緩存。

20:DataReader與Dataset有什么區(qū)別?

答:
DataReader和DataSet最大的區(qū)別在于,DataReader使用時(shí)始終占用SqlConnection,在線(xiàn)操作數(shù)據(jù)庫(kù).任何對(duì)SqlConnection的操作都會(huì)引發(fā)DataReader的異常.因?yàn)镈ataReader每次只在內(nèi)存中加載一條數(shù)據(jù),所以占用的內(nèi)存是很小的..因?yàn)镈ataReader的特殊性和高性能.所以DataReader是只進(jìn)的.你讀了第一條后就不能再去讀取第一條了. DataSet則是將數(shù)據(jù)一次性加載在內(nèi)存中.拋棄數(shù)據(jù)庫(kù)連接.讀取完畢即放棄數(shù)據(jù)庫(kù)連接.因?yàn)镈ataSet將數(shù)據(jù)全部加載在內(nèi)存中.所以比較消耗內(nèi)存.但是確比DataReader要靈活.可以動(dòng)態(tài)的添加行,列,數(shù)據(jù).對(duì)數(shù)據(jù)庫(kù)進(jìn)行回傳更新操作

21.在c#中using和new這兩個(gè)關(guān)鍵字有什么意義,請(qǐng)寫(xiě)出你所知道的意義

答:
using 引入名稱(chēng)空間或者使用非托管資源,使用完對(duì)象后自動(dòng)執(zhí)行實(shí)現(xiàn)了IDisposable接口的類(lèi)的Dispose方法
new 新建實(shí)例或者隱藏父類(lèi)方法

22.什么是虛函數(shù)?什么是抽象函數(shù)?

答:
虛函數(shù):沒(méi)有實(shí)現(xiàn)的,可由子類(lèi)繼承并重寫(xiě)的函數(shù)。Virtual CallSomeOne();
抽象函數(shù):規(guī)定其非虛子類(lèi)必須實(shí)現(xiàn)的函數(shù),必須被重寫(xiě)。public abstract void CallSomeOne();

23.什么是SOAP,有哪些應(yīng)用。

答:
simple object access protocal,簡(jiǎn)單對(duì)象接受協(xié)議.以xml為基本編碼結(jié)構(gòu),建立在已有通信協(xié)議上(如http,不過(guò)據(jù)說(shuō)ms在搞最底層的架構(gòu)在tcp/ip上的soap)的一種規(guī)范Web Service使用的協(xié)議

24.C#中 property 與 attribute的區(qū)別,他們各有什么用處,這種機(jī)制的好處在哪里?

答:
在C#中有兩個(gè)屬性,分別為Property和Attribute,

  • Property比較簡(jiǎn)單,就是我們常用的get和set,主要用于為類(lèi)中的private和protected變量提供讀取和設(shè)置的接口。
  • Attribute用來(lái)說(shuō)明這個(gè)事物的各種特征的一種描述。而Attribute就是干這事的。它允許你將信息與你定義的C#類(lèi)型相關(guān)聯(lián),作為類(lèi)型的標(biāo)注。這些信息是任意的,就是說(shuō),它不是由語(yǔ)言本身決定的,你可以隨意建立和關(guān)聯(lián)任何類(lèi)型的任何信息。你可以作用屬性定義設(shè)計(jì)時(shí)信息和運(yùn)行時(shí)信息,甚至是運(yùn)行時(shí)的行為特征。關(guān)鍵在于這些信息不僅可以被用戶(hù)取出來(lái)作為一種類(lèi)型的標(biāo)注,它更可以被編譯器所識(shí)別,作為編譯時(shí)的一種附屬條件參加程序的編譯。定義屬性:屬性實(shí)際上是一個(gè)派生自System.Attribute基類(lèi)的類(lèi)。System.Attribute類(lèi)含有幾個(gè)用于訪(fǎng)問(wèn)和檢查自定義屬性的方法。盡管你有權(quán)將任何類(lèi)定義為屬性,但是按照慣例來(lái)說(shuō),從System.Attribute派生類(lèi)是有意義的

25.用sealed修飾的類(lèi)有什么特點(diǎn)?

答:
密封,不能繼承。

26.大概描述一下ASP。NET服務(wù)器控件的生命周期


初始化 加載視圖狀態(tài) 處理回發(fā)數(shù)據(jù) 加載 發(fā)送回發(fā)更改通知 處理回發(fā)事件 預(yù)呈現(xiàn) 保存狀態(tài) 呈現(xiàn) 處置 卸載

27.&和&&的區(qū)別


&是位運(yùn)算符,表示按位與運(yùn)算,&&是邏輯運(yùn)算符,表示邏輯與(and).

27.列舉ASP.NET 頁(yè)面之間傳遞值的幾種方式

  • 使用QueryString, 如...?id=1; response.Redirect()
  • 使用Session變量
  • 使用Server.Transfer (目前很少使用)
  • 使用Application
  • 使用Cache
  • 使用HttpContext的Item屬性
  • 使用文件
  • 使用數(shù)據(jù)庫(kù)
  • 使用Cookie

28. 什么叫做程序域?

答:應(yīng)用程序域可以理解為一種輕量級(jí)進(jìn)程。起到安全的作用,占用資源小

29. 什么是強(qiáng)命名程序集

答:程序集需要經(jīng)過(guò)加密簽名,強(qiáng)命名程序集可以部署到全局程序集緩存中,成為公共程序集

30.ASP.NET的身份驗(yàn)證方式有哪些?分別是什么原理

答:Windows(默認(rèn)) 用IIS控制
Form(窗體)用賬戶(hù)
Passport(密鑰)

31.分析以下代碼,完成填空

string strTmp = "abcdefg某某某";
int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;
int j= strTmp.Length;

以上代碼執(zhí)行完后,i= j=
答:i=13,j=10 (漢子占兩個(gè)字節(jié))

32. 根據(jù)線(xiàn)程安全的相關(guān)知識(shí),分析以下代碼,當(dāng)調(diào)用test方法時(shí),i>10 時(shí)是否會(huì)引起死鎖?

public void test(int i){
  lock(this){
      if(i>10){
      i--;
      test(i);
      }
  }
}

答:不會(huì)引起死鎖。因?yàn)閕nt是按值傳遞的,所以每次改變的只是一個(gè)副本,因此不會(huì)出現(xiàn)死鎖,但是如果換成object,那么就會(huì)發(fā)生死鎖

33. 簡(jiǎn)要談一下您對(duì)微軟.NET架構(gòu)下remoting和webservice兩項(xiàng)技術(shù)的理解以及實(shí)際中的應(yīng)用

答:remoting是利用TCP/IP,二進(jìn)制傳送提高效率。webservice 是利用http,穿透防火墻

34.啟動(dòng)一個(gè)線(xiàn)程用run()還是start()?

答:?jiǎn)?dòng)一個(gè)線(xiàn)程用start()方法,使線(xiàn)程所代表的虛擬處理機(jī)處于可運(yùn)行狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行,并不意味著線(xiàn)程就會(huì)立即運(yùn)行。run()方法可以產(chǎn)生必須退出的標(biāo)志來(lái)停止一個(gè)線(xiàn)程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容