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# 中,术语"函数"通常被术语"方法"替换。为了这个问题,没有区别,所以我只使用术语"函数"。
其他答案已经为您提供了一种解决问题的快速方法(只需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();
创建一个函数原型,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;