程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#基礎概念二十五問(17)

C#基礎概念二十五問(17)

編輯:關於C語言

21.P/Invoke是什麼?

答:

在受控代碼與非受控代碼進行交互時會產生一個事務(transition),這通常發生在使用平台調用服務(Platform Invocation Services),即P/Invoke

如調用系統的 API 或與 COM 對象打交道,通過 System.Runtime.InteropServices 命名空間

雖然使用 Interop 非常方便,但據估計每次調用事務都要執行 10 到 40 條指令,算起來開銷也不少,所以我們要盡量少調用事務

如果非用不可,建議本著一次調用執行多個動作,而不是多次調用每次只執行少量動作的原則

22.StringBuilder 和 String 的區別?

答:

String 在進行運算時(如賦值、拼接等)會產生一個新的實例,而 StringBuilder則不會。所以在大量字符串拼接或頻繁對某一字符串進行操作時最好使用 StringBuilder,不要使用 String

另外,對於 String 我們不得不多說幾句:

1.它是引用類型,在堆上分配內存

2.運算時會產生一個新的實例

3.String 對象一旦生成不可改變(Immutable)

3.定義相等運算符(== 和 !=)是為了比較 String 對象(而不是引用)的值

示例:

using System;
using System.Collections.Generic;
using System.Text;
namespace Example22
{
  class Program
  {
    static void Main(string[] args)
    {
      const int cycle = 10000;
      long vTickCount = Environment.TickCount;
      String str = null;
      for (int i = 0; i < cycle; i++)
        str += i.ToString();
      Console.WriteLine("String: {0} MSEL", Environment.TickCount - vTickCount);
      vTickCount = Environment.TickCount;
      //看到這個變量名我就生氣,奇怪為什麼大家都使它呢? :)
      StringBuilder sb = new StringBuilder();
      for (int i = 0; i < cycle; i++)
        sb.Append(i);
      Console.WriteLine("StringBuilder: {0} MSEL", Environment.TickCount - vTickCount);
      string tmpStr1 = "A";
      string tmpStr2 = tmpStr1;
      Console.WriteLine(tmpStr1);
      Console.WriteLine(tmpStr2);
      //注意後面的輸出結果,tmpStr1的值改變並未影響到tmpStr2的值
      tmpStr1 = "B";
      Console.WriteLine(tmpStr1);
      Console.WriteLine(tmpStr2);
      Console.ReadLine();
    }
  }
}

結果:

String: 375 MSEL

StringBuilder: 16 MSEL

A

A

B

A

-
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved