超精简C#程序代码改进-利用扩展方法简化代码增强可读性

本文介绍了一种利用C#扩展方法精简代码的方法,通过一个实际案例展示了如何使用自定义扩展方法来串联多个操作,使得代码更加简洁易读。
今天在园子里面发现一篇文章 超精简C#程序代码 ,看了之后很是震撼,花了好长时间基本看明白了。随后又有了一些新的想法。
最近一直在思考扩展方法的应用,与这篇文章中的想法一接合,可将代码进一步精简,并可增强可读性。
先看代码(仅用了三个分号):
ContractedBlock.gif ExpandedBlockStart.gif Program
static class Program
ExpandedBlockStart.gifContractedBlock.gif
{
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
    
/// 先执行命令,再返回自身
    
/// </summary>

    public static T Do<T>(this T t, Action<T> action)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        action(t);
        
return t;
    }


    
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
new Form()
            .Do(f => f.Tag = new Random())
ExpandedSubBlockStart.gifContractedSubBlock.gif
            .Do(f => f.Controls.Add(new Label { AutoSize = true }))
            .Do(f => f.Controls.Add(
ExpandedSubBlockStart.gifContractedSubBlock.gif                
new Button { Text = "start", Top = 50 }
                    .Do(button => button.Click += (sender, e) => button
                         .Do(_button => _button.Text = (_button.Text == "stop"? "start" : "stop")
                         .Do(_b =>
ExpandedSubBlockStart.gifContractedSubBlock.gif                             
{
                                 
while (f.Controls[1].Text == "stop" &&
                                      (f.Controls[0as Label)
                                            .Do(
                                                l => l.Text =
                                                    
string.Join(" - ",
                                                        
new string[33]
                                                              .Select((i, j) => (j + 1).ToString("d2"))
                                                              .OrderBy(i => (f.Tag as Random).Next(33))
                                                              .Take(7)
                                                              .OrderBy(i => i)
                                                              .ToArray()
                                                        )
                                                    
+ " = " + (f.Tag as Random).Next(117)
                                                    )
                                          .Do(l => Application.DoEvents())
                                          
!= null
ExpandedSubBlockStart.gifContractedSubBlock.gif
                                          ) { }
                             }

                        )
                    )//button.AddReturn、
                )// AddControl(B=new Button)
            )
           .ShowDialog();
    }

}

 

 

首先,看看这个扩展方法:
1 ExpandedBlockStart.gif ContractedBlock.gif      /**/ /// <summary>
2    /// 先执行命令,再返回自身
3    /// </summary>

4      public   static  T Do < T > ( this  T t, Action < T >  action)
5 ExpandedBlockStart.gifContractedBlock.gif     {
6        action(t);
7        return t;
8    }
这个方法先让t做一件事action,然后返回自身,通过这个扩展可以把很多代码串起来,如:
ContractedBlock.gif ExpandedBlockStart.gif DoExample
 1        private static void DoExample()
 2ExpandedBlockStart.gifContractedBlock.gif        {
 3            //常规代码
 4            Form form = new Form();
 5            form.Text = "Text";
 6            form.TopMost = true;
 7            form.WindowState = FormWindowState.Maximized;
 8            form.Tag = "Tag";
 9            form.ShowDialog();
10            //精简代码
11            new Form()
12                .Do(f => f.Text = "Text")
13                .Do(f => f.TopMost = true)
14                .Do(f => f.WindowState = FormWindowState.Maximized)
15                .Do(f => f.Tag = "Tag")
16                .ShowDialog();
17        }
以上代码中,通过Do扩展将对form操作的多条语句串成一句。作为示例只串了5条,再串上更多也没问题。这样代码写起来精练清晰。
Do也可以夹杂上其它代码,但这样会影响代码清晰,如下:
ContractedBlock.gif ExpandedBlockStart.gif DoExample_Bad
1        private static void DoExample_Bad()
2ExpandedBlockStart.gifContractedBlock.gif        {
3            new Form()
4                .Do(f => Console.WriteLine("ABC"))
5                .Do(f => Application.DoEvents())
6                .ShowDialog();
7        }
虽然也能执行,但看起来就累了。


明白了Do扩展 ,再来看看前面的代码,先去除一部分,看看整体结构:
ContractedBlock.gif ExpandedBlockStart.gif Main
    static void Main(string[] args)
    {
        
new Form()
            .Do(f => f.Tag = new Random())
            .Do(f => f.Controls.Add(new Label { AutoSize = true }))
            .Do(f => f.Controls.Add(new Button  )
           .ShowDialog();
    }
再来看看 Button 部分

ContractedBlock.gif ExpandedBlockStart.gif new Button
1ExpandedBlockStart.gifContractedBlock.gif        new Button { Text = "start", Top = 50 }                                                                            
2            .Do(button => button.Click += (sender, e) => 
3                 button                                              
4                     .Do(_button => _button.Text = (_button.Text == "stop"? "start" : "stop")
5                     .Do(_b =>生成并显示)
6            )
再就是生成并显示,是一个循环
1          while  (f.Controls[ 1 ].Text  ==   " stop "   &&
2               (f.Controls[ 0 as  Label).Do(生成并显示).Do(l  =>  Application.DoEvents())  !=   null   // 条件二
3               )
4 ExpandedBlockStart.gifContractedBlock.gif               {}
条件二永远为真 ,加在这里为了节省分号。条件二Do里面的 生成并显示如下:
ContractedBlock.gif ExpandedBlockStart.gif Code
 1=> l.Text = 
 2    string.Join(" - ",
 3        new string[33]
 4              .Select((i, j) => (j + 1).ToString("d2"))
 5              .OrderBy(i => (f.Tag as Random).Next(33))
 6              .Take(7)
 7              .OrderBy(i => i)
 8              .ToArray()
 9        )
10    + " = " + (f.Tag as Random).Next(117)
这里用string.Join代替Aggregate, 显得清晰了一些。
使用Select((i,j)=>...)代替原文中Tag作为变量,也大大简化清晰了代码。
其它不多说了。


这篇文章主要目的是介绍扩展方法的一个应用:简化,清晰代码!

转载于:https://www.cnblogs.com/superlee/archive/2009/08/07/1540948.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值