web-dev-qa-db-ja.com

C#関数の作成と使用

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とは異なり、私がそれを呼び出す方法が間違っているためですか?ありがとう。

17
CaTx

注:C#では、「関数」という用語は「メソッド」という用語に置き換えられることがよくあります。この質問のために違いはないので、「関数」という用語を使用します。

他の答えはすでにあなたの問題をfixへの迅速な方法を与えています(ちょうどAddstatic関数にする) 、しかしその理由を説明したいと思います。

C#には、Cとは根本的に異なる設計パラダイムがあります。そのパラダイムは、オブジェクト指向プログラミング(OOP)と呼ばれます。 OOPと関数型プログラミングの違いをすべて説明することは、この質問の範囲を超えていますが、ここに当てはまる短いバージョンがあります。

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

staticキーワードを使用して、人々があなたに提供したソリューションは、その設計を迂回します。 staticキーワードを使用することは、「ねえ、私が定義しているこの関数はコンテキスト/状態を必要とせず、単に呼び出すことができます」というようなものです。 Add関数は非常に単純なので、これは理にかなっています。 OOPを深く掘り下げていくと、関数がより複雑になり、それらの状態/コンテキストを知ることに依存していることがわかります。

私のアドバイス:OOP本を手に取り、あなたの脳を関数型プログラミングからOOPプログラミングに切り替える準備をしてください。あなたは乗っています。

49
ean5533

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);
17
Tony The Lion

Add関数はstaticである必要があるため、このコードではエラーが発生します。

_static public int Add(int x, int y)
_

C#では、インスタンスで動作する関数(非静的)とインスタンスで動作しない関数(静的)が区別されます。インスタンス関数は、インスタンスへの暗黙的な参照を持っているため、他のインスタンス関数and静的関数を呼び出すことができます。対照的に、静的関数は静的関数のみを呼び出すことができます。そうでない場合は、非静的関数を呼び出すインスタンスを明示的に提供する必要があります。

public static void Main(string[] args)は静的であるため、それが呼び出すすべての関数も静的である必要があります。

6
dasblinkenlight

関数はインスタンス関数または非静的関数であるため、最初にオブジェクトを作成する必要があります。

Program p=new Program();
p.Add(1,1)
2
Hussein Zawawi

注: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));

        }

     }
}
1
user3479886

そのビルドエラーは、Programのインスタンスを持つか、Addを静的にする必要があることを示しています。

1
Daniel A. White

次のようにAddキーワードを追加して、static関数staticを作成します。

public static int Add(int x, int y)
0
Bali C

このように静的に機能させる必要があります

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();
0
trinalbadger587
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;
    }
0
TechNerdGamer

エラーが発生する理由は、public int Add(int x, int y);を使用してmainの前に関数プロトタイプを作成するか、または全体をコピーして貼り付けるだけで、mainで使用した後にadd関数が定義されるためです。主な原因mainの上のAdd関数は、コンパイラが実行を開始する場所であるため、使用する前に関数を宣言して定義することは意味がありません。 :D

0
ANXIOUS117