variable in anderer methode
lima-city → Forum → Programmiersprachen → Programmieren mit .NET & Mono
after
array
blocken
code
element
funktion
geniale antwort
index
kopie
machen
methode
muster
nette sachen
quadrat
referenz
schleife
string
struktur
system
wirklichkeit
-
hi liebe community
ich habe eine frage:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace testing { class Program { static void Main(string[] args) { int variable = 5; Console.WriteLine(variable); change(); Console.WriteLine("after calling change: " + variable); Console.ReadKey(); } public static void change() { variable = 10; } } }
wie kann ich machen, dass beim 2. mal 10 ausgegeben wird? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo nicolas-k,
Du hast drei Möglichkeiten. Entweder Du definierst die Variable auf Klassen-Ebene oder Du übergibst sie als Referenz oder Du gibst den neuen Wert als Rückgabewert zurück.
1. Möglichkeit:
using System; namespace testing { class Program { private static int variable = 5; static void Main(string[] args) { Console.WriteLine(variable); change(); Console.WriteLine("after calling change: " + variable); Console.ReadKey(); } public static void change() { variable = 10; } } }
2.Möglichkeit:
using System; namespace testing { class Program { static void Main(string[] args) { int variable = 5; Console.WriteLine(variable); change(variable); Console.WriteLine("after calling change: " + variable); Console.ReadKey(); } public static void change(ref int variable) { variable = 10; } } }
3. Möglichkeit:
using System; namespace testing { class Program { static void Main(string[] args) { int variable = 5; Console.WriteLine(variable); variable = change(variable); Console.WriteLine("after calling change: " + variable); Console.ReadKey(); } public static int change(int variable) { return variable + 5; } } }
-
vielen dank!
sehr geniale antwort!
in wirklichkeit geht es um ein viel komplexeres problem mit dem selben muster.
wir müssen ein programm parallelisieren und nun musste ich wissen, wie ich das machen soll, sodass alle threads auf demselben array arbeiten.
schlussendlich habe ich nun die variante mit ref (2.möglichkeit) verwendet.
nochmals vielen dank :) -
Hallo nicolas-k,
wenn Du ein Array hast, dann benötigst Du das ref-Schlüsselwort eigentlich gar nicht.
Es gibt bezüglich der Übergabe an Methoden/Funktionen zwei Arten von Datentypen. Das sind einerseits Wert-Datentypen und andererseits Referenz-Datentypen.
Wert-Datentypen werden als Wert (by value) übergeben. D.h. die Methode oder Funktion bekommt eine Kopie des übergebenen Wertes und Änderungen des Wertes ändern nur die Kopie nicht aber die ursprüngliche Variable.
Wert-Datentypen sind alle elementaren Datentypen wie Ganzzahlen, Fließkommazahlen und boolsche Werte. Desweiteren werden auch Strukturen (struct) und Aufzählungen (enum) als Wert-Datentypen übergeben. Hier müsste man das ref-Schlüsselwort verwenden um eine Übergabe als Referenz zu erzwingen, was dann eine Änderung der ursprünglichen Variable möglich macht.
Alle anderen Datentypen (class, interface, delegate, Arrays, ...) sind Referenz-Datentypen und werden von Haus aus als Referenz übergeben.
Hier führt eine Änderung immer zur Änderung der ursprünglichen Variablen. Auch ohne dass ref angegeben wurde.
Noch ein Hinweis zur Parallelisierung:
Wenn Du relativ einfache Operationen parallelisieren willst, dann gibt es in System.Threading.Tasks einige nette Sachen.
Z.B. Parallel.For was eine Schleife parallelisiert ausführt ohne, dass Du explizit mit Threads hantieren musst.
Hier mal ein kleines Beispiel, welches ein Array mit den Quadraten des Element-Index füllt:
using System; using System.Threading.Tasks; namespace testing { class Program { void getSquares(int[] arr) { // fill array with the squared index by using blocks of 10 elements: Parallel.For(0, (arr.Length + 9) / 10, i => { int idx = 10*i; // compute start index // fill block for (int j = 0; j < 10 && idx < arr.Length; j++, idx++) arr[idx] = idx*idx; }); } static void Main(string[] args) { int[] arr = new int[101]; getSquares(arr); foreach (int i in arr) Console.WriteLine(i); } } }
Hierbei iteriert die Parallel.For-Schleife über Blöcke mit jeweils 10 Elementen und die innere for-Schleife füllt jeweils einen Block mit den entsprechenden Werten. Mehrere Blöcke werden hierbei parallel abgearbeitet.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage