0

私はVS2010でこの簡単なサンプルを持っています:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            AbsClass absClass = new ConClass();
            // I have tried this also and the error is different:
            // ConClass absClass = new ConClass();
            absClass.Id = "first";
            Console.WriteLine(absClass.Id);
            MyMethod(ref absClass);  // <<- ERROR.
            Console.WriteLine(absClass.Id);
            Console.ReadKey();
        }

        public void MyMethod(ref AbsClass a)
        {
            a.Id = "new";
        }
    }

    public abstract class AbsClass
    {
        public string Id { get; set; }
    }

    public class ConClass : AbsClass { }
}

これが正しくビルドできない理由を知りたいです。

4

2 に答える 2

4

MyMethod静的にする必要があります:

    public static void MyMethod(ref AbsClass a)
    {
        a.Id = "new";
    }

問題は抽象クラスではなく、「問題」は静的Mainメソッドです。静的メソッドにはインスタンスがないため、インスタンス メソッドを呼び出すことはできません。

静的クラスと静的メンバーの msdn

于 2011-03-30T23:00:50.360 に答える
0

MyMethodメソッドを静的にする必要があります。

public static MyMethod(ref AbsClass a)
{
    a.Id = "new";
}

Programまたは、できれば、クラスのインスタンスを作成し、MyMethodそのインスタンスから呼び出します。

Program p = new Program();
p.MyMethod(ref abs);

最初のメソッドが機能する理由は、Mainメソッドが静的とマークされており、Programクラスのインスタンスに関連付けられていないためです。.NET Framework CLR は、アセンブリを検索してMain、 の配列を受け取るという名前の静的メソッドを探しString、その関数をエントリ ポイントにします。多くのチュートリアルや MSDN のコード サンプルでさえ、クラスを static キーワードでマークしていることに気付くでしょう。Programこれは、クラス内のすべてのメソッドに静的メソッドのみが含まれる場合のベスト プラクティスと見なされます。

2 番目の方法が機能する理由、およびこの方法が好まれる理由は、インスタンス メソッドMyMethodとして定義したためです。基本的に、インスタンス メソッドを実行するには、オブジェクトのインスタンスが必要です。キーワードは、指定された型のインスタンスを作成します。静的メソッドは、オブジェクトのインスタンスなしで呼び出すことができますが、非静的インスタンス メンバー (プロパティ、プライベート/パブリック変数など) にアクセスすることもできません。通常、ユーティリティ クラスを実装する、拡張メソッドを利用する、またはヘルパー メソッドを提供する必要がない限り、静的メソッドとクラスは避けます。new

于 2011-03-30T23:20:21.210 に答える