最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#新手常犯的錯誤匯總

 更新時間:2014年08月26日 11:35:11   投稿:shichen2014  
這篇文章主要介紹了C#新手常犯的錯誤匯總,對于經驗豐富的C#程序員同樣具有很好的參考借鑒價值,需要的朋友可以參考下

本文所述為C#新手常犯的錯誤,但是實際上很多有經驗的程序員也經常犯這些錯誤,對此特別整理了一下,供大家參考。具體如下:

1、遍歷List的錯誤,比如如下代碼:

List<String> strList =newList<String>
for(int i =0; i<strList.Count; i++)
{
  strList.RemoveAt(i);
}

這段代碼看上去是刪除了所有元素,實際上每次調用RemoveAt方法會導致List元素索引重排,最后導致元素沒有完全刪除。
可以改成:

List<String> strList =newList<String>
for(int i =0; i<strList.Count; i++)
{
  strList.RemoveAt(i);
  i-=1;
}

這樣就可以完全刪除List中的元素。

2、關于C#常量的錯誤

比如你寫了一個類庫,在里面定義了如下常量:

public const String str="First Version";

并且在另一個程序里引用了這個類庫,如果你修改了這個類庫中的常量,發(fā)布了一個新的版本,那么再運行之前的程序,你會發(fā)現常量還是原來的常量,并沒有改變。這是因為C#在編譯的時候,常量直接作為元數據嵌入,解決方法是重新編譯整個解決方案或者使用屬性而不是直接訪問常量。

3、當把值類型裝箱后,如果拆箱只能拆成原來裝箱前的類型,比如:

Int32 a=3;
Object obj=new object();
//這里裝箱成功,不會失敗
obj=i;
//拆箱一定會失敗
Int64 b=(Int64)obj;

可以像這樣操作:

Int64 b =(Int64)(Int32)obj;

就能完成轉型

4、重載==運算符的錯誤:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UseOperator
{
  class Program
  {
    static void Main(string[] args)
    {
      Test t1 = new Test();
      t1.MyFun();
      Console.ReadLine();
    }
  }
  class Test
  {
    public void MyFun()
    {
      Test t = new Test();
      if (t == null)
      {
        Console.WriteLine("t為空!");
      }
      else
      {
        Console.WriteLine("t不為空!");
      }
    }
    //存在BUG的重載運算法
    public static bool operator ==(Test t1, Test t2)
    {
      return t2.Equals(t1);
    }
    public static bool operator !=(Test t1, Test t2)
    {
      return !(t1 == t2);
    } 
    //覆蓋HashCode
    public override int GetHashCode()
    {
      return base.GetHashCode();
    }
    public override bool Equals(object obj)
    {
      return base.Equals(obj);
    }
  }
}

這里的問題在于MyFun中會把NULL傳遞進==運算符函數,導致運行的時候報錯,正確的做法是:

public static bool operator ==(Test t1, Test t2)
{
  if ((t2 as object) == null)
  {
    return (t1 as object) == null;
  }
  else
  {
    return t2.Equals(t1);
  }
}

5、C#中調用結構的屬性或者方法必須用new來聲明結構變量,否則會出錯。

6、如果使用了params使用多個參數,必須判斷參數是否為空,否則程序會有隱藏的BUG。

7、靜態(tài)成員在創(chuàng)建第一個實例的時候就會初始化,而且只被初始化一次,不要亂用靜態(tài)成員。

8、如果使用ref Object類型參數接受String類型會出錯,這是因為C#要求參數必須使用正確的類型,不加ref是可以的,如果一定要使用ref Object接受String類型參數,可以先轉型成Object,再引用傳遞。

9、類的構造函數中永遠不要調用虛方法,比如:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace FransferVirtualFunction
{
  class Program
  {
    static void Main(string[] args)
    {
      try
      {
        Child ch = new Child();
      }
      catch (Exception ex)
      {
        Console.WriteLine(ex.Message);
      }
      Console.Read();

    }
  }
  public class Ref
  {
    public string Str = "這是Ref類的一個成員";
  }
  public class Parent
  {
    protected Ref my;
    public Parent()
    {
      my = new Ref();
      //構造方法中調用了虛方法
      Console.WriteLine(GetString());
    }
    //虛方法
    public virtual string GetString()
    {
      return my.Str;    //使用了內部成員
    }
  }
  public class Child : Parent
  {
    private Ref my2;
    public Child()
      : base()
    {
      my2 = new Ref();
    }
    //重寫虛方法
    public override string GetString()
    {
      return my2.Str;    //使用了內部成員
    }
  }
}

這里在執(zhí)行基類的構造函數的時候會執(zhí)行到派生類的虛方法GetString(),在獲取my2.Str的時候拋出異常,因為此時派生類對象還沒有被構造。

10、在C#和SQL Server通信時要注意NULL的含義,在SQL Server里面這個值代表1900-1-1。SQL Server的空值可以使用DBNull來表示。

暫時就是這么多了,注意到以上10點可以在編程的時候減少大量BUG。

補充:

1、Math 三角函數 其中的參數為 弧度值,而非角度值。

2、WinForm 中的由相對路徑引發(fā)的bug:具體可以參考WinForm相對路徑的陷阱。

3、使用 xml, json 等序列化后的數據格式傳遞數據時,如果傳遞的數據為數值型類型,解析時,最好先將其轉為string 然后 tryParse 成相應類型。

至于原因:如上的第三點、是裝箱和拆箱的問題。

相信本文所述對大家C#程序設計可以帶來很大的幫助。

相關文章

  • C# Marshal類基本概念和入門實例講解

    C# Marshal類基本概念和入門實例講解

    這篇文章主要介紹了C# Marshal類基本概念和入門實例,具有很好的參考價值,希望對大家有所幫助。
    2023-02-02
  • 基于C#實現圖片合成功能

    基于C#實現圖片合成功能

    這篇文章主要為大家詳細介紹了如何利用C#實現圖片合成的功能,文中的示例代碼講解詳細,對我們學習C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • C# .NET中Socket簡單實用框架的使用教程

    C# .NET中Socket簡單實用框架的使用教程

    最近一個項目因為要用到Socket傳輸問題,所以決定學習一下,將自己學習的內容總結分享出來,下面這篇文章主要給大家介紹了關于C# .NET中Socket簡單實用框架使用的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-09-09
  • C#實現系統(tǒng)信息監(jiān)控與獲取功能

    C#實現系統(tǒng)信息監(jiān)控與獲取功能

    在 C# 開發(fā)的眾多應用場景中,獲取系統(tǒng)信息以及監(jiān)控用戶操作有著廣泛的用途,比如在系統(tǒng)性能優(yōu)化工具中,需要實時讀取 CPU、GPU 資源信息,本文將詳細介紹如何使用 C# 來實現這些功能,助力大家在開發(fā)中更好地與系統(tǒng)底層進行交互,需要的朋友可以參考下
    2025-01-01
  • Unity?使用tiledmap解析地圖的詳細過程

    Unity?使用tiledmap解析地圖的詳細過程

    這篇文章主要介紹了Unity?使用tiledmap解析地圖,本文通過圖文實例相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • C#中Timer定時器類的簡單使用

    C#中Timer定時器類的簡單使用

    定時器就是經過固定時間,執(zhí)行固定任務,本文主要介紹了C#中Timer定時器類的簡單使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • C#獲取文件MD5值的實現示例

    C#獲取文件MD5值的實現示例

    文件的md5值,即文件簽名,為了驗證文件的正確性,是否被惡意篡改等。每個文件有一個唯一的md5。下面這篇文中就給大家介紹了如何利用C#獲取文件MD5值,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • C#實現word和pdf格式互轉

    C#實現word和pdf格式互轉

    這篇文章主要為大家詳細介紹了如何通過C#實現word和pdf格式互轉功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-10-10
  • 關于async和await的一些誤區(qū)實例詳解

    關于async和await的一些誤區(qū)實例詳解

    這篇文章主要介紹了關于async和await的一些誤區(qū)實例詳解,有助于更加深入的理解C#程序設計,需要的朋友可以參考下
    2014-08-08
  • C#使用Sleep(Int32)方法實現動態(tài)顯示時間

    C#使用Sleep(Int32)方法實現動態(tài)顯示時間

    這篇文章主要為大家詳細介紹了C#如何使用Sleep(Int32)方法實現動態(tài)顯示時間,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考下
    2024-01-01

最新評論

进贤县| 潼南县| 天柱县| 舞钢市| 巴彦淖尔市| 抚宁县| 杭锦旗| 舟曲县| 邵武市| 三都| 宁化县| 定西市| 临安市| 海原县| 聊城市| 南投市| 宝坻区| 宜良县| 晋城| 故城县| 石阡县| 六盘水市| 泰和县| 湖南省| 南溪县| 新巴尔虎右旗| 五华县| 凤冈县| 嘉兴市| 阿勒泰市| 辽阳市| 碌曲县| 呼和浩特市| 喀喇沁旗| 攀枝花市| 郸城县| 常山县| 琼中| 西宁市| 绥江县| 沈丘县|