1. 程式人生 > >非靜態的欄位、方法或屬性……要求物件引用【學習】要求物件引用?

非靜態的欄位、方法或屬性……要求物件引用【學習】要求物件引用?

 首先看一段程式碼:

using System;
public class TestDelegate
{
 delegate void DG(string str);
 public void Speaking(string strContent)
 {
  Console.WriteLine(strContent);
 }
 public void SayGoodBye(string strName)
 {
  Console.WriteLine("Goodbye,"+strName);
 }
 public void SayWelCome(string strName)
 {
  Console.WriteLine("Welcome,"+strName);
 }
 static void Main(string[] args)
 {
  DG a=new DG(SayWelCome);
  DG b=new DG(Speaking);
  DG c=new DG(SayGoodBye);
  Person ps=new Person("隴上煙雨劍");
  a(ps.Name);
  b("您好!");
  c(ps.Name);
 }

};

public class Person
{
 public string strName=null;
 public Person()
 {
  this.Name="";
 }
 public Person(string stringName)
 {
  this.Name=stringName;
 }
 public string Name//例項化以後就具有的屬性
 {
  get
  {
   return strName;
  }
  set
  {
   strName=value;
  }
 }
};

在編譯的工程中會報這樣的錯誤:

TD.cs(19,15): error CS0120:
        非靜態的欄位、方法或屬性“TestDelegate.SayWelCome(string)”要求物件引用
TD.cs(20,15): error CS0120:
        非靜態的欄位、方法或屬性“TestDelegate.Speaking(string)”要求物件引用
TD.cs(21,15): error CS0120:
        非靜態的欄位、方法或屬性“TestDelegate.SayGoodBye(string)”要求物件引用

     這是為什麼呢?

    我們知道,類裡面的方法有兩種表現:一種是直接可以來用的,還有一種是必須例項化以後才能使用的。前者要求在方法宣告的時候必須加上static關鍵字(是不是想起Main方法了???),因為這個方法不能被例項化!後者就不能加static了,這種方法不能像前面的一樣通過類名.方法名來呼叫,必須通過例項名.方法名來呼叫(例項化的過程就是建立一個物件嘛--這是廢話)。

    清楚了這一點,改起來就容易了!

下面給出正確的程式碼:

using System;
public class TestDelegate
{
 delegate void DG(string str);
 public void Speaking(string strContent)
 {
  Console.WriteLine(strContent);
 }
 public void SayGoodBye(string strName)
 {
  Console.WriteLine("Goodbye,"+strName);
 }
 public void SayWelCome(string strName)
 {
  Console.WriteLine("Welcome,"+strName);
 }
 static void Main(string[] args)
 {
  TestDelegate td=new TestDelegate();
  DG a=new DG(td.SayWelCome);
  DG b=new DG(td.Speaking);
  DG c=new DG(td.SayGoodBye);
  Person ps=new Person("隴上煙雨劍");
  a(ps.Name);
  b("您好!");
  c(ps.Name);
 }

};

public class Person
{
 public string strName=null;
 public Person()
 {
  this.Name="";
 }
 public Person(string stringName)
 {
  this.Name=stringName;
 }
 public string Name//例項化以後就具有的屬性
 {
  get
  {
   return strName;
  }
  set
  {
   strName=value;
  }
 }
};

執行結果:

Welcome,隴上煙雨劍
您好!
Goodbye,隴上煙雨劍