1 回答

TA貢獻1797條經驗 獲得超4個贊
對于原始類型和非原始類型,Java 總是按值傳遞。
例如。,
void JavaMethod(int i, Foo f)
{
i = 9; //not changed from caller's point of view
f = new Foo(); //not changed from caller's point of view
}
除非使用“ref”關鍵字,否則 C# 是按值傳遞的:
void CSharpMethod(int i, Foo f, ref int j, ref Bar b)
{
i = 9; //not changed from caller's point of view
f = new Foo(); //not changed from caller's point of view
j = 9; //changed from caller's point of view
b = new Bar(); //changed from caller's point of view
}
在這兩種語言中,您都可以在按值傳遞時修改非原始對象的內部狀態:
void JavaOrCSharpMethod(Foo f)
{
f.field = 9; //internal state is changed from caller's point of view
}
請記住將新實例分配給參數和修改對象的內部狀態之間的區別。不理解這一點是很多關于這個主題的困惑的根源。
此外,除了原始類型沒有改變其狀態的成員之外,是否使用原始類型或非原始類型沒有實質內容,因此它總是通過賦值完成。任何只能通過賦值改變狀態的非原始類型看起來都是一樣的。
我還會包括一些 C++ 示例,但這會使討論變得非常復雜,因為 C++ 有許多實現按引用傳遞的方法。
- 1 回答
- 0 關注
- 145 瀏覽
添加回答
舉報