亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

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

2020-01-24 03:49:33
字體:
來源:轉載
供稿:網友
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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲全黄一级网站| 欧美成人手机在线| 亚洲香蕉伊综合在人在线视看| 中文字幕亚洲综合久久| 欧美精品在线观看91| 久久免费精品日本久久中文字幕| 久久亚洲精品视频| 亚洲精品v欧美精品v日韩精品| 亚洲欧美日韩另类| 国产福利精品视频| 欧美综合一区第一页| 国产亚洲综合久久| 国产女人18毛片水18精品| 国产精品无av码在线观看| 欧美成人免费在线视频| 亚洲成人a**站| 91在线观看欧美日韩| 国产精品日韩精品| 亚洲区中文字幕| 欧美精品制服第一页| 亚洲一区二区三区四区视频| 欧美日韩在线视频首页| 亚洲精品成人免费| 91麻豆国产精品| 亚洲成avwww人| 国产精品永久免费在线| 精品一区二区三区三区| 日韩中文在线中文网三级| 欧美日韩国产91| 国产丝袜精品视频| 国产成人精品网站| 国产91免费观看| 久久精品中文字幕| 国产区亚洲区欧美区| 色多多国产成人永久免费网站| 久久免费国产视频| 亚洲性日韩精品一区二区| 热久久这里只有精品| 亚洲国产精品视频在线观看| 疯狂做受xxxx高潮欧美日本| 国外视频精品毛片| 一本色道久久88综合日韩精品| 久久精品国产一区二区三区| 国产一区二区三区视频在线观看| 亚洲国产小视频| 在线中文字幕日韩| 亚洲欧美综合另类中字| 高清欧美性猛交xxxx黑人猛交| 91po在线观看91精品国产性色| 欧美日韩在线视频首页| 亚洲福利小视频| 亚洲激情在线观看视频免费| 国产一区二区欧美日韩| 91精品国产99| 国产精品极品尤物在线观看| 亚洲日本欧美日韩高观看| 97久久超碰福利国产精品…| 亚洲一区二区在线| 欧美人与物videos| 久久久亚洲成人| 日韩美女免费视频| 国产成人久久精品| 91免费在线视频网站| 中文字幕不卡在线视频极品| 国产91ⅴ在线精品免费观看| 91天堂在线视频| 色偷偷噜噜噜亚洲男人| 亚洲人成在线播放| 国产精品男人爽免费视频1| 久久伊人精品视频| 国模吧一区二区三区| 欧美有码在线视频| 欧美激情xxxx| 欧美精品video| 国外视频精品毛片| 久久色免费在线视频| 国产精品欧美久久久| 日韩中文av在线| 国产性猛交xxxx免费看久久| 国产一区二区三区在线| 欧美激情va永久在线播放| 欧美精品免费在线观看| 在线播放日韩专区| 国产精品福利网站| 中文字幕国产精品| 国产精品一区二区久久久久| 色av中文字幕一区| 国产精品成av人在线视午夜片| 国产精品亚洲综合天堂夜夜| 色综久久综合桃花网| 中文字幕不卡av| 欧美日韩电影在线观看| 精品福利在线视频| 国产成人精彩在线视频九色| 亚洲午夜性刺激影院| 亚洲天堂av网| 日韩在线视频线视频免费网站| 在线观看视频亚洲| 亚洲一区二区在线播放| 欧美午夜女人视频在线| 欧美精品在线播放| 亚洲天堂av在线播放| 国产精品入口免费视频一| 日韩激情第一页| 69国产精品成人在线播放| 九九热精品视频| 欧美性猛交xxxx乱大交蜜桃| 亚洲人成网站999久久久综合| 日韩电影网在线| 亚洲天堂视频在线观看| 91av国产在线| 欧美一区二区三区免费视| 国产伊人精品在线| 91av在线精品| 日韩成人性视频| 成人中文字幕在线观看| 亚洲精品美女免费| 色婷婷综合成人| 成人乱色短篇合集| 亚洲石原莉奈一区二区在线观看| 国产91露脸中文字幕在线| 78m国产成人精品视频| 国产精品男人爽免费视频1| 亚洲精品按摩视频| 国产精品视频xxx| 色无极亚洲影院| 亚洲欧洲一区二区三区久久| 中文字幕日韩视频| 亚洲国内高清视频| 日韩av网站在线| 亚洲第一精品夜夜躁人人躁| 国产精品99导航| 国产精品久久久久久亚洲调教| 亚洲无av在线中文字幕| 亚洲第一av在线| 4438全国亚洲精品在线观看视频| 欧美大学生性色视频| 77777少妇光屁股久久一区| 久久精品国产精品| 91av在线影院| 欧美性少妇18aaaa视频| 久久久久国产一区二区三区| 久久亚洲精品小早川怜子66| 日韩高清中文字幕| 国产区亚洲区欧美区| 欧美激情一区二区三区久久久| 久久综合国产精品台湾中文娱乐网| 奇门遁甲1982国语版免费观看高清| 国产综合香蕉五月婷在线| 日产精品久久久一区二区福利| 亚洲人成网站777色婷婷| 国产精品午夜一区二区欲梦| 97久久精品在线| 国产日韩综合一区二区性色av| 亚洲国产精品久久久久久| 久久亚洲精品一区二区| 亚洲国产精品久久久| 91产国在线观看动作片喷水| 国产69精品久久久久9999| 日韩美女主播视频| 亚洲丁香婷深爱综合| 欧美疯狂做受xxxx高潮| 亚洲视频欧洲视频| 国产这里只有精品|