Pergunta sobre c#, function – C # Criando e usando funções

17

Preciso de ajuda com programação em C #; Eu sou novo para ele e eu venho de fundo C. Eu tenho um aplicativo de console como este:

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

Isso me dá esse erro na linha que eu chamo de Add ():

Uma referência de objeto é necessária para o campo não estático, método ou propriedade 'Add_Function.Program.Add (int, int)'

Alguém pode me explicar por que eu tenho esse problema. Isso ocorre porque a arquitetura do C # é diferente de C e a maneira como eu a chamo está errada? Obrigado.

Isso não é muito sobre c #, como é sobre OOP e como as classes funcionam com funções estáticas e membro. Você está tentando chamar uma função de membro (que requer uma instância de um objeto) de um método estático (que não possui uma instância). Lynn Crumbling

Sua resposta

11   a resposta
0

pós você usá-la no main se você fosse criar um protótipo de função antes do main up acima dele compublic int Add(int x, int y); ou você pode simplesmente copiar e colar todo o seuAdd A função acima main main principal é onde o compilador inicia a execução, portanto, não faz sentido declarar e definir uma função antes de usá-la, o que ajuda. : D

1

você precisa ter uma instância deProgram ou fazerAdd estático.

1

função" é frequentemente substituído pelo termo "método". Por causa desta questãonão há diferença, então vou 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 delegado"), (tipo de ação + expressões Lambda), (tipo Predicado + expressões Lambda). etc ... etc ... isso vai 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>
-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>
17

Você deve fazer o seuAdd funçãostatic igual a:

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

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

ou você deve criar no exemplo do seuProgram classe e, em seguida, ligueAdd neste exemplo. Igual a:

<code>Program prog = new Program();
prog.Add(5,10);
</code>
Obrigado a todos. Isso realmente ajuda. CaTx
0

Basta fazer o seuAdd funçãostatic adicionando ostatic palavra-chave como esta:

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

Este código dá um erro porque o seuAdd função precisa serstatic:

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

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ânciae funções estáticas porque elas têm uma referência implícita à instância. Por outro lado, as funções estáticas podem chamar apenas funções estáticas ou devem fornecer explicitamente uma instância na qual chamar uma função não estática.

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

Desculpe, interpretou mal esse bit. Você está certo. Servy
0

você tem que fazer sua função estática assim

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

você pode fazer Program.Add em vez de Adicionar você também pode fazer uma nova instância do Programa, indo assim

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

Nota: em C #, o termo "função" é frequentemente substituído pelo termo "método". Por causa desta questão, não há diferença, então vou usar o termo "função".

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

C # tem um paradigma de design fundamentalmente diferente de C. Esse paradigma é chamadoprogramaçã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 resumida que 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 independentemente e poderia ser chamada de qualquer lugar. Em C # a maioria das funções não existe independentemente; em vez disso, eles existem no contexto de um objeto. No seu código de exemplo, apenas uma instância (um objeto) da classeProgram sabe como executarAdd. Dito de outra forma, você tem que criar uma instância dePrograme depois pergunteProgram para executar umaAdd para voce.

As soluções que as pessoas lhe deram, usando ostatic palavra-chave, rota em torno desse design. Usando ostatic palavra-chave é como dizer: "Ei, essa função que estou definindo não precisa de nenhum contexto / estado, pode ser chamada apenas". Desde o seuAdd função é muito simples, isso faz sentido. À medida que você começa a mergulhar mais fundo na POO, vai perceber que suas funções se tornam mais complicadas e dependem do seu estado / contexto.

Meu conselho: Pegue um livro OOP e prepare-se para mudar seu cérebro da programação funcional para programação OOP. Você está em um passeio.

Obrigado, eu sempre aprecio respostas que vão para as raízes do problema. CaTx
Em C #, funções e métodos são duas coisas diferentes. Dê uma olhada, por exemplo, emfunções anônimas emétodos anônimos. igorcadelima
2

você deve criar um objeto primeiro.

<code>Program p=new Program();
p.Add(1,1)
</code>
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>

Perguntas relacionadas