C#创建和使用函数

时间:2012-04-16 13:47:12

标签: c# function

我需要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()的行上给出了这个错误:

  

非静态字段,方法或属性'Add_Function.Program.Add(int,int)'

需要对象引用

任何人都可以向我解释为什么我有这个问题。这是因为C#的架构与C不同,我称它的方式是错的吗?感谢。

11 个答案:

答案 0 :(得分:48)

注意:在C#中,术语“函数”通常被术语“方法”取代。为了这个问题没有区别,所以我只使用术语“功能”。

其他答案已经为您提供了修复问题的快捷方法(只需使Add成为static函数),但我想解释原因。

C#具有与C完全不同的设计范例。该范例被称为面向对象编程(OOP)。解释OOP和函数式编程之间的所有差异超出了本问题的范围,但这是适用于您的简短版本。

用C编写程序,你可以创建一个添加两个数字的函数,该函数可以独立存在,可以从任何地方调用。在C#中,大多数函数不是独立存在的;相反,它们存在于对象的上下文中。在示例代码中,只有类Program的实例(对象)知道如何执行Add。换句话说,您必须创建Program的实例,然后让Program为您执行Add

人们使用static关键字为您提供的解决方案绕过该设计。使用static关键字有点像说,“嘿,我定义的这个函数不需要任何上下文/状态,它只能被调用。”由于您的Add函数非常简单,因此这是有道理的。当你开始深入研究OOP时,你会发现你的函数变得更加复杂并依赖于了解它们的状态/上下文。

我的建议:拿起一本OOP书,准备将你的大脑从功能编程转换为OOP编程。你在旅途中。

答案 1 :(得分: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);

答案 2 :(得分:6)

此代码会给您一个错误,因为您的Add函数需要static

static public int Add(int x, int y)

在C#中,对实例(非静态)操作的函数和不对实例(静态)进行操作的函数之间存在区别。实例函数可以调用其他实例函数静态函数,因为它们具有对实例的隐式引用。相反,静态函数只能调用静态函数,否则它们必须显式提供一个实例来调用非静态函数。

由于public static void Main(string[] args)是静态的,因此它调用的所有函数也必须是静态的。

答案 3 :(得分:2)

因为你的函数是实例或非静态函数,所以你应该首先创建一个对象。

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

答案 4 :(得分:1)

该构建错误告诉您,您必须拥有Program的实例或使Add静态。

答案 5 :(得分:1)

  

注意:在C#中,术语“函数”通常被术语“方法”取代。为了这个问题没有区别,所以我只使用术语“功能”

这不是真的。你可以阅读(func type + Lambda表达式),(匿名函数“使用委托类型”),(动作类型+ Lambda表达式),(谓词类型+ Lambda表达式)。等...等... 这将有效。

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

        }

     }
}

答案 6 :(得分:0)

只需添加Add关键字,就可以使static功能成为static

public static int Add(int x, int y)

答案 7 :(得分:0)

您遇到错误的原因是因为您在main中使用它后定义了add函数,如果您要使用public int Add(int x, int y);在它上面创建一个函数原型,或者您可以复制并粘贴您的主要原因上面的整个Add函数是编译器开始执行的地方,因此在使用之前声明和定义函数是有意义的希望有所帮助。 :d

答案 8 :(得分: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();

答案 9 :(得分: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;
    }

答案 10 :(得分:-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;