C# criar e usar funções

Preciso de ajuda com a programação C#, Sou novo nela e venho de fundo C. Eu tenho uma aplicação de Console como esta:

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

Dá-me este erro na linha que eu chamo de Add ():

é necessária uma referência de objecto para o campo, o método ou a propriedade 'Add_Function.Programa.Adicionar (int, int)'

Alguém me pode explicar porque tenho este problema? Isto é porque a arquitetura de C# é diferente de C, e a maneira que eu chamo é errado? Obrigado.

 17
Author: Martin Prikryl, 2012-04-16

11 answers

nota: em C#, o termo "função" é frequentemente substituído pelo termo "método". Para o bem desta pergunta não há nenhuma diferença, assim que eu usarei apenas o termo "função".

As outras respostas já lhe deram uma maneira rápida decorrigir o seu problema (apenas faça Add a static função), mas gostaria de explicar porquê.

C# tem um paradigma de design fundamentalmente diferente de C. esse paradigma é chamado programação orientada a objetos (OOP). Explicar todas as diferenças entre OOP e programação funcional está além do escopo desta questão, mas aqui está a versão curta como se aplica a você.

Escrevendo seu programa em C, Você teria criado uma função que adiciona dois números, e essa função existiria de forma independente e poderia ser chamada de qualquer lugar. Em C# a maioria das funções não existem independentemente; em vez disso, elas existem no contexto de um objeto. No seu código de exemplo, apenas uma instância (um objeto) da classe Program sabe como executar {[[0]}. Disse outra maneira, você tem que criar uma instância de Program, e então pedir Program para realizar um Add para você.

As soluções que as pessoas lhe deram, usando a palavra-chave static, rodeiam esse design. Usar a palavra-chave static é como dizer: "Ei, esta função que estou a definir não precisa de qualquer contexto/estado, pode simplesmente ser chamada."Uma vez que a sua função Add é muito simples, isto faz sentido. Quando começares a mergulhar mais fundo na popa, vais descobrir isso. suas funções ficam mais complicadas e dependem de conhecer seu estado/contexto.

O meu conselho é: pega num livro da OOP e prepara-te para mudar o teu cérebro da programação funcional para a programação da OOP. Vais dar uma volta.
 46
Author: ean5533, 2014-02-26 03:48:45

Você deve fazer a sua Add Função static Assim:

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

static significa que a função não é dependente de instância de classe. Então você pode chamá-lo sem precisar criar uma instância de classe da classe Program.

Ou você deve criar em caso de sua classe Program, e então ligar Add sobre esta instância. Assim:

Program prog = new Program();
prog.Add(5,10);
 17
Author: Tony The Lion, 2015-01-04 15:52:05

Este código dá-lhe um erro porque a sua função Add tem de ser static:

static public int Add(int x, int y)

Em C# há uma distinção entre funções que operam em instâncias (não-estáticas) e funções que não operam em instâncias (estáticas). Funções de instância podem chamar outras funções de instância e funções estáticas porque elas têm uma referência implícita à instância. Em contraste, as funções estáticas podem chamar apenas funções estáticas, ou então elas devem fornecer explicitamente um instance on which to call a non-static function.

Como public static void Main(string[] args) é estático, todas as funções que ele chama precisam ser estáticas também.

 5
Author: dasblinkenlight, 2012-04-16 13:49:08

Porque a sua função é uma instância ou uma função não-estática, deve criar um objecto primeiro.

Program p=new Program();
p.Add(1,1)
 2
Author: Hussein Zawawi, 2012-04-16 13:51:18

O que esse erro de compilação está a dizer - te, que tens de ter uma instância de Program ou fazer Add estática.

 1
Author: Daniel A. White, 2012-04-16 13:49:02

Nota: Em C#, o termo "função" é frequentemente substituído pelo termo "método". Para o bem desta questão não há diferença, então eu vou apenas usar o termo "função" .

Isso não é verdade. você pode ler sobre (tipo func+ expressões Lambda), (função anônima"usando o tipo de delegados"), (tipo de ação +expressões Lambda), (tipo de predicado+expressões Lambda). etc...etc... isto vai 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));

        }

     }
}
 1
Author: user3479886, 2014-03-31 06:51:08

Basta fazer a sua Add Função {[2] } adicionando a palavra-chave static Assim:

public static int Add(int x, int y)
 0
Author: Bali C, 2012-04-16 13:50:25

Tens de fazer a tua função estática como esta

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;
     }
  }
}
Podes fazer o programa.Adicionar em vez de adicionar você também pode fazer uma nova instância de programa indo assim
Program programinstance = new Program();
 0
Author: trinalbadger587, 2014-01-18 18:03:23

A razão pela qual o erro é porque sua função é definida após a sua utilização em principal se você fosse criar um protótipo de função antes das principais acima com public int Add(int x, int y); ou você pode apenas copiar e colar todo o Add function acima principal causa principal é onde o compilador inicia a execução então não faz sentido declarar e definir uma função antes de usá-lo espero que ajude. : D

 0
Author: ANXIOUS117, 2015-05-13 10:06:04
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
Author: TechNerdGamer, 2017-12-14 21:47:19
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
Author: Andreas VanDenAbele, 2017-12-14 21:48:38