【2017年新篇章】 .NET 面試題彙總(一)

本次給你們介紹的是我收集以及本身我的保存一些.NET面試題

簡介

  • 這次包含的不止是.NET知識,也包含少量前端知識以及.net面試時所涉及的種種考點,但願能給找工做的同窗們哪怕一點點幫助。
  • 古人云「溫故而知新,能夠爲師矣」,本人工做三年有餘,一直懶於寫博客,對已有的知識只存於雲筆記中,還自欺欺人覺得能加以善用,惋惜的是放到裏面就不會再看,存筆記的習慣是有了,然而卻少有回去翻看的習慣。長此以往,越堆越多,噁心循環,存的只是安心,而不是技術,爲此,我決定之後多寫博客,不只是存筆記,還得是整理併發出來,這樣才能真正地鞏固。
  • 本文面向的閱讀讀者是
    • [x] 剛畢業的萌新
    • [x] 工做不久換工做同窗
  • 大牛看到估計是下面這張圖的這個表情了,因此,能夠在評論區給給意見啦233。

image

廢話少說,直入正題:css

1.C# 值類型和引用類型的區別

區別 詳解
賦值時的區別 值類型的變量將直接得到一個真實的數據副本,初值爲0;而對引用類型的賦值僅僅是把對象的引用賦給變量,這樣就可能致使多個變量引用到一個實際對象實例上,初值爲null。
內存分配的區別 值類型的對象會在堆棧上分配內存,而引用類型的對象將會在堆上分配內存。堆棧的控件相對有限,但運行效率卻比堆高得多。
來自繼承結構的區別 因爲全部的值類型都有一個共同的基類:System.ValueType,因此值類型擁有一些引用類型不具備的共同性質。較爲重要的一點是值類型的比較方法Equals 方法的實現有了改變。全部的值類型已經實現了內容的比較,而引用類型在沒有重寫Equals方法的狀況下,仍然採用引用比較。

2.如何使得一個類型能夠在foreach 語句中使用

1.若要循環訪問集合,集合必須知足特定的要求。html

  • 例如,在下面的 foreach 語句中:
  • foreach (ItemType item in myCollection)
  • myCollection 必須知足下列要求:
  • 集合類型:
  • ①.必須是 interface、class 或 struct。
  • ②.必須包括返回類型的名爲 GetEnumerator 的實例方法,例如 Enumerator。
    Enumerator 類型(類或結構)必須包含:
    一個名爲 Current 的屬性,它返回 ItemType 或者能夠轉換爲此類型的類型。屬性訪問器返回集合的當前元素。
    一個名爲 MoveNext 的 bool 方法,它遞增項計數器並在集合中存在更多項時返回 true。

2.有三種使用集合的方法:前端

  1. 使用上述指導建立一個集合。此集合只能用於 C# 程序。
  2. 使用上述指導建立一個通常集合,另外實現 IEnumerable 接口。此集合可用於其餘語言(如 Visual Basic)。
  3. 在集合類中使用一個預約義的集合。

3.sealed修飾的類有什麼特色

  1. sealed 修飾符用於防止從所修飾的類派生出其它類。若是一個密封類被指定爲其餘類的基類,則會發生編譯時錯誤。
  2. 密封類不能同時爲抽象類。
  3. sealed 修飾符主要用於防止非有意的派生,可是它還能促使某些運行時優化。具體說來,因爲密封類永遠不會有任何派生類,因此對密封類的實例的虛擬函數成員的調用能夠轉換爲非虛擬調用來處理。
// cs_sealed_keyword.cs
using System;
sealed class SealedClass
{
    public int x;
    public int y;
}                               

class MainClass
{
    static void Main()
    {
        SealedClass sc = new SealedClass();
        sc.x = 110;             
        sc.y = 150;
        Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y);
    }
}

輸出
x = 110, y = 150
在前面的示例中,若是試圖經過使用下面的語句從密封類繼承:

class MyDerivedC: MyClass {} // Error 

將收到錯誤信息:

'MyDerivedC' cannot inherit from sealed class 'MyClass'.

4.面向對象的3個基本特徵

封裝

名詞 簡介
封裝 封裝是面向對象的特徵之一,是對象和類概念的主要特性。

封裝詳解:java

  • 也就是把客觀事物封裝成抽象的類,而且類能夠把本身的數據和方法只讓可信的類或者對象操做,對不可信的進行信息隱藏。程序員

    繼承

    名詞 簡介
    繼承 面向對象編程 (OOP) 語言的一個主要功能就是「繼承」。繼承是指這樣一種能力:它可使用現有類的全部功能,並在無需從新編寫原來的類的狀況下對這些功能進行擴展。

繼承詳解:web

  • 經過繼承建立的新類稱爲「子類」或「派生類」。
  • 被繼承的類稱爲「基類」、「父類」或「超類」。
  • 繼承的過程,就是從通常到特殊的過程。
  • 要實現繼承,能夠經過「繼承」(Inheritance)和「組合」(Composition)來實現。在某些 OOP 語言中,一個子類能夠繼承多個基類。可是通常狀況下,一個子類只能有一個基類,要實現多重繼承,能夠經過多級繼承來實現。

繼承概念的實現方式有三類實現繼承、接口繼承和可視繼承面試

  1. 實現繼承是指使用基類的屬性和方法而無需額外編碼的能力;
  2. 接口繼承是指僅使用屬性和方法的名稱、可是子類必須提供實現的能力;
  3. 可視繼承是指子窗體(類)使用基窗體(類)的外觀和實現代碼的能力。
  4. 在考慮使用繼承時,有一點須要注意,那就是兩個類之間的關係應該是「屬於」關係。例如,Employee 是一我的,Manager 也是一我的,所以這兩個類均可以繼承 Person 類。可是 Leg 類卻不能繼承 Person 類,由於腿並非一我的。
  5. 抽象類僅定義將由子類建立的通常屬性和方法,建立抽象類時,請使用關鍵字 Interface 而不是 Class。
    OO開發範式大體爲:劃分對象→抽象類→將類組織成爲層次化結構(繼承和合成) →用類與實例進行設計和實現幾個階段。

多態

名詞 簡介
多態 多態性(polymorphisn)是容許你將父對象設置成爲和一個或更多的他的子對象相等的技術,賦值以後,父對象就能夠根據當前賦值給它的子對象的特性以不一樣的方式運做。簡單的說,就是一句話:容許將子類類型的指針賦值給父類類型的指針。

實現多態,有二種方式,覆蓋,重載算法

  1. 覆蓋,是指子類從新定義父類的虛函數的作法。
  2. 重載,是指容許存在多個同名函數,而這些函數的參數表不一樣(或許參數個數不一樣,或許參數類型不一樣,或許二者都不一樣)。

那麼,多態的做用是什麼呢?數據庫

咱們知道,封裝能夠隱藏實現細節,使得代碼模塊化;繼承能夠擴展已存在的代碼模塊(類);它們的目的都是爲了——代碼重用。而多態則是爲了實現另外一個目的——接口重用!多態的做用,就是爲了類在繼承和派生的時候,保證使用「家譜」中任一類的實例的某一屬性時的正確調用。編程

5. .NET 託管資源與非託管資源

非託管資源

  • 最多見的一類非託管資源就是包裝操做系統資源的對象,例如文件,窗口或網絡鏈接,對於這類資源雖然垃圾回收器能夠跟蹤封裝非託管資源的對象的生存期,但它不瞭解具體如何清理這些資源。還好.net Framework提供了Finalize()方法,它容許在垃圾回收器回收該類資源時,適當的清理非託管資源。若是在MSDN Library 中搜索Finalize將會發現不少相似的主題,

    這裏列舉幾種常見的非託管資源:ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen,Regex,Socket,StreamWriter,Timer,Tooltip 等等資源。可能在使用的時候不少都沒有注意到!

託管資源

  • 像簡單的int,string,float,DateTime等等,.net中超過80%的資源都是託管資源。

6.string str=null與string str="" 有什麼區別

  • 你定義了一個變量的引用str

  • string str=null 把這個引用指向了一個null,沒有地址沒有值的地方,即沒分配內存空間

  • string str="" 把這個引用指向了一個地址,地址裏面存的是空的字符,即佔用了內存空間

7.StringBuilder有什麼做用

簡述:String 在進行運算時(如賦值、拼接等)會產生一個新的實例,而 StringBuilder 則不會。
因此在大量字符串拼接或頻繁對某一字符串進行操做時最好使用 StringBuilder,不要使用 String

另外,對於 String 咱們不得很少說幾句:

1.它是引用類型,在堆上分配內存

2.運算時會產生一個新的實例

3.String 對象一旦生成不可改變(Immutable)

4.定義相等運算符(== 和 !=)是爲了比較 String 對象(而不是引用)的值

總結
StringBuilder採用構造器設計模式的思想高效地構造一個字符串對象,在構造過程當中StringBuilder 能夠有效的避免臨時字符串對象的生成。一旦 StringBuilder的ToString方法被調用後,最終的字符串就被生成,而隨後的操做將致使一個新的字符串對象的分配。由於字符串對象的不可修改特性,StringBuilder還常常被用來和非託管代碼交互。

8.序列化有何做用

簡述:經過流類型能夠方便地操做各類字節流,但如何把現有的實例對象轉換爲方便傳輸的字節流,就須要用到序列化的技術。

9.Base64編碼用在何處

簡述:BASE64編碼是一種用於混淆明碼的編碼方式,其算法是把原先8位字節數組順序分配到新的6位字節數組中,再在每一個字節的高2位填充0來組成新的8位字節數組。.NET中Convert 類型能夠用來進行Base64字符串和8位字節數組之間的轉換。

10.字符串池是如何提升系統性能的?

簡述: 一旦使用了字符串池機制,當CLR啓動的時候,會在內部建立一個容器,容器的鍵是字符串內容,而值是字符串在託管堆上的引用。當一個新的字符串對象須要分配時,CLR首先檢測內部容器中是否已經包含了該字符對象,若是已經包含,則直接返回已經存在的字符串對象引用:若是不存在,則新分配一個字符串對象,同時把其添加到內部容器裏去。可是當程序用new關鍵字顯式地申明新分配的一個字符串對象時,該機制不會起做用。

11.FileInfo 和 DirectoryInfo

簡述: .NET 內建類型中提供了 FileInfo 和 DirectoryInfo 兩個類型,分別用來操做文件和文件夾。有別於 File 和 Directory 類型, FileInfo 和 Directory 主要的功能在於操做文件和文件夾在文件系統中的結構,完成諸如建立、複製、讀取信息、移動、判斷是否存在、刪除等功能。

12.DateTime.Parse(mystring) 這行代碼有什麼問題

簡述: 使用 TryParse 能夠避免異常。

示例
string time="2013-02-02";
DateTime t;
if(DateTime.TryParse(s,out t))
{
   //輸出
}

13.System.Object的三個比較方法異同

static bool ReferenceEquals(object A ,object B)
static bool Equals(object A ,object B)
virtual bool Equals(object obj)

1.ReferenceEquals 實現了類型的引用比較,從參數類型能夠看出,它不只能夠用來比較兩個引用類型對象,也能夠用來比較兩個值類型對象。
固然,ReferenceEquals 方法只有應用在引用類型上時纔會有意義,比較值類型的引用將永遠返回false,不管他們的值是否相等。甚至與下面的例子:
int i=0; Console.WriteLine(Object.ReferenceEquals(i,i));

解釋:由於上面的兩個i都是先進行裝箱,而後傳遞給ReferenceEquals 方法。

2.Equals 是另一個靜態比較方法,它實現的功能根據不一樣的類型而有所不一樣。事實上,Equals 方法的功能依靠了實例Equals 方法的實現,歸納地講,靜態 Equals 方法的內容分爲兩步:首先檢查兩個對象是否恆等 (==),而後調用其中一個參數對象的實例 Equals 方法來判斷兩個對象是否恆等。

14.GetHashCode 方法有何做用?何時會用到該方法

簡述

  • Object 中 GetHashCode 的算法保證了同一對象返回同一 HashCode ,而不一樣對象則返回不一樣的 HashCode,但對值類型等視內容相等的對象爲相等對象的類型時,默認的GetHashCode 算法並不正確。
  • 重寫 GetHashCode 必須保證同一對象不管什麼時候都返回同一 HashCode 值,而相等的對象也必須返回相同的值,而且在此基礎上,保證 HasCode 儘可能隨機地散列分佈。

15.委託的原理

簡述:委託是一類繼承自 System.Delegate的類型, 每一個委託對象至少包含了一個指向某個方法的指 針,該方法能夠是實例方法,也能夠是靜態方法。委託實現了回調方法的機制,可以幫助程序員 設計更加簡潔優美的面向對象程序。

16.委託回調靜態方法和實例方法有何區別

簡述:委託回調靜態方法和實例方法有何區別 當委託綁定靜態方法時,內部的對象成員變量 _target將會被設置成 null,而當委託綁定實例 方法時, _target 將會設置成指向該實例方法所屬類型的一個實例對象, 當委託被執行時, 該對象 實例將被用來調用實例方法。

17. 什麼是鏈式委託?

簡述:鏈式委託是指一個委託的鏈表,而不是指另外一類特殊的委託。 當執行鏈上的一個方法時,後續委託方法將會被依次執行。System.Multicast Delegate定 義了對鏈式委託的支持。在System.Delegate的基礎上,它增長了一個指向後續委託的指針,這樣就實現了一個簡單的鏈表結構。

18.ASP.NET 運行機制

1.瀏覽器和服務器的交互原理

  1. 通俗描述:咱們平時經過瀏覽器來訪問網站,其實就至關於你經過瀏覽器去訪問一臺電腦上訪問文件同樣,只不過瀏覽器的訪問請求是由被訪問的電腦上的一個 WEB服務器軟件來接收處理,它會分析接收到的請求信息,從而按照請求信息來找到服務器電腦上的文件,通過處理,最終將生成的內容發回到瀏覽器。
  2. 簡單的說就是:由瀏覽器生成一條「命令」,經過互聯網發給另外一臺電腦的某個軟件(服務器軟件);服務器軟件接收到「命令」,就分析理解這個「命令」,而後按照「命令」找到服務器電腦上的文件,將文件內容發送回瀏覽器。

image

  1. 經過上圖,咱們看到了瀏覽器和服務器交互的簡單過程。如今,咱們要想一想,瀏覽器和服務器軟件究竟是神馬東東,他們之間又是如何交互信息的呢?
  2. 其實,瀏覽器和服務器軟件,就是兩個獨立的應用程序(就如qq、office、畫圖工具同樣)。那麼兩個應用程序之間要交互信息,就牽扯到了應用程序通訊的問題。那他倆是使用神馬方式通訊的呢?
  • 答案是套接字:Socket。至於Socket的具體用法和原理,篇幅問題不在此文中寫了,先預留位置在這,下次補上《基於多線程和套接字的簡易WebServer軟件-沒有控件的ASP.NET》。
  • 瀏覽器和服務器軟件經過套接字來發送和接收對方的信息,但如今的關鍵問題是,他們發送和接收的究竟是什麼?--- 基於Http協議的報文數據(詳見《Http協議介紹---沒有控件的ASP.NET》)。
  • 也就是說:瀏覽器和服務器軟件其實就是兩個使用Socket進行通訊的的兩個應用程序:雙方都發送按照 Http協議語法規範組織的數據,接收到數據後都按照 Http協議語法規範來解釋。

    2.瀏覽器和IIS(or other webserver)交互機制

上圖就是IIS (服務器軟件)

1.瀏覽器和IIS交互過程:
咱們都知道,在互聯網上肯定一臺電腦的位置是使用IP尋址,但爲何當咱們平時訪問網站時直接輸入一個域名也可以訪問到某個服務器電腦進而由對方的服務器軟件發送響應頁面數據給我呢?下面我把簡單步驟列出:

(1)在瀏覽器輸入網址:www.oumind.com/index.html,瀏覽器按照Http協議語法 生成請求報文數據。

(2).瀏覽器檢查本機是否保存了www.oumind.com/index.html.域名對應的服務器IP地址。若是沒有,則發送請求到所在城市網中最近的DNS服務器(域名解析服務器),它會根據咱們發送來的域名查詢到該域名對應的服務器IP地址,併發送回瀏覽器。

(3)瀏覽器從DNS服務器得到了 www.oumind.com/index.html域名對應的服務器電腦IP,則將 請求報文 經過Socket發送到服務器電腦。(注意:Http協議 規定服務器軟件使用的默認端口是80,通俗的說,就是若是瀏覽器訪問一個網站頁面,瀏覽器默認就是將 請求報文 發送到服務器80端口,而服務器負責監聽這個端口的軟件通常就是服務器軟件—好比asp.net用的IIS,java用的Tomcat。)

(4)IIS接收到 請求報文,分析請求報文,從中獲取請求的頁面路徑 /index.html。判斷頁面的後綴名,若是是靜態頁面(.html/.jpg/.css/.js等),則直接由IIS軟件的組件讀取該文件內容,並將內容經過Socket發送回瀏覽器。

(5)但若是此時請求的是一個動態頁面(.aspx/.ashx),IIS本身就處理不了 (由於IIS軟件開發出來的時候,ASP.NET程序還不存在呢) 。因此,IIS就去它的 擴展程序映射表 中根據被請求文件後綴名 查看是否有可以處理這種文件的擴展程序。

而咱們ASPNET中經常使用的文件.aspx/.ashx等 對應的處理程序是aspnet_isapi.dll。以下圖:

(6)若是IIS根據後綴名找到對應的處理程序,則經過調用此程序來處理瀏覽器發送來的請求報文。

IIS自身是不能處理像ASPX擴 展名這樣的頁面,只能直接請求像HTML這樣的靜態文件,之因此能處理ASPX這樣擴展名的頁面,是由於IIS有一個ISAPI過濾器,它是一個COM組件。

ASP.NET服務在註冊到IIS的時候,就會添加一個Win32的擴展動態庫aspnet_isapi.dll。並將擴展能夠處理的頁面擴展名(如 ASPX)註冊到IIS裏面。擴展啓動後,就根據定義好的方式來處理IIS所不能處理的頁面。

當客戶端請求一個服務器資源時,這個HTTP請求會被inetinfo.exe進程截獲(www服務),而後Check請求資源的類型,並依據資源映射信息(存儲在IIS元庫中,一種IIS專用的配置數據庫)將請求的資源分配給特定的處理程序模塊。若請求的是靜態資源(img,text,html等)則由IIS處理(IIS在本地Web Server上訪問請求的文件),將內容輸出到控制檯,發出請求的瀏覽器就能接收到它了。

若須要在服務器端處理的請求,則會被傳到已註冊的擴展模塊 中,aspx請求會被分配給aspnet_isapi.dll,讓這個程序開始處理代碼,生成標準的HTML代碼,而後將這些HTML加入到原有的 HTML中,最後把完整的HTML返回給IIS,IIS再把內容發送到客戶瀏覽器。

ASP.NET FrameWork對請求的處理

上面說到IIS將像ASPX這樣的頁面分配給aspnet_isapi.dll,接着處理以下:

一、aspnet_isapi.dll則會 經過一個Http PipeLine的管道將這個Http請求發給w3wp.exe(iis 工做者進程,IIS6.0中叫作 w3wq.exe,IIS5.0中叫作 aspnet_wp.exe),以後asp.net framework就會經過HttpRuntime來處理這個Http請求。

二、HttpRuntime首先會肯定處理該請求的類名,HttpRuntime經過公共接口IHttpHandler來調用該類獲取被請求資源的類的實例。

三、調用HttpRuntime.ProcessRequest開始處理要發送到瀏覽器的頁面,具體說就是建立一個HttpContext實例,它封裝了全部與請求有關的http特有的信息,並初始化一個Write對象用於緩存標記代碼。

四、HttpRuntime使用上下文信息查找或新建能處理該請求的WEB應用程序的對象。由HttpApplication Factory負責返回HttpApplication實例。

五、HttpApplication實例會讀取web.config中全部HttpModule的配置。

六、HttpApplication對象使用IHttpHandlerFactory類型的實例返回HttpHandler(http處理程序)給HttpRuntime對象。一個頁面只是個http處理程序對象。
七、最後由HttpRuntime對象調用IHttpHandler的頁面對象的ProcessRequest方法。

19.C#中靜態變量和方法用什麼用處

1.靜態變量簡介

在C#程序中,沒有全局變量的概念,這意味着全部的成員變量只有該類的實例才能操做這些數據,這起到了「信息隱藏」的做用。但有些時候,這樣作卻不是個明智的選擇。

  • 假設咱們要定義一個圖書類,要求該類能保存圖書的數量,即每增長一本圖書(定義一個實例),圖書的數量應該加1。若是沒有靜態變量,咱們須要將圖書的數量保存在每本圖書(實例)裏,然而,這樣的變量要在不一樣圖書(實例)裏重複存儲,圖書(實例)數量少的話,咱們還能接受,若是圖書(實例)數量較多的話,好比成千上萬,咱們沒法想象這要形成多少資源(如內存、磁盤空間)的浪費,更讓人沒法忍受的是:由於圖書(實例)的數量要保存在每本圖書(實例)裏,該值確定是不一樣的。要使這些圖書(實例)中保存的圖書(實例)數量一致,咱們必須在每增長一本新書(生成一個新實例)時,修改其餘全部圖書(實例)中保存的該值。
  • Oh,My God!你會從新嚮往面向過程的程序設計方法,嚮往擁有全局變量的時代。但,這種局面不會出現,由於C#中爲你準備好了另一種變量類型:靜態變量。它在類中相似全局變量,保存類的公共信息,全部該類的實例(對象)共享該值。

靜態變量的聲明方式以下:

[訪問修飾符] static 數據類型 變量名;

這裏的訪問修飾符跟類的其它成員同樣,能夠是public,protected,private或internal等。

2.靜態變量又如何使用呢?

靜態變量必須使用類名來引用,而不能使用類的實例,由於,靜態變量不屬於任何實例,而是共有的。

  • 咱們能夠打個比方:在一個班級中,有些物品是我的的,咱們想使用時,必須指出物品的全部者,好比說「王三的自行車」,在C#程序中咱們可使用:王三.自行車的格式。有些物品是你們共有的物品,不能以我的名義使用,而是用班級的名義使用,好比班集體出資買的籃球,只能說:「班級的籃球」,而不能說:「王三的籃球」。這絕對是不行的,這對其餘人絕對是不公平的,咱們能夠聯想到許多貪官污吏就是使用了不屬於本身的東西,或以我的名義使用公家的東西而葬送了本身。
  • 說一句有用的就是:靜態變量是用類名來引用它。即:類名.靜態變量名;

舉個具體的例子以下:

using System;

class StaticVar
       {
              public int x;
              public static int y;
              public void PrintInfo()
             {
                    Console.WriteLine("非靜態變量x={0}",x);
                    Console.WriteLine("靜態變量y = {0}",y);
             }
        }
        class Test
        {
                  static void Main(string[] args)
                  {
                         StaticVar stv = new StaticVar();
                         stv.x = 10;
                          // stv.y = 20; //error;沒法使用實例引用訪問靜態成員「StaticVar.y」;改用類型名來限定它
                         StaticVar.y = 20;
                         stv.PrintInfo();
                   }
        }

程序中被註釋的部分:stv.y = 20是使用實例引用靜態變量,這將引起錯誤。

另外,我想說一句,對於靜態變量在聲明時,若是沒有給出初始值或使用前沒有賦任何值的話,系統會給他們一個默認值:對於整型數據默認值爲0;單精度數據爲:0.0f;雙精度數據爲0.0;布爾型數據爲False;引用型數據爲null。

3.靜態方法

靜態方法與靜態變量同樣,不屬於任何特定的實例,屬於類全體成員共有,由類名來調用。

但要注意如下幾點:

  1. 靜態方法只能訪問類的靜態成員,不能訪問類的非靜態成員;
  2. 非靜態方法能夠訪問類的靜態成員,也能夠訪問類的非靜態成員;
  3. 靜態方法不能使用實例來調用,只能使用類名來調用。

這裏用一個具體的例子來講明:

using System; 

namespace TestStatic
       {
              class StaticTest
              {
                     int x;
                     static int y;
                     public StaticTest(int a,int b)
                     {
                            x = a;
                            y = b;
                     }
                     public void SimplePrint()
                     {
                            Console.WriteLine("x="+x+",y="+y);
                     }
                     public static void StaticPrint()
                    {
                          Console.WriteLine("y={0}",y);
                         //  Console.WriteLine("x={0}",x);   //靜態方法中不能使用非靜態成員
                    }
            }
            class Test
            {
                    static void Main(string[] args)
                    {
                            StaticTest st = new StaticTest(10,23);
                            st.SimplePrint();
                            //st.StaticPrint();        //靜態方法不能使用實例來調用
                            StaticTest.StaticPrint();
                    }
             } 
       }
相關文章
相關標籤/搜索