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 でプログラムを作成すると、2 つの数値を加算する関数が作成され、その関数は独立して存在し、どこからでも呼び出すことができます。C# では、ほとんどの関数は独立して存在しません。代わりに、それらはオブジェクトのコンテキストに存在します。コード例では、クラスのインスタンス (オブジェクト) のみProgramが実行方法を知っていますAdd。別の言い方をすれば、 のインスタンスを作成してから、を実行するようにProgram依頼する必要があります。ProgramAdd

staticキーワードを使用して人々があなたに与えた解決策は、そのデザインを迂回します。このstaticキーワードを使用することは、「私が定義しているこの関数は、コンテキストや状態を必要とせず、呼び出すだけでよい」と言っているようなものです。関数は非常に単純なのでAdd、これは理にかなっています。OOP を深く掘り下げ始めると、関数がより複雑になり、その状態/コンテキストを知ることに依存していることに気付くでしょう。

私のアドバイス: OOP の本を手に取り、脳を関数型プログラミングから 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 型 + ラムダ式)、(匿名関数「デリゲート型を使用する」)、(アクション型 + ラムダ式)、(述語型 + ラムダ式) について読むことができます。など...など...これは機能します。

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

エラーが発生する理由は、関数プロトタイプを作成する前に関数プロトタイプを作成する場合、追加関数がメインで使用した後に定義されているためpublic int Add(int x, int y);ですAdd。コンパイラは実行を開始するので、関数を使用する前に関数を宣言して定義するのは意味がありません。:D

于 2013-06-23T10:19:49.293 に答える