2012-04-16 3 views
14

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

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 

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

Ссылка на объект требуется для нестатических полей, метода, или свойство 'Add_Function.Program.Add (int, int)'

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

+4

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

ответ

44

Примечание: в C# «функция» термин часто заменяется термином «метод». Ради этого вопроса нет разницы, поэтому я просто использую термин «функция».

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

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

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

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

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

+5

Спасибо, я всегда ценю ответы, которые уходят корнями в проблему. – CaTx

+2

В C# функции и методы - это две разные вещи.Посмотрите, например, на [анонимные функции] (https://msdn.microsoft.com/en-us/library/bb882516.aspx) и [анонимные методы] (https://msdn.microsoft.com/ru -us/библиотека/0yw3tz5k.aspx). – igorcadelima

1

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

5

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

static public int Add(int x, int y) 

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

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

+0

Извините, неправильно прочитайте этот бит. Ты прав. – Servy

16

Вы должны либо сделать свой 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); 
+1

Спасибо, всем. Это действительно помогает. – CaTx

0

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

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

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

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

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

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 вместо Добавить Вы также можете создать новый экземпляр программы, идя как этот

Program programinstance = new Program(); 
1

Примечание: в C# термин «функция» часто заменяется термином «метод». Ради этого вопроса нет никакой разницы, поэтому я просто использую термин «функция».

Thats not true. вы можете прочитать о (func type + Lambda expressions), (анонимная функция «с использованием типа делегатов»), (тип действия + выражения лямбда), (тип Predicate + лямбда-выражения). и т.д ... и т.д. ... это будет работать.

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; 
Смежные вопросы