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