Pregunta sobre function, c# – C # Creando y usando funciones

17

Necesito ayuda con la programación de C #; Soy nuevo en eso y vengo de fondo C Tengo una aplicación de consola como esta:

<code>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
</code>

Me da este error en la línea que llamo Add ():

Se requiere una referencia de objeto para el campo, método o propiedad no estática 'Add_Function.Program.Add (int, int)'

¿Puede alguien explicarme por qué tengo este problema? ¿Esto se debe a que la arquitectura de C # es diferente de C y la forma en que lo llamo es incorrecta? Gracias.

No se trata tanto de c #, sino de la POO y cómo funcionan las clases con funciones estáticas y miembros. Está intentando llamar a una función miembro (que requiere una instancia de un objeto) desde un método estático (que no tiene una instancia). Lynn Crumbling

Tu respuesta

11   la respuesta
0
<code>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;
    }
</code>
47

Nota: en C # el término "función" se reemplaza a menudo por el término "método". Por el bien de esta pregunta no hay diferencia, así que solo usaré el término "función".

Las otras respuestas ya te han dado una manera rápida defijar tu problema (solo hazloAdd a static función), pero me gustaría explicar por qué.

C # tiene un paradigma de diseño fundamentalmente diferente al de C. Ese paradigma se llamaprogramación orientada a objetos (OOP). Explicar todas las diferencias entre OOP y programación funcional está más allá del alcance de esta pregunta, pero aquí está la versión corta que se aplica a usted.

Al escribir su programa en C, habría creado una función que agrega dos números, y esa función existiría de manera independiente y se podría llamar desde cualquier lugar. En C # la mayoría de las funciones no existen independientemente; en cambio, existen en el contexto de un objeto. En su código de ejemplo, solo una instancia (un objeto) de la claseProgram sabe como actuarAdd. Dicho de otra manera, tienes que crear una instancia deProgramy luego preguntarProgram para realizar unaAdd para ti.

Las soluciones que la gente te dio, usando elstatic palabra clave, ruta alrededor de ese diseño. Utilizando lastatic la palabra clave es como decir, "Oye, esta función que estoy definiendo no necesita ningún contexto / estado, solo se puede llamar". Ya que tuAdd La función es muy simple, esto tiene sentido. A medida que comience a sumergirse más profundamente en la POO, encontrará que sus funciones se vuelven más complicadas y confía en conocer su estado / contexto.

Mi consejo: tome un libro de OOP y prepárese para cambiar su cerebro de la programación funcional a la programación de OOP. Te espera un paseo.

Gracias, siempre agradezco las respuestas que van a las raíces del problema. CaTx
En C #, las funciones y los métodos son dos cosas diferentes. Echa un vistazo, por ejemplo, afunciones anonimas ymétodos anónimos. igorcadelima
1

Nota: en C # el término "función" se reemplaza a menudo por el término "método". Por el bien de esta preguntano hay diferencia, así que solo usaré el término "función".

Eso no es cierto. puede leer sobre (tipo de función + expresiones Lambda), (función anónima "utilizando tipo de delegados"), (tipo de acción + expresiones Lambda), (tipo de predicado + expresiones Lambda). etc ... etc ... esto funcionará.

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

        }

     }
}
</code>
17

Usted debe hacer suAdd funciónstatic al igual que:

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

static significa que la función no es dependiente de la instancia de clase. Así que puedes llamarlo sin necesidad de crear una instancia de clase deProgram clase.

o debe crear en caso de suProgram clase, y luego llamarAdd en este caso Al igual que:

<code>Program prog = new Program();
prog.Add(5,10);
</code>
Gracias a todos. Realmente ayuda. CaTx
0

Tienes que hacer que tu función sea estática como esta

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

puede hacer Program.Add en lugar de Add. También puede crear una nueva instancia de Program yendo así.

<code>Program programinstance = new Program();
</code>
2

primero debe crear un objeto.

<code>Program p=new Program();
p.Add(1,1)
</code>
0

Solo haz tuAdd funciónstatic añadiendo elstatic palabra clave como esta:

<code>public static int Add(int x, int y)
</code>
-1
<code>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;
</code>
1

Lo que te dice ese error de compilación es que debes tener una instancia deProgram o hacerAdd estático.

6

Este código te da un error porque tuAdd la función necesita serstatic:

<code>static public int Add(int x, int y)
</code>

En C # hay una distinción entre las funciones que operan en instancias (no estáticas) y las funciones que no operan en instancias (estáticas). Las funciones de instancia pueden llamar a otras funciones de instanciay Funciones estáticas porque tienen una referencia implícita a la instancia. Por el contrario, las funciones estáticas solo pueden llamar a funciones estáticas, o bien deben proporcionar explícitamente una instancia para llamar a una función no estática.

Ya quepublic static void Main(string[] args) Es estático, todas las funciones a las que llama también deben ser estáticas.

Lo siento, malinterprete ese bit. Estás en lo correcto. Servy
0

La razón por la que tiene el error es porque su función de agregar se define después de usarla en main si tuviera que crear un prototipo de función antes de main por encima conpublic int Add(int x, int y); o simplemente puedes copiar y pegar tu enteroAdd La función por encima de la causa principal es donde el compilador comienza a ejecutarse, por lo que no tiene sentido declarar y definir una función antes de usarla. :RE

Preguntas relacionadas