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#では、「関数」という用語は「メソッド」という用語に置き換えられることがよくあります。この質問のために違いはないので、「関数」という用語を使用します。
他の答えはすでにあなたの問題をfixへの迅速な方法を与えています(ちょうどAdd
をstatic
関数にする) 、しかしその理由を説明したいと思います。
C#には、Cとは根本的に異なる設計パラダイムがあります。そのパラダイムは、オブジェクト指向プログラミング(OOP)と呼ばれます。 OOPと関数型プログラミングの違いをすべて説明することは、この質問の範囲を超えていますが、ここに当てはまる短いバージョンがあります。
プログラムをCで作成すると、2つの数値を追加する関数が作成され、その関数は独立して存在し、どこからでも呼び出し可能になります。 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#では、インスタンスで動作する関数(非静的)とインスタンスで動作しない関数(静的)が区別されます。インスタンス関数は、インスタンスへの暗黙的な参照を持っているため、他のインスタンス関数and静的関数を呼び出すことができます。対照的に、静的関数は静的関数のみを呼び出すことができます。そうでない場合は、非静的関数を呼び出すインスタンスを明示的に提供する必要があります。
public static void Main(string[] args)
は静的であるため、それが呼び出すすべての関数も静的である必要があります。
関数はインスタンス関数または非静的関数であるため、最初にオブジェクトを作成する必要があります。
Program p=new Program();
p.Add(1,1)
注:C#では、「関数」という用語は「メソッド」という用語に置き換えられることがよくあります。この質問のために違いはないので、「関数」という用語を使用します。
それは真実ではない。 (関数型+ラムダ式)、(匿名関数「デリゲート型を使用」)、(アクション型+ラムダ式)、(述語型+ラムダ式)について読むことができます。など...など...これは動作します。
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));
}
}
}
そのビルドエラーは、Program
のインスタンスを持つか、Add
を静的にする必要があることを示しています。
次のようにAdd
キーワードを追加して、static
関数static
を作成します。
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.Addを実行することもできます。次のようにして、プログラムの新しいインスタンスを作成することもできます。
Program programinstance = new Program();
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;
}
エラーが発生する理由は、public int Add(int x, int y);
を使用してmainの前に関数プロトタイプを作成するか、または全体をコピーして貼り付けるだけで、mainで使用した後にadd関数が定義されるためです。主な原因mainの上のAdd
関数は、コンパイラが実行を開始する場所であるため、使用する前に関数を宣言して定義することは意味がありません。 :D