我想知道是否有可能在C#中實現自己的語言結構(如鎖或foreach)?我們可以在C#中編寫自己的語言結構嗎?
背後的想法是,我想標記一個操作塊的開始和結束。 代替書寫
startblock("blockname");
blabla();
andsoon();
endblock();
我想寫點東西像
block("blockname"){
blabla();
test();
}
謝謝!
我想知道是否有可能在C#中實現自己的語言結構(如鎖或foreach)?我們可以在C#中編寫自己的語言結構嗎?
背後的想法是,我想標記一個操作塊的開始和結束。 代替書寫
startblock("blockname");
blabla();
andsoon();
endblock();
我想寫點東西像
block("blockname"){
blabla();
test();
}
謝謝!
爲此您需要使用它嗎?只是爲了清晰寫作和乾淨的代碼? 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
}
}
不,你不能。但有一種解決方法,使用IDisposable
。您可以創建一個代表構造函數和塊結束的塊開始的類,其編號爲Dispose
。然後將代碼包裝到using
中。更多在這裏:
+1濫用'IDisposable'來標記代碼區域對我來說工作得很好。 – 2010-08-24 09:37:40
快速問題,IDisposable只能在使用塊權限內工作,否則在垃圾收集時會調用它? – 2010-08-24 09:38:45
@Akash - 它不會強制你使用using塊,所以仍然可以忘記調用Dispose()。 Dispose()與GC無關 - 當一個對象被GC收集時,調用Finalize()/〜this()。 – 2010-08-24 09:44:58
另一種選擇是傳遞一個函數來處理程序。
private void block(string name, Action action)
{
startblock(name);
action();
endblock();
}
其次:
block("blockname",() =>
{
blabla();
test();
});
請記住,這可能是你需要一個抽象類(或普通基類)的指示,並允許該方法的重載。
+1你很快,我只是打字相同的答案:) – 2010-08-24 09:33:22
@Akash卡瓦 - 不是太快。我花了我好幾分鐘,我想確保它編譯':)' – Kobi 2010-08-24 09:35:20
我想你的意思是'startblock(name)' – 2010-08-24 09:36:35
Nemerle提供結構是這樣的。它與C#不太相似。
您的示例中應該包含哪些語義?現有的語言結構已經可以很容易地表達許多東西,大多數時候不需要爲語言添加東西。 – 2010-08-24 09:32:37
它只用於追蹤。我想跟蹤一條指令之前的開始消息,並在此塊之後跟蹤一條結束消息,因此我的跟蹤查看器可以將塊內的所有元素組合在一起。 例如,我跟蹤一個名爲「計算髮票」的開始消息,然後執行所有操作,然後跟蹤結束消息,以便塊關閉。 我不想使用明確的「開始」和「結束」功能,因爲人們往往會忘記其中之一... – Dominik 2010-08-24 11:02:29