C#基礎概念二十五問 21-25

來源:互聯網
上載者:User

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

A

23.explicit 和 implicit 的含義?
答:
explicit 和 implicit 屬於轉換運算子,如用這兩者可以讓我們自訂的類型支援相互交換
explicti 表示顯式轉換,如從 A -> B 必須進行強制類型轉換(B = (B)A)
implicit 表示隱式轉換,如從 B -> A 只需直接賦值(A = B)
隱式轉換可以讓我們的代碼看上去更漂亮、更簡潔易懂,所以最好多使用 implicit 運算子。不過!如果對象本身在轉換時會損失一些資訊(如精度),那麼我們只能使用 explicit 運算子,以便在編譯期就能警告客戶調用端
樣本:
using System;
using System.Collections.Generic;
using System.Text;
namespace Example23
{
class Program
{
//本例靈感來源於大話西遊經典台詞“神仙?妖怪?”--主要是我實在想不出什麼好例子了
class Immortal
{
public string name;
public Immortal(string Name)
{
name = Name;
}
public static implicit operator Monster(Immortal value)
{
return new Monster(value.name + ":神仙變妖怪?偷偷下凡即可。。。");
}
}
class Monster
{
public string name;
public Monster(string Name)
{
name = Name;
}
public static explicit operator Immortal(Monster value)
{
return new Immortal(value.name + ":妖怪想當神仙?再去修鍊五百年!");
}
}
static void Main(string[] args)
{
Immortal tmpImmortal = new Immortal("紫霞仙子");
//隱式轉換
Monster tmpObj1 = tmpImmortal;
Console.WriteLine(tmpObj1.name);
Monster tmpMonster = new Monster("孫悟空");
//顯式轉換
Immortal tmpObj2 = (Immortal)tmpMonster;
Console.WriteLine(tmpObj2.name);
Console.ReadLine();
}
}
}
結果:
紫霞仙子:神仙變妖怪?偷偷下凡即可。。。
孫悟空:妖怪想當神仙?再去修鍊五百年!

24.params 有什麼用?
答:
params 關鍵字在方法成員的參數列表中使用,為該方法提供了參數個數可變的能力
它在只能出現一次並且不能在其後再有參數定義,之前可以
樣本:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class App
{
//第一個參數必須是整型,但後面的參數個數是可變的。
//而且由於定的是object數組,所有的資料類型都可以做為參數傳入
public static void UseParams(int id, params object[] list)
{
Console.WriteLine(id);
for (int i = 0; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
}
static void Main()
{
//可變參數部分傳入了三個參數,都是字串類型
UseParams(1, "a", "b", "c");
//可變參數部分傳入了四個參數,分別為字串、整數、浮點數和雙精確度浮點數數組
UseParams(2, "d", 100, 33.33, new double[] { 1.1, 2.2 });
Console.ReadLine();
}
}
}
結果:
1
a

c
2
d
100
33.33
System.Double[]

25.什麼是反射?
答:
反射,Reflection,通過它我們可以在運行時獲得各種資訊,如程式集、模組、類型、欄位、屬性、方法和事件
通過對類型動態執行個體化後,還可以對其執行操作
簡單來說就是用string可以在runtime為所欲為的東西,實際上就是一個.net framework內建的萬能工廠
一般用於外掛程式式架構程式和設計模式的實現,當然反射是一種手段可以充分發揮其能量來完成你想做的任何事情(前面好象見過一位高人用反射調用一個官方類庫中未說明的函數。。。)
樣本:
using System;
using System.Collections.Generic;
using System.Text;
namespace Example25Lib
{
public class Class1
{
private string name;
private int age;
//如果顯式的聲明了無參數建構函式,用戶端只需要用程式集的CreateInstance即可執行個體化該類
//在此特意不實現,以便在客戶調用端體現建構函式的反射實現
//public Class1()
//{
//}
public Class1(string Name, int Age)
{
name = Name;
age = Age;
}
public void ChangeName(string NewName)
{
name = NewName;
}
public void ChangeAge(int NewAge)
{
age = NewAge;
}
public override string ToString()
{
return string.Format("Name: {0}, Age: {1}", name, age);
}
}
}
反射執行個體化對象並調用其方法,屬性和事件的反射調用略去
using System;
using System.Collections.Generic;
using System.Text;
//注意添加該反射的命名空間
using System.Reflection;
namespace Example25
{
class Program
{
static void Main(string[] args)
{
//載入程式集
Assembly tmpAss = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "Example25Lib.dll");
//遍曆程式集內所有的類型,並執行個體化
Type[] tmpTypes = tmpAss.GetTypes();
foreach (Type tmpType in tmpTypes)
{
//擷取第一個類型的建構函式資訊
ConstructorInfo[] tmpConsInfos = tmpType.GetConstructors();
foreach (ConstructorInfo tmpConsInfo in tmpConsInfos)
{
//為建構函式產生調用的參數集合
ParameterInfo[] tmpParamInfos = tmpConsInfo.GetParameters();
object[] tmpParams = new object[tmpParamInfos.Length];
for (int i = 0; i < tmpParamInfos.Length; i++)
{
tmpParams[i] = tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);
if (tmpParamInfos[i].ParameterType.FullName == "System.String")
{
tmpParams[i] = "Clark";
}
}
//執行個體化對象
object tmpObj = tmpConsInfo.Invoke(tmpParams);
Console.WriteLine(tmpObj);
//擷取所有方法並執行
foreach (MethodInfo tmpMethod in tmpType.GetMethods())
{
//為方法的調用建立參數集合
tmpParamInfos = tmpMethod.GetParameters();
tmpParams = new object[tmpParamInfos.Length];
for (int i = 0; i < tmpParamInfos.Length; i++)
{
tmpParams[i] = tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);
if (tmpParamInfos[i].ParameterType.FullName == "System.String")
{
tmpParams[i] = "Clark Zheng";
}
if (tmpParamInfos[i].ParameterType.FullName == "System.Int32")
{
tmpParams[i] = 27;
}
}
tmpMethod.Invoke(tmpObj, tmpParams);
}
//調用完方法後再次列印對象,比較結果
Console.WriteLine(tmpObj);
}
}
Console.ReadLine();
}
}
}
結果:
Name: Clark, Age: 0
Name: Clark Zheng, Age: 27
來自:
http://www.cnblogs.com/reonlyrun/archive/2007/04/05/csharp_25_question.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.