網站首頁 編程語言 正文
值類型參數按值傳遞
class Program
{
static void Main(string[] args)
{
int a = 10;
Add(a);
Console.WriteLine("傳遞之后的值為:" + a);
Console.ReadKey();
}
private static void Add(int i)
{
Console.WriteLine("傳遞之前的值為:" + i);
i = i + 10;
}
}
結果:
可見,值類型參數在被方法調用的時候,是對本身實例的拷貝和操作,在方法調用前后參數值不變。
引用類型參數按值傳遞
當引用類型參數傳遞時,是對托管堆上對象實例內容的操作。
也就是引用類型按值傳遞,傳遞的是引用變量的指針,指向托管堆上的對象實例。
class Program
{
static void Main(string[] args)
{
Student student = new Student();
Add(student);
Console.WriteLine("參數傳遞之后的值為:" +student._score);
Console.ReadKey();
}
private static void Add(Student s)
{
Console.WriteLine("參數傳遞之前的值為:" + s._score);
s._score = 90;
}
}
public class Student
{
public int _score = 80;
}
結果
可見,引用類型參數在被方法調用的時候,是針對變量的引用的操作,一旦引用對象內容發生改變,原來變量的值也隨著改變。
按引用傳遞 ref和out
引用類型參數按值傳遞和按引用傳遞的不同之處:
- 按值傳遞,傳遞的是參數本身的值,即引用指針。
- 按引用傳遞,傳遞的是參數的地址,也就是實例指針。
另外,值類型也有按引用傳遞,這時候,傳遞的是值類型的地址。
class Program
{
static void Main(string[] args)
{
int i = 100;
string str = "one";
ChangeByValue(ref i);
ChangeByRef(ref str);
Console.WriteLine(i);
Console.WriteLine(str);
Console.ReadKey();
}
private static void ChangeByValue(ref int iValue)
{
iValue = 200;
}
private static void ChangeByRef(ref string sValue)
{
sValue = "One more";
}
}
可見,不管是值類型,還是引用類型,加入關鍵字ref作為參數,就意味著是對參數地址的操作,即托管堆上實例地址的改變。
另外:
- 如果需要按引用傳遞,方法的定義和方法的調用,都要顯式地使用ref和out。
- 如果一個方法的參數除了ref和out關鍵字不同,還有其他參數不同,這才構成方法的2個重載。如果僅僅ref和out關鍵字不同,會報錯"...不能僅在ref和out上有差別的重載方法"。
ref和out使用時的不同點:
out告訴編譯器,參數會在方法內部初始化,而在方法之前不需要初始化。
int x;
Foo(out x);
ref告訴編譯器,參數在方法之前必須初始化。
int y = 0;
Foo(ref y);
特殊引用類型string的傳遞
class Program
{
static void Main(string[] args)
{
string str = "Old String";
Console.WriteLine("傳遞之前的值為:" + str);
ChangeStr(str);
Console.WriteLine("傳遞之后的值為:"+str);
Console.ReadKey();
}
private static void ChangeStr(string astr)
{
astr = "Change String";
}
}
結果:
可見,雖然string是引用類型,但按值傳遞的表現和值類型按值傳遞的表現一樣。
總結
- 引用類型按值傳遞,改變的是引用變量指向的托管堆上對象實例的內容。
- 引用類型按引用傳遞,改變的是引用變量指向的托管堆上對象實例的地址。
原文鏈接:https://www.cnblogs.com/darrenji/p/3600388.html
相關推薦
- 2022-04-01 簡單聊聊C++中回調函數的實現_C 語言
- 2022-11-26 React常見跨窗口通信方式實例詳解_React
- 2024-03-08 SpringBoot開發中VO、DTO的作用,以及使用場景
- 2022-07-24 python單向鏈表實例詳解_python
- 2022-05-02 Redis可視化連接服務器的方法_Redis
- 2022-12-12 C++?Boost?Chrono實現計時碼表流程詳解_C 語言
- 2023-07-26 webpack優化代碼運行之Code split
- 2022-03-14 IDEA 上傳文件 getRealpath("/upload)獲取不到文件上傳路徑問題
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支