程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> 分析一段超精簡C#程序代碼

分析一段超精簡C#程序代碼

編輯:C#基礎知識

  一直以來我們都希望我們的代碼在不影響可讀、可維護、可移植等條件下盡可能的短小精悍。
      對於編程發燒友來說將代碼的精簡做極致,往往會比較變態,今天我也變了一把,時刻准備著各位拍磚。

      事情是這樣的,有個朋友說他寫了個彩票機先程序,然後群裡開始討論他的代碼,後來談到是否可以精簡,有人說80行,有人說60行。問到筆者這裡,我想應該10行左右,怎麼樣算一行呢,一個分號算一行吧,不包含命名空間。
      需求是這樣的, 
      1、從1-33裡隨機取出7個數據,從小到大排列;
      2、再從1-16隨機選中一個數字,作為特別號碼,組成最後的彩票號碼;
      3、用Windows應用程序,點擊開始,滾動號碼,點擊停止,停止號碼滾動。

      於是就動手開始寫吧,從一開始15個分號,到12個分號,最後到8個分號,算是一個比較成型的代碼吧:
   1 using System;
 2 using System.Windows.Forms;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 
 6 class Program
 7 {
 8     static void Main(string[] args)
 9     {
10         new Func<Form, Random, Form>((f, r) =>
11         {
12             f.Controls.AddRange(new Control[] { new Button { Text = "start", Top = 50 }, new Label { AutoSize = true } });
13             ((Button)f.Controls[0]).Click += (sender, e) =>{
14                 new Action<int>((ni) =>
15                 {
16                     ((Button)sender).Text = ((Button)sender).Text == "stop" ? "start" : "stop";
17                     while (f.Controls[0].Text == "stop") { f.Controls[1].Text = new int[33].Select(i => ni > 33 ? ni = 1 : ni++).Distinct().OrderBy(i => r.Next(33)).Take(7).OrderBy(i => i).ToList().Aggregate<int, string>(string.Empty, (s, i) => s + " - " + i.ToString()).Substring(3) + " = " + r.Next(1, 17).ToString(); Application.DoEvents(); }
18                 })(1);};
19             return f;
20         })(new Form { Text = "xxxx" }, new Random()).ShowDialog();
21     }
22 }
23
 

運行結果就是這樣子:
      

      代碼中,為了盡可能少的分號,將臨時變量的定義放進了委托調用的參數中,為了使委托也變少,將Click事件處理程序委托中的臨時變量直接用sender中的某個成員,於是有了以下7個分號的代碼,就顯得比較變態了。
      

 1 class Program
 2 {
 3     static void Main(string[] args)
 4     {
 5         new Func<Form, Random, Form>((f, r) =>
 6         {
 7             f.Controls.AddRange(new Control[] { new Button { Text = "start", Top = 50 }, new Label { AutoSize = true } });/*分號甲*/
 8             ((Button)f.Controls[0]).Click += (sender, e) =>{
 9                 ((Button)sender).Text = ((Button)sender).Text == "stop" ? "start" : "stop";/*分號乙*/
10                 while (f.Controls[0].Text == "stop") { f.Controls[1].Text = new int[33].Select(i => ((Control)sender).Tag is int && (int)((Control)sender).Tag < 33 ? (int)(((Control)sender).Tag = ((int)((Control)sender).Tag) + 1) : (int)(((Control)sender).Tag = 0) + 1).Distinct().OrderBy(i => r.Next(33)).Take(7).OrderBy(i => i).ToList().Aggregate<int, string>(string.Empty, (s, i) => s + " - " + i.ToString()).Substring(3) + " = " + r.Next(1, 17).ToString();/*分號丙*/ Application.DoEvents();/*分號丁*/ }};/*分號戊*/
11             return f;/*分號己*/
12         })(new Form { Text = "xxxx" }, new Random()).ShowDialog();/*分號庚*/
13     }
14 }
15
 

這是筆者目前能想到最精簡的代碼,運行效果和之前一致。
      今天比較無聊,純屬娛樂,很多為了減少分號出現的伎倆並不適合在真實開發中使用。
      如果有哪位朋友有更少分號的實現,歡迎共享之。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved