基礎題二

小脑虎爱学习發表於2024-08-21

每天早上醒來,看見你和陽光都在,那就是我想要的未來。 --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)實現。

物件導向程式設計與程序導向程式設計的區別:
程式設計正規化:
物件導向程式設計是一種基於“物件”的程式設計正規化,它使用物件來設計和構建程式。
程序導向程式設計是一種基於“過程”的程式設計正規化,它使用過程或函式來解決問題。

模組化:
物件導向程式設計強調高內聚、低耦合的模組化設計。
程序導向程式設計可能更側重於將問題分解為一系列的過程。

可維護性和擴充套件性:
物件導向程式設計通常提供更好的可維護性和擴充套件性,因為物件和類可以獨立修改和擴充套件。
程序導向程式設計可能在大型專案中更難維護和擴充套件,因為過程間的依賴關係可能更復雜。

適用場景:
每種程式設計正規化都有其適用場景。物件導向程式設計適合於大型、複雜的系統,它強調了資料和功能的封裝以及物件之間的互動。程序導向程式設計適合於邏輯簡單、結構清晰的小型程式,它側重於執行一系列的過程或函式。

相關文章