C# criar e usar funções
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 ():
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.é necessária uma referência de objecto para o campo, o método ou a propriedade 'Add_Function.Programa.Adicionar (int, int)'
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.
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);
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.
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)
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.
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.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" .
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));
}
}
}
Basta fazer a sua Add
Função {[2] } adicionando a palavra-chave static
Assim:
public static int Add(int x, int y)
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();
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
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;
}
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;