Jak: znát rozdíl mezi předáním struktura a předáním třídy referenční metody (Příručka programování C#)
Následující příklad ukazuje, jak passing struktura metoda se liší od předávání třída instance metoda.V příkladu obou argumentů (struktura a třída instance) jsou předány hodnotou a obě metody změnit hodnotu pole argument.Však výsledky dvě metody nejsou stejné, protože co je předán při předání struktura liší co je předán při předání instance třída.
Protože struktura je hodnota, kdy je předat struktura hodnotou metoda, metoda přijímá a pracuje na kopii strukturaargument. metoda nemá přístup k původní struktura ve volání metoda a proto nelze změnit žádným způsobem.metoda lze změnit pouze kopie.
Instance třída je typ odkazovat se, není hodnota.Při je typ odkazovat se předány hodnotou metoda, metoda obdrží kopii odkazovat se na instanci třída .metoda , obdrží kopii adresy instance, nikoli kopii samotnou instanci.Instance třída ve volání metoda s adresou v parametr volaná metoda má kopii na adresu a obě adresy odkazují na stejný objekt.Protože parametr obsahuje pouze kopii na adresu, volané metoda nelze změnit adresu volajícího metodainstance třída .Volaná metoda však slouží adresa pro přístup k členy třída , původní adresu a Kopírovat odkazovat se.Volaná metoda změní-li člen třída , změní se také původní instance třída ve volání metoda .
Výstup následující příklad ilustruje rozdíl.Hodnota willIChangeje změněno pole instance třída voláním metoda ClassTaker protože metoda používá adresu parametr vyhledání zadaného pole instance třída . willIChangeVolání metoda nezmění pole struktura ve volání metoda StructTaker protože hodnota argument je kopie struktura , nikoli kopii jeho adresu. StructTakerzměny kopie a kopie budou ztraceny při zpracování volání StructTaker je dokončena.
Příklad
class TheClass
{
public string willIChange;
}
struct TheStruct
{
public string willIChange;
}
class TestClassAndStruct
{
static void ClassTaker(TheClass c)
{
c.willIChange = "Changed";
}
static void StructTaker(TheStruct s)
{
s.willIChange = "Changed";
}
static void Main()
{
TheClass testClass = new TheClass();
TheStruct testStruct = new TheStruct();
testClass.willIChange = "Not Changed";
testStruct.willIChange = "Not Changed";
ClassTaker(testClass);
StructTaker(testStruct);
Console.WriteLine("Class field = {0}", testClass.willIChange);
Console.WriteLine("Struct field = {0}", testStruct.willIChange);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Class field = Changed
Struct field = Not Changed
*/
Viz také
Referenční dokumentace
Třídy (Příručka programování C#)
Struktur (Příručka programování C#)
Předávání parametrů (Příručka programování C#)