2012-04-16 14 views
14

Ho bisogno di aiuto con la programmazione C#; Sono nuovo ad esso e vengo da C background. Ho un'applicazione console come questo:C# Creazione e uso delle funzioni

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Add_Function 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
     int a; 
     int b; 
     int c; 

     Console.WriteLine("Enter value of 'a':"); 
     a = Convert.ToInt32(Console.ReadLine()); 

     Console.WriteLine("Enter value of 'b':"); 
     b = Convert.ToInt32(Console.ReadLine()); 

     //why can't I not use it this way? 
     c = Add(a, b); 
     Console.WriteLine("a + b = {0}", c); 
     }//END Main 

     public int Add(int x, int y) 
     { 
     int result = x + y; 
     return result; 
     }//END Add 
    }//END  Program 
}//END   Add_Function 

Mi dà questo errore sulla linea che io chiamo Aggiungi():

è necessario un riferimento a un oggetto per il campo non statico, il metodo, o proprietà 'Add_Function.Program.Add (int, int)'

Qualcuno può spiegarmi perché ho questo problema. Questo perché l'architettura di C# è diversa da C e il modo in cui la chiamo è errata? Grazie.

+4

Questo non è tanto di C#, come si tratta di OOP e su come le classi lavorano con funzioni statiche e del membro. Stai provando a chiamare una funzione membro (che richiede un'istanza di un oggetto) da un metodo statico (che non ha un'istanza). –

risposta

44

Nota: in C# il termine "funzione" è spesso sostituito con il termine "metodo". Per il gusto di questa domanda non c'è differenza, quindi userò semplicemente il termine "funzione".

Le altre risposte hanno già dato un modo rapido per correzione il vostro problema (basta fare Add una funzione static), ma mi piacerebbe spiegare perché.

C# ha un paradigma di progettazione fondamentalmente diverso da C. Tale paradigma è chiamato programmazione orientata agli oggetti (OOP). Spiegare tutte le differenze tra OOP e programmazione funzionale va oltre lo scopo di questa domanda, ma ecco la versione breve che si applica a te.

Scrivendo il programma in C, avresti creato una funzione che aggiunge due numeri, e quella funzione sarebbe esistita indipendentemente ed essere richiamabile da qualsiasi luogo. In C# la maggior parte delle funzioni non esiste indipendentemente; al contrario, esistono nel contesto di un oggetto. Nel codice di esempio, solo un'istanza (un oggetto) della classe Program sa come eseguire Add. Detto in altro modo, devi creare un'istanza di Program e quindi chiedere a Program di eseguire per te un Add.

Le soluzioni che le persone ti hanno dato, utilizzando la parola chiave static, si spostano attorno a tale progetto. Usare la parola chiave static è come dire "Ehi, questa funzione che sto definendo non ha bisogno di alcun contesto/stato, può solo essere chiamata". Poiché la tua funzione Add è molto semplice, questo ha senso. Quando inizi a tuffarti più a fondo in OOP, scoprirai che le tue funzioni diventano più complicate e fanno affidamento sul loro stato/contesto.

Il mio consiglio: prendi un libro OOP e preparati a passare dalla programmazione funzionale alla programmazione OOP. Sei a fare un giro.

+5

Grazie, apprezzo sempre le risposte che vanno alle radici del problema. – CaTx

+2

In C#, le funzioni e i metodi sono due cose diverse.Date un'occhiata, ad esempio, a [funzioni anonime] (https://msdn.microsoft.com/en-us/library/bb882516.aspx) e [metodi anonimi] (https://msdn.microsoft.com/en -us/library/0yw3tz5k.aspx). – igorcadelima

1

Ciò che questo errore di generazione ti dice è che devi avere un'istanza di Program o fare Add statico.

5

Questo codice ti dà un errore perché la funzione Add deve essere static:

static public int Add(int x, int y) 

In C# c'è una distinzione tra le funzioni che operano su istanze (non statico) e funzioni che non operano su istanze (statiche). Le funzioni di istanza possono chiamare altre funzioni di istanza e funzioni statiche perché hanno un riferimento implicito all'istanza. Al contrario, le funzioni statiche possono chiamare solo funzioni statiche, oppure devono fornire esplicitamente un'istanza su cui chiamare una funzione non statica.

Poiché public static void Main(string[] args) è statico, tutte le funzioni che chiama devono essere anche statiche.

+0

Scusa, ho letto male quel bit. Hai ragione. – Servy

16

Si dovrebbe rendere il vostro sia Add funzione static in questo modo:

static public int Add(int x, int y) 
{ 
    int result = x + y; 
    return result; 
} //END Add 

static significa che la funzione non è un'istanza di classe dipendente. Quindi puoi chiamarlo senza dover creare un'istanza di classe della classe Program.

oppure si dovrebbe creare in istanza della classe Program e quindi chiamare Add su questa istanza. In questo modo:

Program prog = new Program(); 
prog.Add(5,10); 
+1

Grazie a tutti. Aiuta davvero. – CaTx

0

Basta fare il vostro Add funzione static aggiungendo la parola chiave static in questo modo:

public static int Add(int x, int y) 
2

Perché la vostra funzione è una funzione non statico istanza o è necessario creare un oggetto prima.

Program p=new Program(); 
p.Add(1,1) 
0

Il motivo per cui si verifica l'errore è perché la funzione di aggiunta viene definita dopo averla utilizzata in main se si desidera creare un prototipo di funzione prima di eseguire l'operazione principale sopra con public int Add(int x, int y); oppure è sufficiente copiare e incollare l'intera funzione Add sopra main cause principale è dove il compilatore inizia l'esecuzione quindi non ha senso dichiarare e definire una funzione prima di usarla spero che aiuti. : D

0

dovete fare voi sono funzione statica come questo

namespace Add_Function 
{ 
    class Program 
    { 
    public static void(string[] args) 
    { 
     int a; 
     int b; 
     int c; 

     Console.WriteLine("Enter value of 'a':"); 
     a = Convert.ToInt32(Console.ReadLine()); 

     Console.WriteLine("Enter value of 'b':"); 
     b = Convert.ToInt32(Console.ReadLine()); 

     //why can't I not use it this way? 
     c = Add(a, b); 
     Console.WriteLine("a + b = {0}", c); 
    } 
    public static int Add(int x, int y) 
    { 
     int result = x + y; 
     return result; 
    } 
    } 
} 

si può fare Program.Add anziché Aggiungi è anche possibile fare una nuova istanza di programma andando come questo

Program programinstance = new Program(); 
1

Nota: in C# il termine "funzione" viene spesso sostituito dal termine "metodo". Per il piacere di questa domanda non c'è alcuna differenza, quindi userò semplicemente il termine "funzione".

Questo non è vero. puoi leggere about (func type + Lambda expressionions), (funzione anonima "using delegates type"), (tipo di azione + espressioni Lambda), (Tipo di predicato + espressioni Lambda). ecc ... ecc ... funzionerà.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      int a; 
      int b; 
      int c; 

      Console.WriteLine("Enter value of 'a':"); 
      a = Convert.ToInt32(Console.ReadLine()); 

      Console.WriteLine("Enter value of 'b':"); 
      b = Convert.ToInt32(Console.ReadLine()); 

      Func<int, int, int> funcAdd = (x, y) => x + y; 
      c=funcAdd.Invoke(a, b); 
      Console.WriteLine(Convert.ToString(c)); 

     } 

    } 
} 
0
static void Main(string[] args) 
    { 
     Console.WriteLine("geef een leeftijd"); 
     int a = Convert.ToInt32(Console.ReadLine()); 

     Console.WriteLine("geef een leeftijd"); 
     int b = Convert.ToInt32(Console.ReadLine()); 

     int einde = Sum(a, b); 
     Console.WriteLine(einde); 
    } 
    static int Sum(int x, int y) 
    { 
     int result = x + y; 
     return result; 
    } 
-1
static void Main(string[] args) 
    { 
     Console.WriteLine("geef een leeftijd"); 
     int a = Convert.ToInt32(Console.ReadLine()); 

     Console.WriteLine("geef een leeftijd"); 
     int b = Convert.ToInt32(Console.ReadLine()); 

     int einde = Sum(a, b); 
     Console.WriteLine(einde); 
    } 
    static int Sum(int x, int y) 
    { 
     int result = x + y; 
     return result; 
Problemi correlati