日常問題總結 一
#堆和棧的區別
棧是編譯期間就分配好的空間,因此在代碼中必須就棧的大小有明確的定義。局部值類型變量、值類型參數等都在棧內存中。堆是程序運行期間動態分配的內存空間,可以根據程序的運行情況調整分配的堆內存大小。
#下面程序的執行結果?
inti = 10;
Console.WriteLine(i++);=>10
Console.WriteLine(++i);=>12
i++表達式的值為i自增之前的值,所以打印10,執行完成後i變成11,執行++i的時候表達式的值為自增以後的值12。
#在dotnet中類(class)與結構(struct)的異同?
Class可以被實例化,屬於引用類型,是分配在內存的堆上的,引用傳遞。Struct屬於值類型,是分配在內存的棧上的,復制傳遞。Int32、Boolean等都屬於結構體。
#請敘述屬性與索引器的區別
屬性通過名稱標識。索引器通過簽名標識。屬性通過簡單名稱或成員訪問來訪問。索引器通過元素訪問來訪問。屬性可以為靜態成員或實例成員。索引器必須為實例成員。屬性的get訪問器沒有參數。 索引器的get訪問器具有與索引器相同的形參表。屬性的set訪問器包含隱式value參數。除了value參數外,索引器的set訪問器還具有與索引器相同的形參表。
# C#中的接口和類有什麽異同
實例化、繼承、成員方面
# 抽象類和接口的異同
相同點: 都不能被直接實例化,都可以通過繼承實現其抽象方法。
不同點: 接口支持多繼承;抽象類不能實現多繼承。接口只能定義行為;抽象類既可以定義行為,還可能提供實現。 接口只包含方法(Method)、屬性(Property)、索引器(Index)、事件(Event)的簽名,但不能定義字段和包含實現的方法;抽象類可以定義字段、屬性、包含有實現的方法。
#虛方法的使用場合、與接口的區別
子類重新定義父類的某一個方法時,必須把父類的方法定義為virtual。在定義接口中不能有方法體,虛方法可以。實現時,子類可以不重新定義虛方法,但如果一個類繼承接口,那必須實現這個接口。
#C#中的委托是什麽,事件和委托的關系。
委托可以理解為函數指針。委托和事件沒有可比性,因為委托是類型,事件是對象,下面說的是委托的對象(用委托方式實現的事件)和(標準的event方式實現)事件的區別。事件的內部是用委托實現的。因為對於事件來講,外部只能“註冊自己+=、註銷自己-=”,外界不可以註銷其他的註冊者,外界不可以主動觸發事件,因此如果用Delegate就沒法進行上面的控制,因此誕生了事件這種語法。事件是用來閹割委托實例的,類比用一個自定義類閹割List。事件只能add、remove自己,不能賦值,事件內部就是一個private的委托和add、remove兩個方法
#能用foreach遍歷訪問的對象的要求
需要實現IEnumerable接口或聲明GetEnumerator方法的類型。
#using關鍵字有什麽用?什麽是IDisposable?
using可以聲明namespace的引入,還可以實現非托管資源的釋放。實現了IDisposiable的類在using中創建,using結束後會自動調用該對象的Dispose方法,釋放資源。using用於資源釋放時,等價於try……finally。
#WebService基本概念
WebService解決的三個問題:接口的自我描述;采用Http協議等常規協議,不用寫原始的Socket;基於Web服務器,不占用80端口之外的端口。
UDDI(Universal Description Discovery and Integration)用來自動發現WebService的協議。
WSDL(WebService Defination Language)是對WebService上的方法名、參數進行描述的協議。對接口的自描述。
SOAP(Simple Object Access Protocol)是對參數、返回值以什麽樣的格式進行傳遞進行描述的協議,是對報文的格式規範。
SOAP和HTTP的關系:SOAP基於Http協議的,和普通網頁不同的是網頁返回HTML,SOAP則是符合SOAP協議的XML數據。
#橫縱表轉換
縱表結構 TableA
Name |
Course |
Grade |
張三 |
語文 |
75 |
張三 |
數學 |
80 |
張三 |
英語 |
90 |
李四 |
語文 |
95 |
李四 |
數學 |
55 |
橫表結構 TableB
Name |
語文 |
數學 |
英語 |
張三 |
75 |
80 |
90 |
李四 |
95 |
55 |
0 |
縱表轉橫表:
selectName,
sum(caseCourse when ‘語文‘ then Grade else 0 end) as Chinese,
sum(caseCourse when ‘數學‘ then Grade else 0 end) as Math,
sum(caseCourse when ‘英語‘ then Grade else 0 end) as English
fromTableA
groupby Name
橫表轉縱表:
select* from
(
select Name,Course=‘語文‘,Grade=Chinese fromTableB
union
select Name,Course=‘數學‘,Grade=Math fromTableB
union
select Name,Course=‘英語‘,Grade=English fromTableB
) awhere grade!=0
orderby Name,Grade desc
#刪除姓名、年齡重復的記錄,只保留ID最大的一條
1 tom 18 3000
2 tom 18 3300
3 gal 28 2000
4 tim 28 2200
5 gal 28 2020
select* from T_Duplicate where ID in
(
select MAX(id) from T_Duplicate
group by name,age
)
日常問題總結 一