首頁>技術>

問題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 )- 命名的整型常量的集合;值型別。

6
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • leetcode1131_go_絕對值表示式的最大值