問題1:值和引用型別是什麼?另外,用例項解釋一下裝箱和拆箱?
答:
值型別是直接儲存資料的型別,值型別儲存在堆疊中。大多數基本型別,如int、float和char都是值型別的例子。另一方面,引用型別將引用或記憶體地址儲存在其中,並將相應的資料儲存在堆中,引用型別的例子包括類、字串、陣列和物件。裝箱是將值型別轉換為物件型別時相關的術語,而拆箱只是將物件型別轉換為值型別。裝箱在託管堆記憶體中建立一個新物件並複製資料,而拆箱則相反。裝箱是隱式的,而拆箱是顯式的。如下所示,當將int轉換為object時進行裝箱,當將object轉換為object時進行解裝箱:int a = 5; object obj = a; //裝箱 a = (int) obj; //拆箱
問題2:常量和只讀變數有什麼不同?用一個例子來解釋?
答:
常量是隱式靜態的,而只讀變數既可以是例項型別,也可以是靜態的,對常量進行顯式靜態宣告將丟擲錯誤。常量需要在設計時宣告它們的值。只讀變數在執行時計算。常量既可以在類級別宣告,也可以在方法內部宣告。只讀變數既可以在類級別宣告,也可以在執行時的建構函式中宣告,但不能在方法內部宣告。常量僅用於值型別和字串字面值。只讀變數可以同時儲存值型別和引用型別。如果常量的值不會改變,則應該使用常量。只有在執行時值可能發生變化時,才應該使用只讀變數。對於以後對常量值的任何更改,都需要編譯當前程式集和引用的程式集,而對於以後對只讀值的任何更改,只需要編譯當前程式集,引用的程式集將自動更新。例如:////常量 public const string EmployeeTableNamev //Error public static const string EmployeeTableNamev = "Employee"; //Error public const string EmployeeTableNamev = "Employee"; //Correct ////只讀 public readonly string EmployeeTableNamev; //Correct public MyClass() { EmployeeTableNamev = "Employee"; } public readonly string EmployeeTableNamev = "Employee"; //Correct public static readonly stringEmployeeTableNamev = "Employee"; //Correct
問題3:var、object和dynamic type有什麼相似和不同之處?
答:
在.NET 3.0中引入的Var可以儲存各種資料,但在宣告時需要初始化。Object是所有.NET型別的基類,因此也可以儲存所有型別的資料。在.NET 4.0中引入的Dynamicwhich在內部使用一個物件來儲存各種資料。Var透過在設計時隱式轉換為其原始型別來強制型別安全,而在物件和動態的情況下,型別轉換在執行時發生,代價是裝箱/拆箱操作。Var不能用於傳遞方法引數和作為返回型別,而可以使用object和dynamic。當轉換回原始型別時,Var和動態型別不需要顯式強制轉換,而object則需要。現在,var經常被使用,因為它是強型別的,同時是可讀的。當關於資料型別的資訊很少時,應該使用物件。Dynamic應該只在使用反射或COM APIs時使用。示例如下:var a; //Error var b = 3; //Correct, internally it converts to int b = 3; int c = b;//Correct, implicitly conversion object a; //Correct object b = 7;//Correct int c = b;//Error, cannot implicitly convert type object to int int d = (int) b; //Correct dynamic a;//Correct dynamic b = 7;//Correct int c = b;//Correct
問題4:字串和字串生成器之間有什麼區別?
一個字串(名稱空間:System.String)是表示文字的Unicode字元的順序集合。字串物件是不可變(只讀)的,是System的順序集合,表示字串的Char物件。字串物件在記憶體中的最大大小為2gb(約10億字元)。
雖然字串是引用型別,但相等運算子(==和!=)的定義是用來比較字串物件的值,而不是引用。然而,裝箱之後,比較發生在字串例項上。
string a = "prakash"; string b = "p"; b += "rakash"; // Append to contents of 'b' Console.WriteLine(a ==b); //True Console.WriteLine((object)a == (object)b); //False as after boxing the //comparison happens on string instance and both are differentstring instance
另一方面,StringBuilder (System.Text.StringBuilder)表示一個可變字串。該類不能被繼承。
預設值為16個字元,最大值大於20億字元。
StringBuilder sb = new StringBuilder(); sb.Append("Prakash"); sb.Append("Tripathi"); Console.WriteLine(sb.ToString());
問題5:在名稱空間內可以直接建立哪些型別?
有以下幾種型別可以直接在名稱空間中建立。有時他們也被稱為第一名公民:
類(Class)- 任何程式的主要構建塊,用於將變數、屬性和方法封裝到單個單元中;引用型別。介面(Interface)- 保留方法、屬性的簽名;引用型別。結構(Struct)- 與類有點相似,但是是輕量級的值型別。委託(Delegate)- 用於封裝命名或匿名方法;引用型別。列舉(Enum )- 命名的整型常量的集合;值型別。
最新評論