第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

紅糖糍粑 2020-02-03 14:05:53
我最近正在處理一個DateTime對象,并編寫了如下內(nèi)容: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之前,這已經(jīng)咬了我很多次,所以我認為對最糟糕的C#陷阱進行分類將很有用。
查看完整描述

3 回答

?
慕尼黑8549860

TA貢獻1818條經(jīng)驗 獲得超11個贊

private int myVar;

public int MyVar

{

    get { return MyVar; }

}

布拉莫 您的應(yīng)用崩潰,沒有堆棧跟蹤。一直發(fā)生。


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


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

TA貢獻1784條經(jīng)驗 獲得超9個贊

Type.GetType


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


匿名方法


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


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();

        }

    }

}

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


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();

        }

    }

}

推遲執(zhí)行迭代器塊


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


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()首次調(diào)用迭代器的方法時,代碼源中的代碼才會執(zhí)行。


我的腦筋急轉(zhuǎn)彎頁面上還有其他怪異之處。


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

TA貢獻1828條經(jīng)驗 獲得超13個贊

重新拋出異常

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


很多時間我看到如下代碼


catch(Exception e) 

{

   // Do stuff 

   throw e; 

}

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


正確的代碼是不帶參數(shù)的throw語句:


catch(Exception)

{

    throw;

}

或?qū)惓0b在另一個異常中,然后使用內(nèi)部異常獲取原始堆棧跟蹤:


catch(Exception e) 

{

   // Do stuff 

   throw new MySpecialException(e); 

}


查看完整回答
反對 回復(fù) 2020-02-03
  • 3 回答
  • 0 關(guān)注
  • 800 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號