1

静的メソッドはインスタンス フィールドであるフィールドにアクセスできないことはわかっていますが、混乱するのは、非静的メソッドが静的フィールド currentID にアクセスできるのはなぜですか? 以下のコードでは、currentID は静的フィールド、getNextID は静的関数です。驚くべきことに、エラーなしでコンパイルを通過します。

 public class WorkItem
{
// Static field currentID stores the job ID of the last WorkItem that 
// has been created. 
private static int currentID;

//Properties. 
protected int ID { get; set; }
protected string Title { get; set; }
protected string Description { get; set; }
protected TimeSpan jobLength { get; set; }

public WorkItem()
{
    ID = 0;
    Title = "Default title";
    Description = "Default description.";
    jobLength = new TimeSpan();
}

// Instance constructor that has three parameters. 
public WorkItem(string title, string desc, TimeSpan joblen)
{
    this.ID = GetNextID();
    this.Title = title;
    this.Description = desc;
    this.jobLength = joblen;
}

// Static constructor to initialize the static member, currentID. This 
// constructor is called one time, automatically, before any instance 
// of WorkItem or ChangeRequest is created, or currentID is referenced. 
static WorkItem()
{
    currentID = 0;
}


protected int GetNextID()
{
    // currentID is a static field. It is incremented each time a new 
    // instance of WorkItem is created. 
    return ++currentID;
}

}
4

1 に答える 1

5

静的フィールドはコンパイル時の定数に使用されることが多いため、それらに簡単にアクセスできるようにすることは理にかなっています。したがって、それらを囲む型のインスタンスからアクセスできます。

さらに、静的メンバーは、明らかな理由でインスタンス メンバーを参照できません (インスタンスには関連付けられておらず、型にのみ関連付けられています)。しかし、その逆は問題ありません。通常、インスタンスは自身の型を認識しているため、静的メンバーも検索できるからです。

于 2013-01-02T07:26:12.677 に答える