每天早上醒來,看見你和陽光都在,那就是我想要的未來。 --zhu
28、C#可否對記憶體直接操作
C#在unsafe模式下可以使用指標對記憶體進行操作,但在託管模式下不可用使用指標,C#.NET預設不允許帶指標,需要設定,選擇專案右鍵->屬性->選擇生成->“允許不安全程式碼”打勾->儲存。
29、什麼是強型別,什麼是弱型別?哪種更好
強型別定義:強型別語言要求變數必須宣告其型別,並且在賦值或操作過程中,型別必須明確且一致。如果型別不匹配,編譯器會在程式碼執行前報錯。
例子:C#、Java、Python(在型別註解的支援下)等都是強型別語言。
弱型別定義:弱型別語言在處理變數時型別約束較少,允許隱式型別轉換,有時甚至允許不同型別之間的操作而不報錯。
例子:JavaScript在早期版本中被認為是弱型別的,因為它允許像 "5" + 3 這樣的操作,自動將字串轉換為數字。
強型別優勢:減少錯誤,提高效能,更好的工具支援
弱型別優勢:靈活性,動態型別語言
許多現代語言和框架結合了強型別和弱型別的優點。例如,JavaScript引入了型別註解(如 TypeScript),而Python和Ruby等語言提供了可選的型別提示。
30、Math.Round(11.5)等於多少?Math.Round(-11.5)等於多少
Math.Round(11.5)=12
Math.Round(-11.5)=-12
31、&和&&的異同
相同點:
&和&&都可作為邏輯與的運算子,表示邏輯與(and),當運算子兩邊的表示式結果都為true時,器結果才為true,否則,只要有一方為false,則結果為false。
不同點:
if(loginUser!=null&&string.IsnullEmpty(loginUser.UserName))
&&具有短路功能,即如果第一個表示式flase,則不再計算第二個表示式,對於上面的表示式,當loginUser為null時,後面表示式不會執行,不會報錯NullPointerException。如果&&改為&,則會。所以當用到邏輯與的時候&是毫無意義的。&是位運算子
總結:&是位運算子,返回結果是int型別;&&是邏輯運算子,返回結果是bool型別。
32、i++和++i有什麼區別
1)i++是先賦值,然後再自增;++i是先自增,後賦值。
2)
int i = 1;
int a = i++; // a 是 1,i 現在是 2
int b = ++i; // b 是 3,i 現在是 3
33、as和is的區別
as在轉換的同時判斷相容性,如果無法進行轉換,返回為null(沒有產生新的物件),as轉換是否成功判斷的依據是是否為null;is只是做型別相容性判斷,並不執行型別轉換,返回true或false,物件為null也返回false。
as效率更高,as只做一次型別相容性檢查。
34、談談finally用法。
finally:用於try{}catch{}finally{}結構,用於異常處理時執行任何清除操作。
特點:總是執行,無返回值,在 catch 之後,不捕獲異常,資源清理
try
{
// 可能會丟擲異常的程式碼
}
catch (IOException ioEx)
{
// 處理 IO 異常
}
catch (Exception ex)
{
// 處理其他型別的異常
}
finally
{
// 清理程式碼,比如關閉檔案
if (fileStream != null)
{
fileStream.Close();
}
}
35、簡述C#成員修飾符
abstract:指示該方法或屬性沒有實現。
const:指定域或區域性變數的值不能被改動。
event:宣告事件。
extern:指示方法在外部實現。
override:對由基類繼承成員的新實現。
readonly:指示一個域只能在宣告時和相同類內部被賦值。
static:指示一個成員屬於型別本身,而不是屬於特定物件。
virtual:指示一個方法或存取器的實現可以在繼承類中被覆蓋。
36、什麼是匿名類,有什麼好處?
不用定義、沒有名字的類,使用一次便可丟棄,LINQ查詢中,匿名類經常用來建立查詢結果的投影。好處是簡單、隨意、臨時的。
// 建立匿名類的新例項
var anonymousObject = new
{
Name = "Kimi",
Age = 25,
IsEmployee = true
};
// 使用匿名類的例項
Console.WriteLine(anonymousObject.Name); // 輸出: Kimi
Console.WriteLine(anonymousObject.Age); // 輸出: 25
37、什麼是逐字字串
逐字字串(Verbatim String)是一種使用 @ 符號開頭的字串字面量,它允許開發者在字串中包含轉義序列,而不需要實際執行轉義。逐字字串可以包含通常需要轉義的字元,如雙引號、單引號、反斜槓等,而不需要使用反斜槓進行轉義。
// 普通字串,需要轉義雙引號
string normalStr = "He said, \"Hello!\"";
// 逐字字串,不需要轉義雙引號
string verbatimStr = @"He said, "Hello!"";
// 包含轉義序列的逐字字串
string path = @"C:\Program Files\MyApp";
38、列舉你知道數字格式化轉換
1)固定小數點格式 (F): 指定小數點後有固定數量的位數
double num = 123.456;
string formatted = num.ToString("F2"); // 結果: "123.46"
2)科學計數法 (E 或 e): 將數字表示為科學計數法。
string formatted = num.ToString("E2"); // 結果: "1.23E+02"
3)百分比格式 (P 或 p): 將數字乘以100並顯示為百分比。
string formatted = num.ToString("P2"); // 結果: "12.35 %"
4)貨幣格式 (C 或 c): 根據當前區域設定將數字格式化為貨幣。
string formatted = 123456.78.ToString("C"); // 結果可能: "$123,456.78"
5)十六進位制格式 (X 或 x): 將數字格式化為十六進位制字串。
int num = 255;
string formatted = num.ToString("X"); // 結果: "FF"
39、字串拼接、字串內插法
字串拼接
是透過使用 + 運算子將多個字串連線在一起。這是一種簡單直接的方法,但在迴圈或多次拼接時可能會影響效能,因為字串在C#中是不可變的。每次使用 + 運算子拼接字串時,實際上都會建立一個新的字串物件。
string part1 = "Hello";
string part2 = "World";
string result = part1 + " " + part2; // 結果: "Hello World"
字串內插法
是一種更現代、更簡潔的方法,它允許直接將變數或表示式的值插入到字串中。從C# 6.0開始引入了字串內插法,使用 $ 符號開頭的字串字面量,並使用花括號 {} 來包含要插入的變數或表示式。
string name = "Kimi";
int age = 25;
string message = $"Hello, my name is {name} and I am {age} years old.";
// 結果: "Hello, my name is Kimi and I am 25 years old."
40、什麼是虛擬函式?什麼是抽象函式?
虛擬函式:沒有實現的,可以由子類繼承並重寫的函式。
抽象函式:規定其非虛子類必須實現的函式,必須被重寫。
41、什麼是WebService
WebService是基於網路的、分散式的模組化元件,它執行特定的任務,遵循具體技術規範,這些規範使WebService能夠與其他相容元件互操作。
42、ADO.NET常用物件有哪些
Connection:主要是開啟程式和資料庫之間的連線。沒有利用連線物件將資料庫開啟,是無法從資料庫中取得資料。Close和Dispose的區別,Close以後還可以Open,Dispose則不能。
Command:主要用來對資料庫發出指令,例如對資料庫下達增刪改查命令,以及呼叫儲存過程等。Command物件是透過Connection物件連線到資料員。
DataAdapter:是一個在資料提供者和應用程式之間的橋樑,用於填充資料到 DataSet 或 DataTable 物件中,並且可以用來更新資料庫。DataAdapter 負責執行資料庫查詢,並將結果對映到記憶體中的 DataSet 或 DataTable 中,同時它還處理資料庫的更新操作。
// 建立資料庫連線
using (SqlConnection connection = new SqlConnection(connectionString))
{
// 建立 SqlDataAdapter 例項
using (SqlDataAdapter dataAdapter = new SqlDataAdapter(
"SELECT * FROM Customers", connection))
{
// 建立 DataSet 例項
DataSet customersDataSet = new DataSet();
// 使用 Fill 方法填充 DataSet
dataAdapter.Fill(customersDataSet, "Customers");
// 修改 DataSet 中的資料...
// 更新資料庫
dataAdapter.Update(customersDataSet, "Customers");
}
}
DataSet:這個物件可視為暫存區(Cache),可以把資料庫查詢到的資料保留顯示,是放在記憶體中的。DataSet包含若干DataTable,DataTableTable又包含若干DataRow。
DataReader:當我們只需讀取資料不需要運算元據時,可以使用DataReader物件。它是一次次向下循序讀取資料來源資料的,這些資料存在資料庫中,不是一次性載入到程式記憶體,資料只讀。
43、在ASP.NET中所有自定義使用者控制元件必須繼承自
Control類
44、為什麼在.NET託管程式碼中我們不必擔心記憶體洩漏
GC垃圾收集器,自動回收
45、MVC模式
MVC(Model-View-Controller)模型-檢視-控制器
aspx就是View-檢視;Model:DataSet、Reader、物件;Controller-控制器,cs程式碼。
Mvc是典型的平行關係,不是上下級,模型負責業務領域,檢視負責介面顯示,控制器負責資料讀取填充模型,並把模型交給檢視處理。好處是將頁面和邏輯分離。
46、foreach遍歷訪問物件的要求
需要實現IEnumerable介面或者什麼GetEnumerable方法的型別。
47、什麼是反射?
反射(Reflection)是.NET框架提供的一種能力,它允許程式在執行時(Runtime)檢查和操作自身的型別資訊。使用反射,你可以獲取型別的屬性、方法、建構函式等資訊,甚至可以建立和修改型別的例項。
// 獲取型別的 Type 物件
Type type = typeof(ExampleClass);
// 獲取型別的方法
MethodInfo methodInfo = type.GetMethod("ExampleMethod");
// 呼叫方法
object result = methodInfo.Invoke(new ExampleClass(), new object[] { /* 引數列表 */ });
// 訪問欄位
FieldInfo fieldInfo = type.GetField("ExampleField");
object fieldValue = fieldInfo.GetValue(new ExampleClass());
48、ORM中延遲載入與直接載入有什麼異同
延遲載入只在真正進行資料操作的時候進行載入資料,可以減少不必要的開銷。
49、簡述Func與Action區別
Func是有返回值的委託,Action是沒有返回值的委託。
50、23種設計模式分別叫什麼,如何分類。
分三類:建立型,行為型,結構型
建立型包括:單例模式,工廠模式,建造者模式,原型模式,工廠方法模式。
行為型包括:策略模式,模板方法模式,觀察者模式,迭代器模式,責任鏈模式,命令模式,備忘錄模式,狀態模式,訪問者模式,中介者模式,直譯器模式。
結構型包括:介面卡模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式
51、陣列和集合的區別
陣列用與儲存固定數量的資料,定長,佔用記憶體少,遍歷速度快;
集合儲存的資料數量,可以在程式的執行過程中,不斷髮生變化,佔用記憶體多,遍歷速度慢;
在功能上,陣列所有功能,集合都能實現。
使用場景:
陣列:適用於元素數量已知且不變,且需要頻繁透過索引訪問元素的場景。
集合:適用於需要動態新增或刪除元素,或者需要使用集合的內建方法的場景。
52、物件導向三大特徵,物件導向和麵向過程的區別
封裝、繼承、多型
封裝(Encapsulation):
封裝是將資料(屬性)和操作這些資料的方法組合在一起的過程。
它隱藏了實現細節,只暴露出一個可以被外界訪問的介面。
封裝還意味著使用訪問修飾符(如 public、private、protected)來限制對類成員的訪問。
繼承(Inheritance):
繼承是一種機制,允許一個類(子類或派生類)繼承另一個類(基類或父類)的屬性和方法。
繼承支援程式碼複用,並且可以建立層次結構。
子類可以擴充套件或修改基類的行為。
多型(Polymorphism):
多型是指物件能夠採取多種不同形式的能力。
它允許將不同類的物件視為同一型別,通常是透過介面或基類引用。
多型可以透過虛方法、覆蓋(override)和方法過載(overloading)實現。
物件導向程式設計與程序導向程式設計的區別:
程式設計正規化:
物件導向程式設計是一種基於“物件”的程式設計正規化,它使用物件來設計和構建程式。
程序導向程式設計是一種基於“過程”的程式設計正規化,它使用過程或函式來解決問題。
模組化:
物件導向程式設計強調高內聚、低耦合的模組化設計。
程序導向程式設計可能更側重於將問題分解為一系列的過程。
可維護性和擴充套件性:
物件導向程式設計通常提供更好的可維護性和擴充套件性,因為物件和類可以獨立修改和擴充套件。
程序導向程式設計可能在大型專案中更難維護和擴充套件,因為過程間的依賴關係可能更復雜。
適用場景:
每種程式設計正規化都有其適用場景。物件導向程式設計適合於大型、複雜的系統,它強調了資料和功能的封裝以及物件之間的互動。程序導向程式設計適合於邏輯簡單、結構清晰的小型程式,它側重於執行一系列的過程或函式。