網(wǎng)站頁面設(shè)計(jì)技術(shù)參數(shù)寧波seo推薦推廣渠道
1.在 C# 中,參數(shù)傳遞方式有三種:值傳遞和引用傳遞
a. 值傳遞(Pass by Value)
概念
將參數(shù)的副本傳遞給方法。
方法內(nèi)對參數(shù)的修改不影響原始值。
適用場景
基本數(shù)據(jù)類型(如int、float、bool)。
不可變類型(如string)。
小型結(jié)構(gòu)體(如DateTime、Point)。
void ChangeValue(int num) {num = 100; // 修改副本,不影響原始值
}int original = 50;
ChangeValue(original);
Console.WriteLine(original); // 輸出: 50
b. 引用傳遞(Pass by Reference)
概念
使用ref關(guān)鍵字,將參數(shù)的內(nèi)存地址傳遞給方法。
方法內(nèi)對參數(shù)的修改直接影響原始值。
適用場景
需要在方法內(nèi)修改調(diào)用者的變量。
避免大型對象的復(fù)制開銷。
void Swap(ref int a, ref int b) {int temp = a;a = b;b = temp; // 直接修改原始變量
}int x = 10, y = 20;
Swap(ref x, ref y);
Console.WriteLine($"x={x}, y={y}"); // 輸出: x=20, y=10
類傳遞是 引用類型的傳遞
引用類型(如class、interface、delegate)默認(rèn)按引用傳遞值。
方法內(nèi)可修改對象的屬性,但無法修改引用本身(除非用ref)。
class Person {public string Name { get; set; }
}void ChangeName(Person p) {p.Name = "Alice"; // 修改對象屬性,影響原始對象
}void ChangeReference(Person p) {p = new Person { Name = "Bob" }; // 修改引用本身,不影響原始引用
}Person person = new Person { Name = "Charlie" };
ChangeName(person);
Console.WriteLine(person.Name); // 輸出: AliceChangeReference(person);
Console.WriteLine(person.Name); // 輸出: Alice(引用未變)
重點(diǎn)關(guān)注
void ChangeReference(Person p) {p = new Person { Name = "Bob" }; // 修改引用本身,不影響原始引用
}
這里明顯可以看到c#的引用創(chuàng)建的副本 c++引用是別名
C# 引用類型的參數(shù)傳遞機(jī)制
在 C# 中,引用類型默認(rèn)按值傳遞引用,這意味著:
當(dāng)你傳遞一個(gè)引用類型(如 Person 對象)時(shí),傳遞的是引用的副本(即內(nèi)存地址的復(fù)制)。
方法內(nèi)部有兩個(gè)獨(dú)立的引用變量:原始引用和副本。
修改副本引用(如 p = new Person())只會(huì)影響副本,不會(huì)改變原始引用
c# 引用類型的內(nèi)存模型
在 C# 中,引用類型的對象存儲(chǔ)在堆(Heap)上,而引用變量(如 Person person)存儲(chǔ)在棧(Stack)或堆上(取決于變量的作用域)。
關(guān)鍵區(qū)別:
引用變量:存儲(chǔ)對象的內(nèi)存地址(通常是 4 字節(jié)或 8 字節(jié),取決于系統(tǒng)是 32 位還是 64 位)。
對象本身:存儲(chǔ)在堆上,可能占用大量內(nèi)存(如大型數(shù)組、復(fù)雜對象圖)。
C++引用的特性
無副本:引用不占用額外內(nèi)存,只是原始對象的別名。
必須初始化:引用必須在創(chuàng)建時(shí)綁定到對象,且不能重新綁定。