C#の「静的メソッド」とは何ですか?


177

メソッドに静的キーワードを追加するとはどういう意味ですか?

public static void doSomething(){
   //Well, do something!
}

staticキーワードをクラスに追加できますか?それはどういう意味ですか?


9
単にclass_name.static_method_name();でそのクラスのインスタンスを作成せずに静的メソッドを使用できます。
Javed Akram 2010年

プログラミングレベルでは、クラス/タイプのインスタンスを作成せずに静的メソッドを呼び出すことができるという感覚を得ます。内部的にはそうではありません。CLRは、静的メソッドの呼び出しを管理するために、タイプインスタンスと呼ばれる特別なインスタンスを内部的に管理します。この回答をご覧ください。それはとても興味深いです。
RBT

回答:


313

static関数は、定期的に(とは異なり、インスタンス)関数、クラスのインスタンスに関連付けられていません。

staticクラスのみ含めることができるクラスであるstaticメンバーを、したがってインスタンス化することができません。

例えば:

class SomeClass {
    public int InstanceMethod() { return 1; }
    public static int StaticMethod() { return 42; }
}

を呼び出すInstanceMethodには、クラスのインスタンスが必要です。

SomeClass instance = new SomeClass();
instance.InstanceMethod();   //Fine
instance.StaticMethod();     //Won't compile

SomeClass.InstanceMethod();  //Won't compile
SomeClass.StaticMethod();    //Fine

28
つまり、インスタンスメソッドではなくクラスメソッドのようなものですか。
Moshe

4
@Moshe:その通りです。静的メソッドでは、メソッドを呼び出すためにクラスのインスタンスは必要ありません。クラスだけです。
Binary Worrier 2010年

3
しかし実際には、インスタンスで静的メソッドを呼び出せないようにする技術的な制限があるのでしょうか。コンパイラがそれを許可する場合、アクセス可能になる危険性は何ですか?
kroonwijk 2011

2
@kroon:それは意味がありません。インスタンスメソッドは、実際にはインスタンスを非表示の最初のパラメーターとして受け取ります。静的メソッドにはありません。私のブログ投稿をご覧ください:blog.slaks.net/2011/06/open-delegates-vs-closed-delegates.html
SLaks

ここで、「StaticMethod」はクラスメソッド、「InstanceMethod」はクラスSomeClassのインスタンスメソッドです
Usman Younas

26

別の観点から:単一の文字列にいくつかの変更を加えることを検討してください。たとえば、文字を大文字にするなどです。これらのアクションのために「Tools」という名前の別のクラスを作成します。「Tools」クラスのインスタンスを作成する意味はありません。これは、そのクラス内で使用可能なエンティティの種類がないためです(「Person」または「Teacher」クラスと比較してください)。したがって、インスタンスを作成せずに「Tools」クラスを使用するために静的キーワードを使用し、クラス名(「Tools」)の後にドットを押すと、必要なメソッドにアクセスできます。

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)
    {
        Console.WriteLine(Tools.ToUpperCase("Behnoud Sherafati"));
        Console.ReadKey();
    }
}

public static class Tools
{
    public static string ToUpperCase(string str)
    {
        return str.ToUpper();

    }
}
}

1
「文字列に変更を加える」の使用は悪い例です-文字列は不変であり、変更できません。しかし、そうでなければ、説明は理にかなっています(文字列を不変でないクラスに置き換えます)
Flydog57

13

クラスのインスタンスが作成されていない場合でも、静的メソッド、フィールド、プロパティ、またはイベントはクラスで呼び出すことができます。クラスのインスタンスが作成された場合、それらを使用して静的メンバーにアクセスすることはできません。静的フィールドとイベントのコピーは1つだけ存在し、静的メソッドとプロパティは静的フィールドと静的イベントにのみアクセスできます。静的メンバーは、オブジェクトの状態に応じて変化しないデータまたは計算を表すためによく使用されます。たとえば、数学ライブラリには、正弦と余弦を計算するための静的メソッドが含まれている場合があります。静的クラスメンバーは、membeの戻り値の型の前にstaticキーワードを使用して宣言されます


5

静的関数は、クラス(クラスの特定のインスタンスではなくクラス自体)に関連付けられており、クラスインスタンスが存在しない場合でも呼び出すことができることを意味します。

静的クラスとは、クラスに静的メンバーのみが含まれることを意味します。


5

間もなく、静的クラスをインスタンス化できなくなります。例:

static class myStaticClass
{
    public static void someFunction()
    { /* */ }
}

このようにすることはできません:

myStaticClass msc = new myStaticClass();  // it will cause an error

あなただけが作ることができます:

myStaticClass.someFunction();

0

「静的」キーワードをメソッドに追加する場合、それは、基礎となる実装がクラスのどのインスタンスに対しても同じ結果を与えることを意味します。言うまでもなく、パラメータの値の変化によって結果は異なります。


-1

静的変数はクラスのオブジェクトとリンクしていません。クラス名を使用してアクセスできます。クラスのすべてのオブジェクトは静的変数を共有します。

関数をstaticにすることで、そのファイル内での関数のアクセスを制限します。


-1

すべての呼び出しで共有されるこの(メソッド/ variable / class)のRAMにコピーを1つだけ持つ静的キーワードのコア


-8

staticキーワードは、クラスに適用されると、そのクラスの単一のインスタンスを作成するようコンパイラーに指示します。その場合、クラスの1つ以上のインスタンスを「新規」にすることはできません。静的クラスのすべてのメソッドは、それ自体が静的であると宣言する必要があります。

非静的クラスの静的メソッドを持つことは可能であり、しばしば望ましいことです。たとえば、別のクラスのインスタンスを作成するときのファクトリメソッドは、静的と宣言されることがよくあります。これは、factorメソッドを含むクラスの特定のインスタンスが不要であることを意味するためです。

どのように、いつ、どこで、MSDNを参照してください。


8
いいえ、静的クラスがされて決してインスタンス化しません。その中のすべてが静的であることを考えると、なぜそれをインスタンス化したいのですか?
Jon Skeet、2010年

1
staticクラスは、まったくのインスタンスを持っていません。
SLaks、

4
すみません、わかりません...単一のインスタンスが作成され、新しいインスタンスを作成することはできません。確かに、単一の静的なインスタンスが作成されます。それ以外の場合、コードを呼び出すことはできませんか?
Dave Arkley

2
静的クラスにはインスタンスが1つ、実際には2つあります。それらは単にtheTypeのインスタンスではありません。静的クラスは、ヒープ上に[Foo] Typeオブジェクト(JITのメソッドルックアップテーブルなど)、および初期化に使用される特別なSystem.Typeオブジェクトとして存在します。
mccainz 2013年

クラスは静的に宣言でき、静的なメンバーのみが含まれることを示します。newキーワードを使用して静的クラスのインスタンスを作成することはできません。静的クラスは、クラスを含むプログラムまたは名前空間が読み込まれると、.NET Framework共通言語ランタイム(CLR)によって自動的に読み込まれます。
Satheesh 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.