Porady: różnica między przekazywaniem struktury a przekazywaniem odwołań do klas do metody (Przewodnik programowania w języku C#)
Poniższy przykład demonstruje, jak passing struct do metoda różni się od przekazywania klasy metodainstancji.W przykładzie oba argumenty (struct i klasy instancji) są przekazywane przez wartość i obie metody zmiany wartości jednego pole argument.Jednak wyniki dwóch metod nie są takie same, ponieważ przekazywana, gdy obiekt przekazać struct różni się od przekazywana, gdy obiekt przekazać instancję klasy.
Ponieważ struktury typ wartości, kiedy użytkownik przekazać struct przez wartość do metoda metoda odbiera i działa na kopię struct argument.metoda nie ma dostępu do oryginalnego struct wywołującego metoda i dlatego nie można zmienić go w żaden sposób.metoda można zmienić tylko kopia.
Instancja klasy jest typ referencyjny, nie może być typ wartości.Gdy typ referencyjny jest przekazywany przez wartość do metoda metoda otrzymuje kopię odwołanie do instancji klasy.Oznacza to, że metoda otrzymuje kopię adres instancji, a nie kopia instancji, sam.Wystąpienia klasy wywołującego metoda ma adres, parametr nazywane metoda ma kopię adres i oba adresy odnoszą się do tego samego obiekt.Ponieważ parametr zawiera kopię adres, nazywany metoda nie można zmienić adres wywołującego metodainstancji klasy.Jednak nazywane metoda może być adres dostęp członkowie klasy, które odwołują się zarówno oryginalny adres, jak i kopia.Jeśli nazywane metoda zmienia członek klasy, zmienia się również oryginalnego wystąpienia klasy wywołującego metoda
Poniższy przykład ilustruje różnicę.Wartość willIChange pole wystąpienia klasy zostanie zmieniony przez wywołanie metoda ClassTaker , ponieważ metoda używa adresu w parametr znaleźć określonego pole wystąpienia klasy. willIChange pole struct wywołanie metoda nie zostanie zmieniony przez wywołanie metoda StructTaker , ponieważ wartość argument jest kopią struct, nie Kopiuj jego adres. StructTakerzmiany kopii i kopii są tracone podczas wywołania StructTaker jest zakończona.
Przykład
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
*/
Zobacz też
Informacje
Klasy (Przewodnik programowania w języku C#)
Struktury (Przewodnik programowania w języku C#)
Przekazywanie parametrów (Przewodnik programowania w języku C#)