亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在C?;?NET中最糟糕的陷阱是什么?

在C#或.NET中最糟糕的陷阱是什么?

紅糖糍粑 2020-02-03 14:05:53
我最近正在處理一個DateTime對象,并編寫了如下內容:DateTime dt = DateTime.Now;dt.AddDays(1);return dt; // still today's date! WTF?的intellisense文檔AddDays()說,它在日期上添加了一天,但實際上并沒有-實際返回的日期中添加了一天,因此您必須這樣寫:DateTime dt = DateTime.Now;dt = dt.AddDays(1);return dt; // tomorrow's date之前,這已經咬了我很多次,所以我認為對最糟糕的C#陷阱進行分類將很有用。
查看完整描述

3 回答

?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

private int myVar;

public int MyVar

{

    get { return MyVar; }

}

布拉莫 您的應用崩潰,沒有堆棧跟蹤。一直發生。


(注意使用大寫MyVar字母而不是小寫字母myVar)。


查看完整回答
反對 回復 2020-02-03
?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

Type.GetType


我看到很多人咬過的是Type.GetType(string)。他們想知道為什么它適用于他們自己的程序集中的類型,而某些類型像System.String,而不是System.Windows.Forms.Form。答案是,它只在當前程序集中和中出現mscorlib。


匿名方法


C#2.0引入了匿名方法,導致了如下討厭的情況:


using System;

using System.Threading;


class Test

{

    static void Main()

    {

        for (int i=0; i < 10; i++)

        {

            ThreadStart ts = delegate { Console.WriteLine(i); };

            new Thread(ts).Start();

        }

    }

}

那會打印出什么?好吧,這完全取決于調度。它會打印10個數字,但可能不會打印0、1、2、3、4、5、6、7、8、9,這可能是您期望的。問題在于i捕獲的變量是它,而不是在創建委托時的值。使用正確范圍的額外局部變量可以輕松解決此問題:


using System;

using System.Threading;


class Test

{

    static void Main()

    {

        for (int i=0; i < 10; i++)

        {

            int copy = i;

            ThreadStart ts = delegate { Console.WriteLine(copy); };

            new Thread(ts).Start();

        }

    }

}

推遲執行迭代器塊


這個“窮人的單元測試”沒有通過-為什么不呢?


using System;

using System.Collections.Generic;

using System.Diagnostics;


class Test

{

    static IEnumerable<char> CapitalLetters(string input)

    {

        if (input == null)

        {

            throw new ArgumentNullException(input);

        }

        foreach (char c in input)

        {

            yield return char.ToUpper(c);

        }

    }


    static void Main()

    {

        // Test that null input is handled correctly

        try

        {

            CapitalLetters(null);

            Console.WriteLine("An exception should have been thrown!");

        }

        catch (ArgumentNullException)

        {

            // Expected

        }

    }

}

答案是,CapitalLetters直到MoveNext()首次調用迭代器的方法時,代碼源中的代碼才會執行。


我的腦筋急轉彎頁面上還有其他怪異之處。


查看完整回答
反對 回復 2020-02-03
?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

重新拋出異常

重新拋出異常語義是獲得許多新開發人員的陷阱。


很多時間我看到如下代碼


catch(Exception e) 

{

   // Do stuff 

   throw e; 

}

問題在于,它會擦除堆棧跟蹤,并使診斷問題變得更加困難,導致您無法跟蹤異常的起源。


正確的代碼是不帶參數的throw語句:


catch(Exception)

{

    throw;

}

或將異常包裝在另一個異常中,然后使用內部異常獲取原始堆棧跟蹤:


catch(Exception e) 

{

   // Do stuff 

   throw new MySpecialException(e); 

}


查看完整回答
反對 回復 2020-02-03
  • 3 回答
  • 0 關注
  • 801 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號