VB.NET\C# Przekazywanie argumentów funkcji jako wartość.

0

Witam. Wie ktoś jak przekazać tablice do funkcji w taki sposób aby nie była traktowana jako referencja?
Z tego co wyczytałem to domyślnie przekazywane argumenty powinny być traktowane jako wartość czyli jak rozumiem wewnątrz funkcji ytest\xtest powinna być utworzona lokalna kopia przekazanego argumentu. Chyba że coś pokręciłem.
Dlatego nie rozumiem dlaczego w poniższym przykładzie wartość przekazywana do funkcji xtest jest traktowana jako referencja a dla ytest jako wartość. Mógłby mi ktoś wyjaśnić co robię źle?

        static void Main()
        {
            int y = 0;
            Console.WriteLine(Ytest(y)); // = 2
            Console.WriteLine(y);    // =0

            int[] x = new int[3];
            Console.WriteLine((Xtest(x))); // = 2
            Console.WriteLine(x[0]);     // =2 

            Console.ReadKey();
        }

        static public int Ytest( int argument)
        {
            argument = 2;
            return argument;
        }

        static public int Xtest(int[] argument)
        {
            argument[0] = 2;
            return argument[0];
        }
    }
    Sub Main()

        Dim y As Integer = 0
        Console.WriteLine(Ytest(y)) '= 2
        Console.WriteLine(y)    '=0

        Dim x(1) As Integer
        Console.WriteLine((Xtest(x))) '= 2
        Console.WriteLine(x(0))     '=2 

        Console.ReadKey()
    End Sub
   
 Function Ytest(ByVal argument As Integer) As Integer

        argument = 2
        Return argument
    End Function

    Function Xtest(ByVal argument() As Integer) As Integer

        argument(0) = 2
        Return argument(0)
    End Function
3

O ile nie zażądasz jawnie przekazania przez referencję, to typy wartościowe są przekazywane przez wartość, a typy referencyjne są przekazywane przez referencję (precyzyjniej: przez wartość referencji). Tablica integerów jest typem referencyjnym, więc operujesz na niej przez referencję i właśnie ta referencja jest kopiowana jako parametr do funkcji.

Wie ktoś jak przekazać tablice do funkcji w taki sposób aby nie była traktowana jako referencja?

W C# nie da się bez jawnego skopiowania.

0
Afish napisał(a):

O ile nie zażądasz jawnie przekazania przez referencję, to typy wartościowe są przekazywane przez wartość, a typy referencyjne są przekazywane przez referencję (precyzyjniej: przez wartość referencji). Tablica integerów jest typem referencyjnym, więc operujesz na niej przez referencję i właśnie ta referencja jest kopiowana jako parametr do funkcji.

Wie ktoś jak przekazać tablice do funkcji w taki sposób aby nie była traktowana jako referencja?

W C# nie da się bez jawnego skopiowania.

ok. dziękuje. Doczytałem i teraz rozumiem.

zostawiam. może się komuś przyda.
Różnice pomiędzy przekazywaniem argumentu według wartości i według odwołania dla typów wartości i typów referencyjnych.

https://docs.microsoft.com/pl-pl/dotnet/visual-basic/programming-guide/language-features/procedures/differences-between-passing-an-argument-by-value-and-by-reference#ability-to-modify

https://docs.microsoft.com/pl-pl/dotnet/visual-basic/programming-guide/language-features/procedures/differences-between-modifiable-and-nonmodifiable-arguments]

1 użytkowników online, w tym zalogowanych: 0, gości: 1