Вопрос по function, c# – C # Создание и использование функций

17

Мне нужна помощь с программированием на C #; Я новичок в этом, и я родом из Си фона. У меня есть консольное приложение, как это:

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

Это дает мне эту ошибку в строке, которую я вызываю Add ():

An object reference is required for the non-static field, method, or property 'Add_Function.Program.Add(int, int)'

Может кто-нибудь, пожалуйста, объясните мне, почему у меня есть эта проблема. Это потому, что архитектура C # отличается от C, и, как я это называю, неправильно? Благодарю.

Это не столько о c #, сколько об ООП и о том, как классы работают со статическими функциями и функциями-членами. Вы пытаетесь вызвать функцию-член (для которой требуется экземпляр объекта) из статического метода (у которого нет экземпляра). Lynn Crumbling

Ваш Ответ

11   ответов
0

Просто сделай свойAdd функцияstatic добавивstatic Ключевое слово, как это:

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

Причина, по которой у вас возникает ошибка, заключается в том, что ваша функция add определяется после того, как вы используете ее в main, если вам нужно было создать прототип функции до того, как main поднимется над ней с помощьюpublic int Add(int x, int y); или вы можете просто скопировать и вставить весь свойAdd Функция выше основной причины main - это то, где компилятор начинает выполнение, поэтому не имеет смысла объявлять и определять функцию, прежде чем использовать ее, надеюсь, что это поможет. : D

6

Этот код дает вам ошибку, потому что вашAdd функция должна бытьstatic:

static public int Add(int x, int y)

В C # существует различие между функциями, которые работают с экземплярами (не статическими), и функциями, которые не работают с экземплярами (статическими). Функции экземпляра могут вызывать другие функции экземпляраand статические функции, потому что они имеют неявную ссылку на экземпляр. Напротив, статические функции могут вызывать только статические функции, иначе они должны явно предоставлять экземпляр для вызова нестатической функции.

посколькуpublic static void Main(string[] args) статический, все функции, которые он вызывает, также должны быть статическими.

Извините, неправильно прочитал это. Ты прав.
17

Вы должны либо сделать свойAdd функцияstatic вот так:

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

static означает, что функция не зависит от экземпляра класса. Таким образом, вы можете вызвать его без необходимости создавать экземпляр классаProgram учебный класс.

или вы должны создать в случае вашегоProgram класс, а затем позвонитеAdd в этом случае. Вот так:

Program prog = new Program();
prog.Add(5,10);
Всем спасибо. Это действительно помогает. CaTx
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

Note: in C# the term "function" is often replaced by the term "method". For the sake of this question there is no difference, so I'll just use the term "function".

Это не правда. Вы можете прочитать о (тип func + лямбда-выражения), (анонимная функция & quot; с использованием типа делегатов & quot;), (тип действия + лямбда-выражения), (тип предиката + лямбда-выражения). и т.д ... и т.д ... это будет работать

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

        }

     }
}
2

Поскольку ваша функция является экземпляром или нестатической функцией, вы должны сначала создать объект.

Program p=new Program();
p.Add(1,1)
1

Что эта ошибка сборки говорит вам, что вы должны иметь экземплярProgram или сделатьAdd статичный.

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

Note: in C# the term "function" is often replaced by the term "method". For the sake of this question there is no difference, so I'll just use the term "function".

Другие ответы уже дали вам быстрый способfix ваша проблема (просто сделатьAdd static функции), но я бы хотел объяснить, почему.

C # имеет принципиально иную парадигму дизайна, чем C. Эта парадигма называетсяobject-oriented programming (ООП). Объяснение всех различий между ООП и функциональным программированием выходит за рамки этого вопроса, но здесь приведена краткая версия, которая применима к вам.

Написав свою программу на C, вы бы создали функцию, которая добавляет два числа, и эта функция будет существовать независимо и вызываться из любого места. В C # большинство функций не существует независимо; вместо этого они существуют в контексте объекта. В вашем примере кода только экземпляр (объект) классаProgram умеет выполнятьAdd, Сказал иначе, вы должны создать экземплярProgram, а затем спроситеProgram выполнитьAdd для тебя.

Решения, которые люди дали вам, используяstatic Ключевое слово, маршрут вокруг этого дизайна. С использованиемstatic ключевое слово вроде как сказать: «Эй, эта функция, которую я определяю, не нуждается в каком-либо контексте / состоянии, ее можно просто вызвать». Так как вашAdd Функция очень проста, это имеет смысл. Когда вы начнете углубляться в ООП, вы обнаружите, что ваши функции усложняются и полагаются на знание их состояния / контекста.

Мой совет: возьмите книгу ООП и будьте готовы переключить свой мозг с функционального программирования на программирование ООП. Вы собираетесь прокатиться.

В C # функции и методы - это две разные вещи. Взгляните, например, наanonymous functions а такжеanonymous methods.
Спасибо, я всегда ценю ответы, которые уходят в корни проблемы. CaTx
0

вы должны сделать так, чтобы вы работали статично

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

Вы можете сделать Program.Add вместо Add Вы также можете создать новый экземпляр программы, выполнив это

Program programinstance = new Program();

Похожие вопросы