18

我需要 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 不同,我称它的方式是错误的吗?谢谢。

4

11 回答 11

50

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

其他答案已经为您提供了解决问题的快速方法(只需创建Add一个static函数),但我想解释一下原因。

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

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

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

我的建议:拿起一本面向对象编程的书,准备好将你的大脑从函数式编程转向面向对象编程。你是来兜风的。

于 2012-04-16T14:08:03.240 回答
19

您应该像这样使您的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);
于 2012-04-16T13:49:23.110 回答
6

此代码给您一个错误,因为您的Add功能需要static

static public int Add(int x, int y)

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

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

于 2012-04-16T13:49:08.813 回答
2

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

Program p=new Program();
p.Add(1,1)
于 2012-04-16T13:51:18.140 回答
1

该构建错误告诉您的是,您必须拥有一个实例Program或使其成为Add静态的。

于 2012-04-16T13:49:02.517 回答
1

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

这不是真的。您可能会读到(func 类型+ 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));

        }

     }
}
于 2014-03-31T06:30:22.347 回答
0

只需通过添加如下关键字来创建您的Add函数:staticstatic

public static int Add(int x, int y)
于 2012-04-16T13:50:25.923 回答
0

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

于 2013-06-23T10:19:49.293 回答
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 实例

Program programinstance = new Program();
于 2014-01-18T17:58:16.573 回答
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;
    }
于 2017-12-14T21:47:19.783 回答
-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;
于 2017-12-14T21:48:38.910 回答