2012-04-16 14 views
14

Necesito ayuda con la programación C#; Soy nuevo en esto y vengo del fondo C. Tengo una aplicación de consola de la siguiente manera:C# Creando y usando funciones

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 

Me da este error en la línea que yo llamo Añadir():

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

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

+4

Esto no se trata tanto de C#, ya que se trata de programación orientada a objetos 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). –

Respuesta

44

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

Las otras respuestas ya se han dado una forma rápida de solución su problema (sólo hacer Add una función static), pero me gustaría explicar por qué.

C# tiene un paradigma de diseño fundamentalmente diferente que C. Ese paradigma se llama programació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 esta es 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 forma independiente y se podría llamar desde cualquier lugar. En C# la mayoría de las funciones no existen de forma independiente; en cambio, existen en el contexto de un objeto. En su código de ejemplo, solo una instancia (un objeto) de la clase Program sabe cómo realizar Add. Dicho de otra manera, debe crear una instancia de Program, y luego solicitar Program para realizar un Add por usted.

Las soluciones que la gente le proporcionó, utilizando la palabra clave static, recorren ese diseño. Usar la palabra clave static es como decir, "Oye, esta función que estoy definiendo no necesita ningún contexto/estado, simplemente se puede llamar". Dado que su función Add es muy simple, esto tiene sentido. A medida que empiece a profundizar en OOP, descubrirá que sus funciones se vuelven más complicadas y confía en conocer su estado/contexto.

Mi consejo: Recoja un libro OOP y prepárese para cambiar su cerebro de la programación funcional a la programación OOP. Estás de paseo.

+5

Gracias, siempre aprecio las respuestas que van a las raíces del problema. – CaTx

+2

En C#, las funciones y los métodos son dos cosas diferentes.Eche un vistazo, por ejemplo, a [funciones anónimas] (https://msdn.microsoft.com/en-us/library/bb882516.aspx) y [métodos anónimos] (https://msdn.microsoft.com/en -us/library/0yw3tz5k.aspx). – igorcadelima

1

Lo que ese error de compilación te dice, que tienes que tener una instancia de Program o hacer Add estático.

5

Este código le da un error debido a que su función Add necesita ser static:

static public int Add(int x, int y) 

En C# hay una distinción entre las funciones que operan sobre instancias (no estático) y funciones que no operan en instancias (estáticas). Las funciones de instancia pueden llamar a otras funciones de instancia y 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.

Dado que public static void Main(string[] args) es estático, todas las funciones que llama deben ser también estáticas.

+0

Lo siento, leí mal ese bit. Estás en lo correcto. – Servy

16

Usted debe hacer su función, ya sea staticAdd así:

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

static significa que la función no es dependiente de instancia de clase. Entonces puede llamarlo sin necesidad de crear una instancia de clase de clase Program.

o debe crear en la instancia de su clase Program, y luego llamar al Add en esta instancia. De este modo:

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

Gracias a todos. Realmente ayuda. – CaTx

0

Simplemente haga su función staticAdd añadiendo la palabra clave static así:

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

Debido a que su función es una instancia o función no estática se debe crear un objeto en primer lugar.

Program p=new Program(); 
p.Add(1,1) 
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 fuera a crear un prototipo de función antes de la normal arriba con public int Add(int x, int y); o simplemente puede copiar y pegar toda su función Add arriba principal causa principal es donde el compilador inicia la ejecución, por lo que no tiene sentido declarar y definir una función antes de usarla. Espero que eso ayude. : D

0

usted tiene que hacer que eres función estática como esto

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

que puede hacer en lugar de Program.Add Añadir también se puede hacer una nueva instancia del programa yendo como esto

Program programinstance = new Program(); 
1

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

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

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; 
Cuestiones relacionadas