什麼是G#
G#是我在過去幾個月裡構思出來的一種新的程序設計語言
AOP
AOP或稱面向方面的軟件開發(AOSD)於
AOP通過定義方面(也就是一組行為)來開始
相對於你所熟悉的AOP語言如ASPectJ
基礎
public class Client
{
public Client()
{
Messenger(
}
private void Messenger(string message)
{
Console
}
}
public generator Rename
{
static generation ChangeIt : target Client
{
pre
{
string oldMessage = message;
message =
}
post
{
message = oldMessage;
}
}
}
盡管這個例子沒有任何用途
private void Messenger(string message)
{
// From ChangeIt pre block
string oldMessage = message;
// From ChangeIt pre block
message =
// From the Messenger method body
Console
// From ChangIt post block
message = oldMessage;
}
這個方法因此將向控制台打印
生成器的繼承
我們上面的例子表明
public class Client
{
protected string message;
public Client()
{
ssage =
Messenger(ssage);
}
private void Messenger(string message)
{
onsole
}
}
public generator Base
{
protected virtual generation ChangeIt : target Client
{
pre
{
string message =
}
post
{
ssage = message;
}
}
}
public generator Sub : Base
{
protected override generation ChangeIt : target Client
{
pre
{
base
message = ssage;
}
post
{
ssage = message;
base
}
}
}
下面給出了發出的Messenger方法
private void Messenger(string message)
{
// Base
string ssage =
// Sub
message = ssage;
Console
// Sub
ssage = message;
// Base
ssage = ssage;
}
捕獲
關鍵字capture用於引用在同一個生成的作用域中定義的變量
分節符
為了指出如何發出代碼
pre
{
§ for(int i =
§ {
Console
§ }
}
綠色高亮的代碼在編譯期間將被執行而不是被發出
Console
Console
Console
Console
Console
Console
Console
Console
Console
Console
Console
注意當這幾行代碼被發出時
關鍵字emit
我們已經討論了如何使用關鍵字pre和post來發出代碼
emit
{
Console
}
代碼
pre
{
§ Counter();
}
void Counter()
{
emit
{
Console
}
}
當一個帶有該pre塊的生成被編譯時
此外
pre
{
§ DisplayParts();
}
public emit DisplayParts()
{
emit partOne
partOne
{
§ Injector(partTwo);
Console
§ partTwo
}
return partOne
}
private void Injector(emit target)
{
target
{
Console
}
}
在上面的代碼片斷中
目標
我們已經探討了當以一個方法為目標時如何使用關鍵字pre和post
關鍵字 描述
class 注入目標命名空間中所有的類
namespace 注入目標命名空間中所有的命名空間
set | get 注入目標所定義的所有set和get區域
generator 注入目標所定義的所有生成器
generation 注入目標所定義的所有生成
property 注入目標所定義的所有屬性
method 注入目標所定義的所有方法
public generator Base
{
protected virtual generation ChangeClient : target Client
{
property public string *
{
get
{
post
{
Console
}
}
set
{
pre
{
Console
}
}
}
method (public | protected) * Cl*(*)
{
Console
}
}
}
這裡我們注入了所有類型為string而名字任意的屬性
自適應生成
第二種生成的類型是自適應生成(Adaptive Generation)
比起靜態生成
public class Client
{
protected string message;
public Client()
{
ssage =
Messenger(ssage);
}
public string Message
{
get
{
return ssage;
}
}
private void Messenger(string message)
{
Console
}
}
// Phantom Target
namespace ThirdParty
{
public adaptive generator Input : target Client
{}
}
程序集
// Third Party generator
public generator Security
{
protected adaptive generation CheckInput
: target ThirdParty
{
property public string *
{
get
{
pre
{
value = ValidateInput(value);
}
}
}
method public * *(all string *(input))
{
pre
{
input = ValidateInput(input);
}
}
}
}
在上面的代碼中
現在的CLR能夠在運行時動態地注入IL代碼
現在已經有望解決注入代碼所引發的安全問題了
總結
代碼生成為我們提供了各種可能性
From:http://tw.wingwit.com/Article/program/net/201311/11918.html