非靜態的欄位、方法或屬性……要求物件引用【學習】要求物件引用?
首先看一段程式碼:
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,隴上煙雨劍