2011-09-13 48 views
0

我有一些靜態的無效方法。通過參數傳遞變量。或價值困境

是更好通過引用或按值傳遞的變量,因爲我經過大量的文本到這些變量:

public static void renderText(ref StringBuilder build) 
{ 
    //Do your job. 
} 

所以能不能有人解釋我,當我發送的參考會發生什麼StringBuilder,它只訪問這個StringBuilder? (它不會複製它!)。

以防萬一我不改變輸入參數的值或任何其他屬性到方法中。

因此,在變量足夠大而且沒有被操縱的情況下,我是否應該總是發送它的引用,如果是,是否會干擾某些內容?

+0

可能的重複[是否有意義將「引用類型」作爲參數與'ref'鍵傳遞給方法?](http://stackoverflow.com/questions/5960778/does-it-make-感知到傳遞參考類型的方法作爲參數與重新) –

+1

你知道,通過引用傳遞是快很多,如果你必須做很多工作參數,或者在你的情況下,將大量的文本放入它。這是因爲如果通過引用傳遞該參數,則該參數不會被複制。 – ThaMe90

+0

或者[我應該使用「ref」通過引用一個方法傳遞一個集合(例如List)嗎?](http://stackoverflow.com/q/3473552/60761) –

回答

3

看看Jon Skeet的以下文章,他在其中徹底解釋了通過引用或按值傳遞的區別。

Parameter passing in C#

或說明前條本博客文章:

http://rapidapplicationdevelopment.blogspot.com/2007/01/parameter-passing-in-c.html

的最後一篇文章實際上使用StringBuilder的類型在它的例子,這樣你就可以清楚地看到發生了什麼事情在你的案件。如果您在StringBuilder的類型通過引用傳遞,你會得到這樣的:在C#

enter image description here

0

非值類型總是按引用傳遞。 ref關鍵字的用途是讓您將引用更改爲方法內部的對象。

你誤解了完全通過的論點。閱讀this article

+1

但是,當通過引用傳遞引用類型時仍然存在差異。 –

+0

@Artem我知道,不是在開玩笑,但我認爲我可以使用pas來達到這個目的。這將會非常棘手 – Burimi

+0

不,引用類型參數仍然默認通過值傳遞。價值是一個參考,就是這樣。稱之爲「通過參考」混淆了水域。見http://pobox.com/~skeet/csharp/parameters.html –

2

只要你引用類型(類,其中StringBuilderString是)打交道時,有很少引用傳遞他們因爲沒有副本將反正做了點。

0
class Foo 
{ 
    public String Bar { get; set; } 
} 

Foo foo = new Foo(); 
foo.Bar = "ABC"; 

Console.WriteLine(foo.Bar); 
DoSomething(foo); 
Console.WriteLine(foo.Bar); 
DoAnotherthing(ref foo); 
Console.WriteLine(foo.Bar); 

    Console.ReadKey(true); 

} 

static void DoSomething(Foo foo) 
{ 
    foo.Bar = "DEF"; 
} 

static void DoAnotherthing(ref Foo foo) 
{ 
    foo.Bar = "GHI"; 
} 

這將輸出:

ABC 
DEF 
GHI 

引用類型不會按引用傳遞,而是通過使用ref僅保存創建一個新的參考的開銷。

+0

不,引用類型*默認情況下是通過引用傳遞的。通過值傳遞引用和通過引用傳遞引用類型的變量有很大的區別。閱讀http://pobox.com/~skeet/csharp/parameters.html –

0

按值傳遞參數

默認參數:通過引用傳遞

引用類型按價值傳遞。這意味着傳遞給該方法,當在創建值的副本:

class Test 
{ 
    static void Foo(int p) 
    { 
     p = p + 1;    // Increment p by one. 
     Console.WriteLine(p); // Write p to screen. 
    } 

    static void Main() 
    { 
     int x = 8;    
     Foo(x);    // Make a copy of x. 
     Console.WriteLine(x); // x will still be 8. 
    } 
} 

分配頁記載的新的值不改變變量x的內容,因爲p和X駐留在不同的存儲器位置。

通過值傳遞引用tupe參數將複製引用,但不是對象。字符串生成器的例子;這裏Foo看到主要實例化的相同StringBuilder對象,但具有獨立的參考。所以StrBuild和fooStrBuild都指向同一對象StringBuilder獨立變量:

class Test 
{ 
    static void Foo(StringBuilder fooStrBuild) 
    { 
     fooStrBuild.Append("testing");    
     fooStrBuild = null; 
    } 

    static void Main() 
    { 
     StringBuilder StrBuild = new StringBuilder(); 
     Foo(strBuild); 
     Console.WriteLine(StrBuild.ToString()); // "testing" 
    } 
} 

因爲fooStrBuild爲參考改變其值不會改變StrBuild的副本。

通行證通過引用

在下文中,p和X指的是相同的存儲器位置:

class Test 
{ 
    static void Foo(ref int p) 
    { 
     p = p + 1;    // Increment p by one. 
     Console.WriteLine(p); // Write p to screen. 
    } 

    static void Main() 
    { 
     int x = 8;    
     Foo(ref x);   // Make a copy of x. 
     Console.WriteLine(x); // x is now 9. 
    } 
} 

因此p的值被改變。

希望這會有所幫助。