코드 트랩 C#

8160 단어 C#

함정1:리스트를 누비다

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

만약 i=10이라면 이 코드는 마지막에 5개의 요소만 삭제했을 뿐이다. 왜냐하면 매번 하나를 삭제하고 목록에 있는 모든 요소를 앞으로 옮기기 때문이다. 실제로는 하나를 삭제하고 하나를 건너뛰고 하나를 삭제하기 때문이다.개선: i -=1;for 순환의 마지막 줄에, 또는strList를 추가합니다.Count 이거 교체하기;

트랩 2:C#상수

public const String str="First Version";

만약 당신이 라이브러리를 썼다면, 그 안에 상기 상수를 정의하고, 다른 프로그램에서 이 라이브러리를 인용했을 것이다. 만약 이 라이브러리의 상수를 수정하고, 새로운 버전을 발표했다면, 실행하기 전의 프로그램에서 상수가 원래의 상수이며, 변하지 않았다는 것을 발견할 수 있을 것이다.이는 C#를 컴파일할 때 상수를 메타데이터로 직접 삽입하고 해결 방법은 전체 해결 방안을 다시 컴파일하거나 속성을 사용하는 것이지 상수에 직접 접근하는 것이 아니기 때문이다.

함정3: 상자를 뜯고 포장한다

Int32 a=3;
Object obj = new object();
//      ,    
obj=i;
//       
Int64 b=(Int64)obj;

향상된 기능:
Int64 b =(Int64)(Int32)obj;

트랩 가게: 다시 로드== 연산자 오류

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

함정


C#에서 구조를 호출하는 속성이나 방법은 new로 구조 변수를 선언해야 합니다. 그렇지 않으면 오류가 발생합니다.

함정육


params가 여러 개의 매개 변수를 사용한다면, 매개 변수가 비어 있는지 판단해야 합니다. 그렇지 않으면 프로그램에 숨겨진 버그가 있습니다.

함정


정적 구성원은 첫 번째 실례를 만들 때 초기화되며 한 번만 초기화되므로 정적 구성원을 함부로 사용하지 마십시오.

트랩


ref Object 유형 매개 변수를 사용하여 String 유형을 받아들이면 오류가 발생합니다. 이것은 C#에서 매개 변수에 정확한 유형을 사용해야 하기 때문입니다. ref를 추가하지 않아도 됩니다. 만약에 ref Object를 사용하여 String 유형 매개 변수를 받아들여야 한다면 먼저 Object로 전환하고 인용하여 전달할 수 있습니다.

함정구: 클래스의 구조 함수에서 영원히 헛된 방법을 사용하지 마라

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;    //       
    }
  }
}

기본 클래스의 구조 함수를 실행할 때 파생 클래스의 허위 방법인 GetString () 을 실행하고 my2를 가져옵니다.Str에서 이상을 던집니다. 파생류 대상이 아직 구성되지 않았기 때문입니다.

함정 줍기


C#와 SQL Server가 통신할 때 NULL의 의미를 주의해야 한다. SQL Server에서 이 값은 1900-1-1을 대표한다.SQL Server의 빈 값은 DBNull을 사용하여 표시할 수 있습니다.

보태다


1. Math 삼각함수의 매개 변수는 각도 값이 아닌 호도 값입니다.2. WinForm의 상대 경로로 인한 버그: 구체적인 것은 WinForm 상대 경로의 함정을 참고할 수 있다.3. xml, json 등 서열화된 데이터 형식으로 데이터를 전달할 때 전달된 데이터가 수치형 유형이면 해석할 때string으로 전환한 다음tryParse를 상응하는 유형으로 바꾸는 것이 좋다.

좋은 웹페이지 즐겨찾기