3

C# でのメソッド スコープと、ASP.Net でのベスト ケースの使用法に関するいくつかの関連する質問があります。

  1. C#では、次の違いは何ですか:
    • public staticメソッド _
    • publicメソッド _
    • staticメソッド _
  2. MVCWeb サービスを使用しています。method scope私の質問#1のメソッドスコープに関して、各タイプのメモリ占有の場合、結果としてどのような違いが生じるでしょうか。たとえば、static使用後に関数メモリを解放しますか?
4

6 に答える 6

13

publicそれ自体は、これが外部の呼び出し元(型自体にアクセスできる呼び出し元)がアクセスできるインスタンスベースのメンバーであることを意味します。

staticそれ自体は、メンバーがインスタンスベースではないことを意味します。特定のインスタンス(またはインスタンスさえも)を必要とせずに呼び出すことができます。アクセシビリティ修飾子がないと、非公開と見なされます。そのため、外部の呼び出し元はメンバーにアクセスできません。

public static外部の呼び出し元アクセスできるstaticメソッドです。

メモリ使用量はどちらの場合も同じです。メソッドで宣言された変数はすべて、メソッド呼び出し自体にスコープされます(実装の詳細として:スタックを介して;また:「キャプチャされた変数」はなく、asyncまたはyield使用法はないと想定しています)、

これには、ASP.NET/MVCに固有のものはありません。ただし、コントローラーの「アクション」メソッドは、IIRCであり、パブリック/インスタンスであることが期待されているため修飾子があり、public修飾子がありませんstatic

基本的に:

アクセシビリティ:

  • 指定なし:デフォルトは「プライベート」(または外部クラスの場合は「内部」)
  • 「プライベート」:そのタイプ内のコードでのみ使用可能
  • 「保護された」:そのタイプまたはサブタイプ内のコードで使用可能
  • 「内部」:同じアセンブリでコーディングできます
  • 「保護された内部」:「保護された」または(ユニオン)「内部」のいずれか
  • 「公開」:タイプにアクセスできるすべての発信者が利用できます

静的/など:

  • 指定なし:インスタンスベース。インスタンスが必要であり、コードはインスタンスメンバー(経由this.)およびstaticメンバーに自動的にアクセスできます
  • 「静的」:インスタンスは必要ありません。コードはstaticメンバーにのみ自動アクセスできます
于 2013-01-08T10:19:47.510 に答える
3

クラス メンバーはデフォルトでプライベートであるため、静的メソッドがパブリックであることを指定しないと、クラスの外部からメソッドにアクセスできなくなります。

アクセス修飾子の詳細については、 アクセス修飾子 (C# プログラミング ガイド)を参照してください。

于 2013-01-08T10:10:48.743 に答える
3

アクセス指定子のない静的メソッドはプライベートになります。クラス外からアクセスすることはできません。

次のクラスを検討してください。

class TestClass
{
    public int MyProperty { get; set; }
    static void SomeStaticMethod()
    {
    }

    public static void SomeOtherStaticMethod()
    {
        SomeStaticMethod(); // You can use the static method inside
    }

    public void InstanceMethod()
    {
        SomeStaticMethod();
    }
}

あなたがそれを使用しているとき:

TestClass tc = new TestClass();
tc.InstanceMethod();
TestClass.SomeOtherStaticMethod();
TestClass.SomeStaticMethod(); // Thats an error because SomeStaticMethod is private and not accessible
于 2013-01-08T10:04:12.383 に答える
1

例を提供するのは非常に良いことですが、これらのことはすでにインターネット上で十分に文書化されており、非常に単純な検索で確実な結果を得ることができます。トピックに関するMSDNリファレンスを見つけてください(ちなみに、メンバーアクセスと非インスタンスメンバーは厳密には関連していません)。

まず、特にこの場合、アクセス修飾子があります。public

公衆

タイプまたはメンバーには、同じアセンブリまたはそれを参照する別のアセンブリ内の他のコードからアクセスできます。

これは、メンバーがそうであるかどうかにstatic関係なく、関係ありません。

次に、静的な非インスタンスのものがあります:

静的

静的クラスとクラスメンバーは、クラスのインスタンスを作成せずにアクセスできるデータと関数を作成するために使用されます。静的クラスメンバーを使用して、オブジェクトIDに依存しないデータと動作を分離できます

したがって、違いは、可能なアクセスルールと「インスタンス」ルールの組み合わせです。

メモリ管理は別のものです。アクセスやコンテキストに関係なく、1つのメソッド、プロパティ、フィールドがメモリを魔法のように削減することはありません。これは、開発者がコードの各行で検討する必要があることです(コーディング時にCLRの組み込みメモリ管理の助けを借りて)適切に)。

于 2013-01-08T10:25:19.863 に答える
0

publicアクセス修飾子です。したがって、適用される場所はどこでもスコープを参照します。

于 2013-01-08T10:04:21.387 に答える
-1
static Foo

public ではありません。つまり、クラスの外では見えません。

于 2013-01-08T10:04:49.683 に答える