1 回答

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