C# 创建和使用函数

本文关键字:函数 创建 | 更新日期: 2023-09-27 18:31:12

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

C# 创建和使用函数

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

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

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

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

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

我的建议:拿起一本OOP书,准备把你的大脑从函数式编程切换到OOP编程。你来兜风了。

你应该让你的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);

这段代码给你一个错误,因为你的Add函数需要static

static public int Add(int x, int y)

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

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

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

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

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

注意:在 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));
        }
     }
}
只需通过

添加 static 关键字来static Add函数,如下所示:

public static int Add(int x, int y)
你必须

像这样让你的函数静态

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 programinstance = new Program();
您出现错误的原因是,如果您要在 main 之前创建一个函数原型,则在 main 中使用 main 之前

创建一个函数原型,public int Add(int x, int y);或者您可以复制并粘贴整个 Add 函数在 main 上 main 的原因 main 是编译器开始执行的地方,所以在使用之前声明和定义一个函数是否有意义希望帮助。: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;