2013-09-28 20 views
5

Ich bin neu in C#. Ich habe schon versucht, diese mit out-Parametern in C#Out-Parameter in C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
class First 
{ 
    public void fun(out int m) 
    { 
     m *= 10; 
     Console.WriteLine("value of m = " + m); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     First f = new First(); 
     int x = 30; 
     f.fun(out x); 
    } 
} 

aber ich erhalte einige Fehler wie "Verwendung von nicht zugeordneten out-Parameter 'm'" und
Der out-Parameter 'm' muss vor zugewiesen werden Kontrolle verlässt die aktuelle Methode.

Also, was ist der Sinn dieser Fehler und warum ist es obligatorisch, zuweisen ‚m‘, wenn ich bereits einen Wert x zugewiesen bin.

+2

Du verwechselst 'Bereich führt zum Parameter mit' ref' Parameter eingeführt. 'fun()' hat keinen Zugriff auf den vorherigen Wert dessen, auf den 'm' zeigt, und kann daher nicht multiplizieren. Diese Unterscheidung ist beabsichtigt, Out-Parameter sollen Ihnen mehrere Rückgabewerte geben. Es ist, als ob Sie versuchen würden, eine Funktion zu erstellen, die den Wert der Variablen multipliziert, deren Ergebnis zugewiesen wird. – millimoose

Antwort

12

ref bedeutet, dass Sie einen Verweis auf die Variable unterwegs sind, die erklärt wurde und initialisiert, vor dem Aufruf der Methode, und dass die Methode den Wert dieser Variablen ändern kann.

out bedeutet, dass Sie einen Verweis auf die Variable unterwegs sind, die erklärt wurde, aber noch nicht initialisiert, bevor die Methode aufgerufen wird, und dass das Verfahren muss initialisiert werden oder legen Sie es Wert ist vor der Rückkehr.

2

out Parameter sind für, wenn die Funktion einen Wert aus von sich selbst übergeben möchte. Was Sie hier wollen, ist ref, das ist, wenn die Funktion erwartet, dass es übergeben wird, aber es ändern kann.

Für Beispiele, wie beide verwendet werden sollen, lesen Sie http://www.dotnetperls.com/parameter. Es wird in einfachen Worten erklärt, und Sie sollten in der Lage sein, ein gutes Verständnis davon zu bekommen.

Sie sollten beachten, dass Sie in Ihrem Code niemals auf die Variable nach dem Funktionsaufruf zugreifen, daher tut ref eigentlich nichts. Sein Zweck besteht darin, Änderungen an die ursprüngliche Variable zu senden.

2

Sie erhalten und Fehler, weil Variable senden an Methode als out Parameter nicht vor dem Methodenaufruf initialisiert werden muss. Im Anschluss ist 100% richtig Code:

class Program 
{ 
    static void Main(string[] args) 
    { 
     First f = new First(); 
     int x; 
     f.fun(out x); 
    } 
} 

Sieht aus wie du bist für ref statt out hier suchen:

class First 
{ 
    public void fun(ref int m) 
    { 
     m *= 10; 
     Console.WriteLine("value of m = " + m); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     First f = new First(); 
     int x = 30; 
     f.fun(ref x); 
    } 
} 
1
public void Ref_Test(ref int x) 
{ 
    var y = x; // ok 
    x = 10; 
} 

// x is treated as an unitialized variable 
public void Out_Test(out int x) 
{ 
    var y = x; // not ok (will not compile) 
} 

public void Out_Test2(out int x) 
{ 
    x = 10; 
    var y = x; // ok because x is initialized in the line above 
} 
0

Wie die Fähigkeit C# 7.0 eine Variable gleich zu dem Punkt zu erklären, wo es als ein Argument aus eingeführt wurde, übergeben wird.

Vorher:

public void PrintCoordinates(Point p) 
{ 
    int x, y; // have to "predeclare" 
    p.GetCoordinates(out x, out y); 
    WriteLine($"({x}, {y})"); 
} 

C# 7,0

public void PrintCoordinates(Point p) 
{ 
    p.GetCoordinates(out int x, out int y); 
    WriteLine($"({x}, {y})"); 
} 

können Sie auch var Schlüsselwort verwenden:

p.GetCoordinates(out var x, out var y); 

mit dem Umfang der Out-Parameter Seien Sie vorsichtig.Zum Beispiel in dem folgenden Code, "i" nur innerhalb verwendet if-Anweisung:

public void PrintStars(string s) 
{ 
    if (int.TryParse(s, out var i)) { WriteLine(new string('*', i)); } 
    else { WriteLine("Cloudy - no stars tonight!"); } 
} 

Weitere Informationen finden Sie here finden. Dieser Link ist nicht nur über out-Parameter, aber alle neuen Funktionen in C# 7.0