亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

寫出優雅簡明代碼的論題集 -- Csharp(C#)篇[1]

2019-11-17 03:35:22
字體:
來源:轉載
供稿:網友

最近和一些朋友討論如何寫出優雅的代碼,我們都很喜歡C#,所以以C#為例。主要一共有三位程序員在一起討論,為簡單起見我用ABC代表我們三個人。

有時候我們會針對一些代碼進行討論,有時候我們會提出一些觀點,有時候我們會一起學習網上一些現有的博客,為了便于大家引用,我給每一個論題都編上號。

在很多情況下,我們的意見統一,那么我會給大家呈現我們的結論;但是有些情況我們有分歧。

你可以加入我們的討論,我非常也希望能夠獲知你的意見,讓我們一起茁壯成長!

好吧,讓我們今天就開始。

論題一:函數越小越好!


相信絕大部分程序員會認同這一點,維護一個超過100行的函數會讓人抓狂。

我記得我以前修改過一個用cobol寫的程序,一個文件超過10萬行,我為了進行一個極其小的修改花了3天的時間,而且最后自己也不知道會不會造成什么嚴重的后果。-- 這已經過去8年了,希望那段代碼運行良好。

到底理想狀態下,我們的函數應該不大于多少行?我們三個人的答案是:

A: 10 行

B: 15 行

C: 20 行

論題二:用 Linq 簡化代碼
Linq有時可以幫助我們寫出一些非?!叭诵浴钡恼Z句。

下面的這個函數是用于在數據庫中插入新的評論:

         public static void Create(IEnumerable<CommentData> Comments, SqlConnection cn)
        {
            // validate params
            if (null == cn) throw new ArgumentNullException("cn");
            if (cn.State != ConnectionState.Open) throw new ArgumentException("Invalid parameter: connection is not open.", "cn");
            if (null == Comments) throw new ArgumentNullException("Comments");
            foreach (CommentData data in Comments)
            {
                if (data.CommentId.HasValue)
                    throw new ArgumentNullException("Create is only for saving new data.  Call save for existing data.", "data");
            }
....
其中foreach這一部分可以簡化為

             if (Comments.Any(data => data.CommentId.HasValue))
            {
                throw new ArgumentNullException("Create is only for saving new data.  Call save for existing data.", "data");
            }


在這一點上,我們存在分歧,A認為沒有必要進行簡化,因為原來的已經很明確了;但B認為簡化后的代碼可讀性更強,看上去更加直接。

  論題三:集合初始值
希望每個人都已經知道C#的這個用法了,直接上一些代碼:

3.1

原始代碼:

 List<int> idsToFind = new List<int>();
idsToFind.Add(1);
idsToFind.Add(2);
修改后:

 List<int> idsToFind = new List<int> {1, 2};
3.2

原始代碼:

 var startingPoint = new Point();
startingPoint.X = 5;
startingPoint.Y = 13;
修改后: var startingPoint = new Point() { X = 5, Y = 13 };
論題四:運用 ?:和??
據說,有些公司會拿這個來測試入門的程序員:

4.1

原始代碼:

 if (c != null)
    System.Console.WriteLine(c.Name);
else
    System.Console.WriteLine("List element has null value.");
修改后:

 System.Console.WriteLine(c != null ? c.Name : "List element has null value.");
4.2

原始代碼:

 string name = value;  
if (value == null)
{
name = string.Empty;
}
修改后:   string name = (value != null) ? value : string.Empty;
還可以更簡單,變成: string name = value ?? string.Empty;
論題五: 運用AS
原始代碼:

 if (employee is SalariedEmployee)

{
    var salEmp = (SalariedEmployee)employee;
    pay = salEmp.WeeklySalary;
    // ...
}
修改后:

 var salEmployee = employee as SalariedEmployee;
if (salEmployee != null)
{
   pay = salEmployee.WeeklySalary;
    // ...
}
論題六: 運用 using
using首次出現是在visual studio 2005 中,在這以前,很多程序員暈倒在了釋放資源的邏輯中。使用using語句實際上生成的IL代碼中是一個try, finally代碼塊,在finally代碼塊里釋放資源。

原始代碼: public IEnumerable<Order> GetOrders()

{
    var orders = new List<Order>();
    var con = new SqlConnection("some connection string");
    var cmd = new SqlCommand("select * from orders", con);
    var rs = cmd.ExecuteReader();
    while (rs.Read())

    {

        // ...

    }
    rs.Dispose();
    cmd.Dispose();
    con.Dispose();
    return orders;
}
這是一段非常丑陋的代碼,我們完全迷失在dispose群中,什么時候要調用哪個dispose??? 天哪? 如果我們用 finally, 可以將代碼寫為:

        public IEnumerable<Order> GetOrders()

{

    SqlConnection con = null;

    SqlCommand cmd = null;

    SqlDataReader rs = null;

    var orders = new List<Order>();

    try

    {

        con = new SqlConnection("some connection string");

        cmd = new SqlCommand("select * from orders", con);

        rs = cmd.ExecuteReader();

        while (rs.Read())

        {

            // ...

        }

    }

    finally

    {

        rs.Dispose();

        cmd.Dispose();

        con.Dispose();

    }

    return orders;

}

看看using到底給我們帶來了什么:

  public IEnumerable<Order> GetOrders()

{

    var orders = new List<Order>();
   using (var con = new SqlConnection("some connection string"))
    {
        using (var cmd = new SqlCommand("select * from orders", con))
        {
            using (var rs = cmd.ExecuteReader())
            {
                while (rs.Read())
                {

                    // ...

                }

            }

        }

    }
    return orders;
} 好多了,對嗎? 完全不用再用那一堆的try/finally 代碼了,也不用使用一堆的null,為了使代碼更輕巧,讓我們再做小小修改:
       public IEnumerable<Order> GetOrders()
{

    var orders = new List<Order>();

    using (var con = new SqlConnection("some connection string"))
    using (var cmd = new SqlCommand("select * from orders", con))
    using (var rs = cmd.ExecuteReader())
    {
        while (rs.Read())
        {
           // ...
        }
    }
    return orders;

}

未完待繼…


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲美女激情视频| 成人网在线免费观看| 日韩中文字幕在线看| 亚洲国语精品自产拍在线观看| 亚洲国产成人爱av在线播放| 少妇高潮久久久久久潘金莲| 日韩精品福利网站| www.日韩系列| 日韩电视剧免费观看网站| 国产福利视频一区二区| 久久亚洲精品中文字幕冲田杏梨| 3344国产精品免费看| 欧美壮男野外gaytube| 欧美激情网友自拍| 日韩中文字幕欧美| 日日摸夜夜添一区| 97人人爽人人喊人人模波多| 日韩av黄色在线观看| 狠狠做深爱婷婷久久综合一区| 亚洲日本欧美中文幕| 亚洲天堂2020| 国产一区二区av| 欧美激情精品久久久久久免费印度| 亚洲最大福利视频网| 2019亚洲男人天堂| 97视频在线观看播放| 欧美精品第一页在线播放| 亚洲在线观看视频| 国产精品久久久av久久久| 中文字幕久久久| 久久精品福利视频| 9.1国产丝袜在线观看| 成人乱色短篇合集| 91av在线免费观看视频| 国产91网红主播在线观看| 久久福利视频网| 亚洲精品久久在线| 亚洲欧美三级伦理| 日韩高清av一区二区三区| 亚洲人成网站777色婷婷| 欧美日韩福利电影| 亚洲国产欧美久久| www.久久久久| 欧美国产亚洲精品久久久8v| 欧美怡春院一区二区三区| 欧美黑人一区二区三区| 国产精品美乳在线观看| 国产成人精品久久二区二区91| 久99九色视频在线观看| 一区二区三区在线播放欧美| 成人黄色片在线| 91色中文字幕| 国产在线观看91精品一区| 久久久久成人网| 欧美中文字幕视频在线观看| 久久精品人人爽| 国产一区二区视频在线观看| 亚洲在线免费视频| 亚洲一区二区三区毛片| 欧美久久精品午夜青青大伊人| 欧美性猛交xxxx免费看漫画| 国产有码在线一区二区视频| 蜜月aⅴ免费一区二区三区| 日韩成人黄色av| 欧美夫妻性生活视频| 91精品国产成人www| 国产精品美女在线| 九九久久久久99精品| 欧美成人性生活| 91精品在线播放| 欧美性色19p| 亚洲电影免费观看高清完整版| 久久久久久久影院| 96精品视频在线| 亚洲精品美女久久久久| 在线观看中文字幕亚洲| 国产精品久久久久91| 奇门遁甲1982国语版免费观看高清| 97视频在线观看播放| 午夜精品久久久久久久白皮肤| 永久免费看mv网站入口亚洲| 国产精品久久91| 精品动漫一区二区| 亚洲偷熟乱区亚洲香蕉av| 亚洲欧美激情视频| 精品亚洲国产成av人片传媒| 自拍偷拍亚洲在线| 91成人在线播放| 美女视频黄免费的亚洲男人天堂| 欧美一级淫片播放口| 中文字幕欧美日韩精品| 美日韩精品免费观看视频| 伊人伊成久久人综合网小说| 亚洲精品一区久久久久久| 国产成人精品综合久久久| 亚洲一区二区自拍| 国产美女久久精品香蕉69| 欧美性xxxxxxx| 欧美福利小视频| 日韩精品丝袜在线| 欧美亚洲在线播放| 欧美在线视频一区二区| 亲子乱一区二区三区电影| 亚洲成人教育av| 欧美激情在线观看视频| 亚洲精品美女在线| 4k岛国日韩精品**专区| 亚洲国产精品va在线看黑人| 日韩不卡中文字幕| 国产精品极品美女粉嫩高清在线| 91国自产精品中文字幕亚洲| 亚洲成人在线视频播放| 成人有码在线播放| 精品国产区一区二区三区在线观看| 91牛牛免费视频| 欧美精品在线免费| 日本一区二区三区在线播放| 自拍偷拍亚洲一区| 久久精品亚洲94久久精品| 成人有码视频在线播放| 成人xvideos免费视频| 欧美亚洲一区在线| 91美女片黄在线观看游戏| 国产一区二区丝袜高跟鞋图片| 欧美日韩一区二区三区| 国内精品久久久久影院 日本资源| 77777亚洲午夜久久多人| 久久久久中文字幕| 国产精品99久久99久久久二8| 欧美久久精品一级黑人c片| 成人午夜在线影院| 欧美黑人巨大xxx极品| 韩国日本不卡在线| 国产有码在线一区二区视频| 日韩美女在线观看一区| 欧美精品18videos性欧美| 亚洲一区二区福利| 久久久久久有精品国产| 亚洲精品日韩激情在线电影| 国产精品久久久久久久7电影| 国产日产欧美精品| 一区二区三区无码高清视频| 亚洲人成网站色ww在线| 欧美日韩性视频| 日韩欧美在线国产| 国产日韩欧美在线视频观看| 国产福利精品av综合导导航| 色悠久久久久综合先锋影音下载| 欧美日韩激情视频8区| 久久久久久久999| 亚洲欧美一区二区三区在线| 亚洲一区第一页| 57pao成人永久免费视频| 欧美成人激情视频免费观看| 国产一区二中文字幕在线看| 日韩三级影视基地| 91地址最新发布| 亚洲成人亚洲激情| 国产精品久久久久久久av大片| 日本欧美黄网站| 在线观看91久久久久久| 欧美成年人在线观看| 欧美精品videossex88| 欧美精品情趣视频|