web-dev-qa-db-fra.com

C # Créer et utiliser des fonctions

J'ai besoin d'aide avec la programmation en C #; Je suis novice dans ce domaine et je viens du C J'ai une application console comme celle-ci:

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

Cela me donne cette erreur sur la ligne que j'appelle Add ():

Une référence d'objet est requise pour le champ non statique, la méthode ou la propriété 'Add_Function.Program.Add (int, int)'

Quelqu'un peut-il m'expliquer s'il vous plaît pourquoi j'ai ce problème. Est-ce parce que l'architecture de C # est différente de celle de C et que je l'appelle mal? Merci.

17
CaTx

Remarque: en C #, le terme "fonction" est souvent remplacé par le terme "méthode". Pour les besoins de cette question, il n'y a pas de différence, je vais donc utiliser le terme "fonction".

Les autres réponses vous ont déjà fourni un moyen rapide de résoudre votre problème (il suffit de faire Add une fonction static), mais j'aimerais expliquer pourquoi.

C # a un paradigme de conception fondamentalement différent de celui de C. Ce paradigme est appelé programmation orientée objet (OOP). Expliquer toutes les différences entre OOP et la programmation fonctionnelle dépasse le cadre de cette question, mais voici la version abrégée qui s’applique à vous.

En écrivant votre programme en C, vous auriez créé une fonction qui ajoute deux nombres et cette fonction existerait indépendamment et serait appelable de n’importe où. En C #, la plupart des fonctions n'existent pas indépendamment. au lieu de cela, ils existent dans le contexte d'un objet. Dans votre exemple de code, seule une instance (un objet) de la classe Program sait comment exécuter Add. En d'autres termes, vous devez créer une instance de Program, puis demander à Program d'effectuer une Add pour vous.

Les solutions que les utilisateurs vous ont proposées, à l’aide du mot clé static, vous permettent de contourner ce modèle. Utiliser le mot clé static revient à dire: "Hé, cette fonction que je suis en train de définir n'a besoin d'aucun contexte/état, elle peut simplement être appelée." Puisque votre fonction Add est très simple, cela a du sens. Lorsque vous commencerez à plonger plus profondément dans la POO, vous constaterez que vos fonctions deviennent plus compliquées et dépendent de la connaissance de leur état/contexte.

Mon conseil: Prenez un livre OOP et préparez-vous à passer de la programmation fonctionnelle à la programmation OOP. Vous allez faire un tour. 

46
ean5533

Vous devez soit faire votre fonction Addstatic comme ceci:

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

static signifie que la fonction n'est pas dépendante de l'instance de classe. Vous pouvez donc l'appeler sans avoir besoin de créer une instance de classe de la classe Program.

ou vous devez créer une instance de votre classe Program, puis appeler Add sur cette instance. Ainsi:

Program prog = new Program();
prog.Add(5,10);
17
Tony The Lion

Ce code vous indique une erreur car votre fonction Add doit être static:

static public int Add(int x, int y)

En C #, il existe une distinction entre les fonctions qui opèrent sur des instances (non statiques) et les fonctions qui ne fonctionnent pas sur des instances (statiques). Les fonctions d'instance peuvent appeler d'autres fonctions et / static car elles ont une référence implicite à l'instance. En revanche, les fonctions statiques ne peuvent appeler que des fonctions statiques, sinon elles doivent explicitement fournir une instance sur laquelle appeler une fonction non statique.

Puisque public static void Main(string[] args) est statique, toutes les fonctions appelées doivent également l'être.

6
dasblinkenlight

Comme votre fonction est une instance ou une fonction non statique, vous devez d'abord créer un objet.

Program p=new Program();
p.Add(1,1)
2
Hussein Zawawi

Remarque: en C #, le terme "fonction" est souvent remplacé par le terme "méthode". Pour les besoins de cette question il n'y a pas de différence, je vais donc utiliser le terme "fonction" .

Ce n'est pas vrai. vous pouvez en savoir plus sur (type func + expressions lambda), (fonction anonyme "utilisant le type délégués"), (type d'action + expressions lambda), (type prédicat + expressions lambda). etc ... etc ....__ cela fonctionnera.

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

        }

     }
}
1
user3479886

Ce que cette erreur de construction vous dit, vous devez soit avoir une instance de Program ou rendre Add statique.

1
Daniel A. White

Créez simplement votre fonction Addstatic en ajoutant le mot clé static comme ceci:

public static int Add(int x, int y)
0
Bali C

vous devez vous rendre fonction statique

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

vous pouvez faire Program.Add au lieu de AddVous pouvez également créer une nouvelle instance de Program en procédant comme suit

Program programinstance = new Program();
0
trinalbadger587
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;
    }
0
TechNerdGamer

L'erreur est due au fait que votre fonction add est définie après votre utilisation dans main si vous deviez créer un prototype de fonction avant main au-dessus de celle-ci avec public int Add(int x, int y); ou que vous puissiez simplement copier et coller votre fonction Add entière au-dessus de la cause principale C’est là que le compilateur commence l’exécution, il n’est donc pas logique de déclarer et de définir une fonction avant de l’utiliser, espérons que cela aidera. :RÉ

0
ANXIOUS117