【解答】
C#支持的數據類型有:
(1) 值類型
包括:簡單類型、結構類型、枚舉類型。其中,簡單類型又分為:整型、布爾型、字符型、浮點型、小數型。
(2) 引用類型
包括:對象類型、類類型、接口、元數據、字符串類型、數組。
與C++相比,C#的主要特點有:
1) C#語言自C/C++演變而來。但是,它是完全按照面向對象的思想來設計的,並保證了類型的安全性。
2) C#簡化了C++在類、名稱空間、方法重載和異常處理等方面的使用。摒棄了C++的復雜性,使它更易用、更少出錯。
3) C#減少了C++的一些特性,不再有宏、多重繼承。特別對企業開發者來說,上述功能只會產生更多的麻煩而不是效益。
4) C#采用嚴格的類型安全、版本控制、垃圾收集(garbage collect)等等。所有的這些功能的目標都是瞄准了開發面向組件的軟件開發。
5) C#中不再有“::”、“.”、和“->”操作符,僅使用單個操作符“.”。
6) C#使用統一的類型系統,摒棄了C++多變的類型系統。
7) 在C#中,不能在類的外部定義全局函數、變量或者是常量等。所有的東西都必須封裝在類中,包括實例成員或靜態成員。從而使C#代碼更加易讀且有助於減少潛在的命名沖突。
8) 在C#中,不能使用沒有初始化的變量。從而避免了由於使用不經初始化的變量而導致的計算結果錯誤。
2. C#語言中,值類型和引用類型有何不同?
【解答】
值類型和引用類型的區別在於,值類型的變量直接存放實際的數據,而引用類型的變量存放的則是數據的地址,即對象的引用。
值類型變量直接把變量的值保存在堆棧中,引用類型的變量把實際數據的地址保存在堆棧中,而實際數據則保存在堆中。注意,堆和堆棧是兩個不同的概念,在內存中的存儲位置也不相同,堆一般用於存儲可變長度的數據,如字符串類型;而堆棧則用於存儲固定長度的數據,如整型類型的數據int(每個int變量占用四個字節)。由數據存儲的位置可以得知,當把一個值變量賦給另一個值變量時,會在堆棧中保存兩個完全相同的值;而把一個引用變量賦給另一個引用變量,則會在堆棧中保存對同一個堆位置的兩個引用,即在堆棧中保存的是同一個堆的地址。在進行數據操作時,對於值類型,由於每個變量都有自己的值,因此對一個變量的操作不會影響到其它變量;對於引用類型的變量,對一個變量的數據進行操作就是對這個變量在堆中的數據進行操作,如果兩個引用類型的變量引用同一個對象,實際含義就是它們在堆棧中保存的堆的地址相同,因此對一個變量的操作就會影響到引用同一個對象的另一個變量。
3. 結構和類的區別是什麼?
【解答】
1) 結構是一個值類型,保存在棧上,而類是一個引用類型,保存在受管制的堆上。
2) 對結構中的數據進行操作比對類或對象中的數據進行操作速度要快。
3) 一般用結構存儲多種類型的數據,當創建一個很多類或對象共用的小型對象時,使用結構效率更高。
4. C#中的數組類型有何特點?
【解答】
1) 數組一般用於存儲同一種類型的數據,包括Object類型。
2) 數組是一種引用類型,而不是值類型。
3) C#中除了可以有一維數組、多維數組外,還有交錯型數組。
5. C#中不同整型之間進行轉換的原則是什麼?
【解答】
在整型之間進行轉換時,小范圍類型可以隱式轉換為大范圍類型,但大范圍類型轉換為小范圍類型時需要使用顯式轉換。
6. 簡述裝箱和拆箱的過程。
【解答】
裝箱是將值類型隱式地轉換為object類型或者轉換為由該值類型實現了的接口類型。裝箱一個數值會為其分配一個對象實例,並把該數值拷貝到新對象中。拆箱是顯式地把object類型轉換成值類型,或者把值類型實現了的接口類型轉換成該值類型。
7. 下列寫法哪些是錯誤的?為什麼?
1) if (nMyValue1=5) i=1;
2) if(nMyValue2==1)i=1;
3) int[] myInt={1,2,3};
foreach(int test in myInt)
{
test++;
Console.WriteLine(temp);
}
4) int[] myInt1={1,2,3};
foreach(int test in myInt1)
{
Console>WriteLine(test);
}
【解答】
1) 錯誤。if中的條件表達式結果不是布爾型。
2) 正確。
3) 錯誤一:temp沒有定義。
錯誤二:在foreach塊內,test作為枚舉成員是只讀的,不能使用test++修改其值。
4) 錯誤。Console後應該是點,而不應該是大於號。
8. 錯誤和異常有什麼區別,為什麼要進行異常處理,用於異常處理的語句有哪些?
【解答】
錯誤是指在執行代碼過程中發生的事件,它中斷或干擾代碼的正常流程並創建異常對象。當錯誤中斷流程時,該程序將嘗試尋找異常處理程序(一段告訴程序如何對錯誤做出響應的代碼),以幫助程序恢復流程。換句話說,錯誤是一個事件,而異常是該事件創建的對象。
當使用短語“產生異常”時,表示存在問題的方法發生錯誤,並創建異常對象(包含該錯誤的信息及發生的時間和位置)來響應該錯誤。導致出現錯誤和隨後異常的因素包括用戶錯誤、資源失敗和編程邏輯失敗。這些錯誤與代碼實現特定任務的方法有關,而與該任務的目的無關。
如果不進行異常處理,即不對錯誤做出響應,程序的健壯性就會大打折扣,甚至無法保證正常運行,所以必須要進行異常處理。
用於異常處理的語句有:try-catch語句、try-catch-finally語句、throw語句。
9. 編寫一個控制台應用程序,輸出1到5的平方值,要求:
1) 用for語句實現。
2) 用while語句實現。
3) 用do-while語句實現。
【解答】
using System;
using System.Collections.Generic;
using System.Text;
namespace outputSquareValue
{
class Program
{
static void Main()
{
//用for語句實現
for (int i = 1; i <= 5; i++)
{
Console.WriteLine("{0}的平方值為{1}", i, i * i);
}
//用while語句實現
int j = 0;
while (j++ < 5)
{
Console.WriteLine("{0}的平方值為{1}", j, j * j);
}
//用do-while語句實現
int k = 1;
do
{
Console.WriteLine("{0}的平方值為{1}", k, k * k);
} while (k++ < 5);
Console.ReadLine();
}
}
}
10. 編寫一個控制台應用程序,要求用戶輸入5個大寫字母,如果用戶輸入的信息不滿足要求,提示幫助信息並要求重新輸入。
【解答】
using System;
using System.Collections.Generic;
using System.Text;
namespace inputCapitalLetter
{
class Program
{
static void Main()
{
bool ok = false;
while (ok == false)
{
Console.Write("請輸入5個大寫字母:");
string str = Console.ReadLine();
if (str.Length != 5)
{
Console.WriteLine("你輸入的字符個數不是5個,請重新輸入。");
}
else
{
ok = true;
for (int i = 0; i < 5; i++)
{
char c = str[i];
if (c < 'A' || c > 'Z')
{
Console.WriteLine("第{0}個字符“{1}”不是大寫字母,請重新輸入。", i + 1, c);
ok = false;
break;
}
}
}
}
}
}
}
11. 編寫一個控制台應用程序,要求完成下列功能。
1) 接收一個整數n。
2) 如果接收的值n為正數,輸出1到n間的全部整數。
3) 如果接收的值為負值,用break或者return退出程序。
4) 轉到(1)繼續接收下一個整數。
【解答】
using System;
using System.Collections.Generic;
using System.Text;
namespace testOutput
{
class Program
{
static void Main()
{
while (true)
{
Console.Write("請輸入一個整數(負值結束):");
string str = Console.ReadLine();
try
{
int i = Int32.Parse(str);
if (i < 0) break;
for (int j = 1; j <= i; j++) Console.WriteLine(j);
}
catch
{
Console.WriteLine("你輸入的不是數字或超出整數的表示范圍,請重新輸入");
}
}
}
}
}
12. 編寫一個控制台應用程序,求1000之內的所有“完數”。所謂“完數”是指一個數恰好等於它的所有因子之和。例如,6是完數,因為6=1+2+3。
【解答】
using System;
using System.Collections.Generic;
using System.Text;
namespace completeNumber
{
class Program
{
static void Main(string[] args)
{
for (int i = 2; i <= 1000; i++)
{
int s = 1;
string str = "1";
for (int j = 2; j <= (int)Math.Sqrt(i); j++)
{
if (j * (i / j) == i)
{
if (j != i / j)
{
s += j + i / j;
str += string.Format("+{0}+{1}", j, i / j);
}
else
{
s += j;
str += string.Format("+{0}", j);
}
}
}
if (s == i) Console.WriteLine("{0}={1}", i, str);
}
Console.ReadLine();
}
}
}