2010-08-24 80 views
3

我想知道是否有可能在C#中實現自己的語言結構(如鎖或foreach)?我們可以在C#中編寫自己的語言結構嗎?

背後的想法是,我想標記一個操作塊的開始和結束。 代替書寫

startblock("blockname"); 
    blabla(); 
    andsoon(); 
endblock(); 

我想寫點東西像

block("blockname"){ 
    blabla(); 
    test(); 
} 

謝謝!

+1

您的示例中應該包含哪些語義?現有的語言結構已經可以很容易地表達許多東西,大多數時候不需要爲語言添加東西。 – 2010-08-24 09:32:37

+0

它只用於追蹤。我想跟蹤一條指令之前的開始消息,並在此塊之後跟蹤一條結束消息,因此我的跟蹤查看器可以將塊內的所有元素組合在一起。 例如,我跟蹤一個名爲「計算髮票」的開始消息,然後執行所有操作,然後跟蹤結束消息,以便塊關閉。 我不想使用明確的「開始」和「結束」功能,因爲人們往往會忘記其中之一... – Dominik 2010-08-24 11:02:29

回答

8

爲此您需要使用它嗎?只是爲了清晰寫作和乾淨的代碼? C#不是可擴展的語言。 隨着使用,你可以做到這一點很好:

using (new Context("block name")) 
{ 
    // do your staff here 
} 

class Context : IDisposable 
{ 
    public Context(string name) 
    { 
     // init context 
    } 

    public void Dispose() 
    { 
     // finish work in context 
    } 
} 
16

不,你不能。但有一種解決方法,使用IDisposable。您可以創建一個代表構造函數和塊結束的塊開始的類,其編號爲Dispose。然後將代碼包裝到using中。更多在這裏:

+0

+1濫用'IDisposable'來標記代碼區域對我來說工作得很好。 – 2010-08-24 09:37:40

+0

快速問題,IDisposable只能在使用塊權限內工作,否則在垃圾收集時會調用它? – 2010-08-24 09:38:45

+1

@Akash - 它不會強制你使用using塊,所以仍然可以忘記調用Dispose()。 Dispose()與GC無關 - 當一個對象被GC收集時,調用Finalize()/〜this()。 – 2010-08-24 09:44:58

9

另一種選擇是傳遞一個函數來處理程序。

private void block(string name, Action action) 
{ 
    startblock(name); 
    action(); 
    endblock(); 
} 

其次:

block("blockname",() => 
       { 
        blabla(); 
        test(); 
       }); 

請記住,這可能是你需要一個抽象類(或普通基類)的指示,並允許該方法的重載。

+0

+1你很快,我只是打字相同的答案:) – 2010-08-24 09:33:22

+0

@Akash卡瓦 - 不是太快。我花了我好幾分鐘,我想確保它編譯':)' – Kobi 2010-08-24 09:35:20

+0

我想你的意思是'startblock(name)' – 2010-08-24 09:36:35

1

Nemerle提供結構是這樣的。它與C#不太相似。

+1

NEmerle非常活躍。我們現在正在努力研究Nemerle 2.0 – user67754 2010-08-24 12:17:33

+0

@reverseblade:很好奇,看起來大多數.NET langs正在死亡(就像我的IronScheme)。 C#必須足夠:) – leppie 2010-08-24 12:27:00

+1

+1我創建了[一個帖子](http://codecrafter.blogspot.com/2011/04/more-macros-in-nemerle.html),它解決了Nemerle中的確切問題。 – 2011-05-14 19:54:54

相關問題