2013-09-28 12 views
5

Sono nuovo in C#. Ho provato questo con il parametro in C#Parametro di uscita 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); 
    } 
} 

ma ottengo alcuni errori come "Uso di non assegnata fuori parametro 'm'" e
Il parametro fuori 'm' deve essere assegnato alla prima il controllo lascia il metodo corrente.

Allora, qual è il significato di questi errori e perché è obbligatorio assegnare 'm' quando sto già assegnato un valore a x.

+2

Stai confondendo 'parametri esterno ne con' parametri ref'. 'fun()' non ha accesso al valore precedente di qualunque cosa 'm' sta puntando, e quindi non può moltiplicarlo. Questa distinzione è intenzionale, i parametri 'out' sono pensati per permetterti di avere più valori di ritorno. È come se stessimo cercando di creare una funzione che moltiplica il valore della variabile a cui viene assegnato il risultato. – millimoose

risposta

12

ref significa che si passa un riferimento alla variabile che è stato dichiarato e inizializzato, prima di chiamare il metodo e che il metodo può modificare il valore di tale variabile.

out significa che si sta passando un riferimento alla variabile che è stata dichiarata, ma non ancora inizializzato, prima di chiamare il metodo, e che il metodo deve inizializzare o impostare il suo valore prima di ritornare.

2

out i parametri sono per quando la funzione vuole passare un valore out di se stesso. Quello che vuoi qui è ref, che è quando la funzione si aspetta che passi, ma può cambiarlo.

Per esempi di come entrambi dovrebbero essere utilizzati, leggere http://www.dotnetperls.com/parameter. È spiegato in termini semplici e dovresti essere in grado di comprenderlo bene.

Si noti che nel codice, non si accede mai alla variabile dopo la chiamata di funzione, pertanto ref non esegue effettivamente alcuna operazione. Il suo scopo è quello di inviare modifiche alla variabile originale.

2

Si sta ottenendo ed errore, perché la variabile invia al metodo come parametro out non deve essere inizializzata prima della chiamata al metodo. In seguito è al 100% codice corretto:

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

Sembra che tu stia cercando ref invece di out qui:

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

Come di C# 7.0 la possibilità di dichiarare una variabile di destra nel punto in cui esso viene passato come è stato introdotto un argomento fuori.

Prima:

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})"); 
} 

si può anche utilizzare var parola chiave:

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

essere attento con il campo di applicazione del parametro fuori.Ad esempio, nel seguente codice, "i" utilizzata solo in ambito se-dichiarazione:

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

Ulteriori informazioni possono essere trovate here. Questo link non è solo fuori parametro, ma tutte le nuove funzionalità introdotte in C# 7.0