.Net基礎 從彙編入手,探究泛型的性能問題 HttpContext請求上下文對象 值類型和引用類型的區別 C#參考 :ReferenceEquals, == , Equals 深刻理解string和

 標題  狀態  內容
     
 NET應用程序是如何執行的?   

 

http://www.cnblogs.com/kingmoon/archive/2012/07/16/2594459.htmlhtml

 

從彙編入手,探究泛型的性能問題

 

 

 彙編及IL  

從這裏咱們能夠看到,CLR爲引用類型(string/object/Program)生成共享的機器碼,它們都實際上在調用一個GenericMethod<System.__Canon>所生成的代碼。而對於每一個不一樣的值類型(int/DateTime/double),CLR則會爲每種類型各生成一份 數據庫

http://www.cnblogs.com/JeffreyZhao/archive/2009/06/03/my-view-of-il-2-il-shows-little-about-clr.htmlc#

 JIT    JIT Compiler(Just-in-time Compiler) 即時編譯
 。NET和C#各個版本的變遷  已讀  

CLR是公共語言運行庫(Common Language Runtime)  http://www.cnblogs.com/lufangtao/archive/2012/06/07/2539915.html設計模式

 

CLR 徹底介紹 深刻探討 IDisposable  https://msdn.microsoft.com/zh-cn/magazine/cc163392.aspx

 

 

Net 版本和C#對應關係數組

.Net各版本差異 參考安全

http://blog.csdn.net/xjc1278003262/article/details/8605738?utm_source=tuicool服務器

.Net1.0  
.Net1.2  
.Net2.0

 1)泛型和可空類型網絡

2)匿名方法數據結構

3)迭代多線程

4) 部分類

5)本地應用託管.NET運行時實例的新API。 新的API提供好比多線程、內存分配,程序集加載等更細粒度上的運行時行爲控制 。

6)許多新增和改進的ASP.NET Web控件 。

7) 新增ASP.NET個性化功能,如對主題、皮膚、母版頁和WebParts 的支持。

.Net3.0  .NET 3.0有點奇特,由於它是一個在CLR、語言和已有庫方面都沒有改變的「主」版本,而
是由4個新的庫組成。
 WPF是下一代用戶界面框架;它是一場革命,而不只僅是對Windows Forms的革新,儘管
這二者能夠共同存在。它跟Windows Forms是兩種徹底不一樣的模型,在本質上更傾向於組
裝式。Silverlight的用戶界面基於WPF。
 WCF(Windows Communication Foundation)是構建面向服務的應用程序架構;它不會侷限
於單個協議,而是能夠進行擴展,而且致力於統一現有的RPC類的通訊管道,如遠程處理。 

 WF(Wondows Workflow Foundation)是用於構建工做流應用程序的系統。
 Windows CardSpace是一個安全識別系統。

.Net3.5

 1)Linq c#3.0

2)EF

3)新增兩個Web開發程序集:System.Web.Abstraction和System.Web.Routing兩個新組件。

.Net4.0  
.Net4.5  1)異步

 

C#各版本差異

C#2.0

泛型

可空類型

匿名方法

委託的加強
迭代器塊。

分部類型、靜態類、包含不一樣訪問修飾
符的屬性的取值方法和賦值方法、命名空間別名、pragma指令以及固定大小的緩衝器,

C#3.0

 LINQ而生

自動屬性、數組和局部變量的隱式
類型、對象和集合的初始化程序以及匿名類型

Lambda表達式和表達式
擴展方法
分部方法僅出如今C# 3中

C#4.0

 命名實參、可選參數、更好的COM交互、泛型可變性

動態類型

C#5.0  異步特性
   
   
 HttpContext請求上下文對象  

  http://www.cnblogs.com/kissdodog/p/3360584.html

值類型和引用類型的區別  

 

http://www.cnblogs.com/Autumoon/archive/2008/08/18/1270685.html

全部值類型都繼承自System.ValueType,可是ValueType沒有附加System.Object包含以外其它任何方法,不過它卻是改寫了Equals和GetHashCode兩個方法。引用類型變量的Equals比較的是兩者的引用地址而不是內部的值,值類型變量的Equals方法比較的是兩者的值而不是……哦對了,值類型壓根兒沒有引用地址;

c# ==和equals的區別  

  http://kb.cnblogs.com/page/206353/

http://stackoverflow.com/questions/21273890/what-is-the-difference-between-and-equals-for-primitives-in-c

 

對於值類型 對於不一樣的類型會強制轉換成前面的類型。若是如short -》int 行   int=》short 不行

 

對於引用類型 ==比較的是引用地址是否相同(即棧中的內容是否相同),equal比較的是2個變量師傅是對同一個對象的引用,即堆中的內容是否相同。

 

 

 

 值類型 類型不一樣的時候會調用不一樣的equal

 

 

 

 

Equals和GetHashcode http://blog.csdn.net/afgasdg/article/details/6889383 

 

http://www.cnblogs.com/lwzz/archive/2012/02/26/2361843.html

 

ReferenceEquals是Object的靜態方法,用於比較兩個引用類型的對象是不是對於同一個對象的引用。

 

C#參考 :ReferenceEquals, == , Equals   http://www.cnblogs.com/Dlonghow/archive/2008/08/04/1259732.html

 

 

 

默認狀況下,對於引用類型,該方法對比的時引用的地址,對於值類型,對比的是值的二進制描述是否相同。100.0與100雖然都是100,可是它們的二進制分佈是不同的。

 


一、默認狀況(沒有覆蓋equals方法)下equals方法都是調用Object類的equals方法,而Object的equals方法主要用於判斷對象的內存地址引用是否是同一個地址(是否是同一個對象)。

 


2 、要是類中覆蓋了equals方法,那麼就要根據具體的代碼來肯定equals方法的做用了,覆蓋後通常都是經過對象的內容是否相等來判斷對象是否相等。

 


一、equals方法用於比較對象的內容是否相等(覆蓋之後)

 


二、hashcode方法只有在集合中用到

 


三、當覆蓋了equals方法時,比較對象是否相等將經過覆蓋後的equals方法進行比較(判斷對象的內容是否相等)。

 


四、將對象放入到集合中時,首先判斷要放入對象的hashcode值與集合中的任意一個元素的hashcode值是否相等,若是不相等直接將該對象放入集合中。若是hashcode值相等,而後再經過equals方法判斷要放入對象與集合中的任意一個對象是否相等,若是equals判斷不相等,直接將該元素放入到集合中,不然不放入。

 

 

 

 

 

五、將元素放入集合的流程圖:

 

 

 


 

 

 

內存分配

C#中堆和棧的區別分析

 

http://www.cnblogs.com/aaa6818162/p/4644505.html

從內存分配看函數參數傳遞問題  http://blog.csdn.net/fmoonstar/article/details/6827030

變量、參數和內存分配 http://www.cnblogs.com/IOS-Developer/p/4117618.html

 

對於一個進程的內存空間而言,能夠在邏輯上分紅3個部份:代碼區,靜態數據區和動態數據區。動態數據區通常就是「堆棧」。「棧(stack)」和「堆(heap)」是兩種不一樣的動態數據區,棧是一種線性結構,堆是一種鏈式結構。進程的每一個線程都有私有的「棧」,因此每一個線程雖然代碼同樣,但本地變量的數據都是互不干擾。一個堆棧能夠經過「基地址」和「棧頂」地址來描述。全局變量和靜態變量分配在靜態數據區,本地變量分配在動態數據區,即堆棧中。程序經過堆棧的基地址和偏移量來訪問本地變量。

字符串的駐留(String Interning)

 

 http://www.cnblogs.com/artech/archive/2007/03/04/663728.aspx

於String是咱們作到頻率最高的一種類型,CLR考慮性能的提高和內存節約上,對於相同的字符串,通常不會爲他們分別分配內存塊,相反地,他們會共享一塊內存。CLR實際上採用這個的機制來實現的:CLR內部維護着一塊特殊的數據結構——咱們能夠把它當作是一個Hash table,這個Hash table維護者大部分建立的string(我這裏沒有說所有,由於有特例)。這個Hash table的Key對應的相應的string自己,而Value則是分配給這個string的內存塊的引用。當CLR初始化的時候建立這個Hash table。通常地,在程序運行過程當中,若是須要的建立一個string,CLR會根據這個string的Hash Code試着在Hash table中找這個相同的string,若是找到,則直接把找到的string的地址賦給相應的變量,若是沒有則在託管堆中建立一個string,CLR會先在managed heap中建立該strng,並在Hash table中建立一個Key-Value Pair——Key爲這個string自己,Value位這個新建立的string的內存地址,這個地址最重被賦給響應的變量

 

 

深刻理解string和如何高效地使用string  http://www.cnblogs.com/artech/archive/2007/05/06/737130.html

 C#中,String和string的區別

 

 C#中,字符串的聲明,你使用String仍是string?
String? string? 只有一個大小寫的問題,你習慣用哪一個?知道具體的區別嗎?
我是習慣了用string,區別也是最近才找到了權威的根據,'CLR via C#'。
其實,String是CLR的類型名稱(也算是keyword),而string是C#中的keyword。在C#的編譯時,默認會增長几行代碼,看了你就會明白string和String的區別了!
using string = System.String;
using sbyte = System.SByte;
using byte = System.Byte;
using short = System.Int16;
using ushort = System.UInt16;
using int = System.Int32;
using uint = System.UInt32; ... ...
對了! using string = System.String; C#編譯器,會自動的把string轉化爲Sysem.string!
在CLR via C#中,Jeffrey Richter建議coding時,使用CLR默認的類型,也就是說,不要string,要String;不要int要Int32!至於爲何,仍是你們本身看看這本書吧,very useful!

 

 

也能夠這樣理解:string是C#中字符串類型String的反射,一種簡化的書寫方式,就像int對應於Int32同樣,兩者在C#中可通用。

 

String,StringBuffer,StringBuilder

 

 http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html

 咱們明明就是改變了String型的變量s的,爲何說是沒有改變呢? 其實這是一種欺騙,JVM是這樣解析這段代碼的:首先建立對象s,賦予一個abcd,而後再建立一個新的對象s用來    執行第二行代碼,也就是說咱們以前對象s並無變化,因此咱們說String類型是不可改變的對象了,因爲這種機制,每當用String操做字符串時,其實是在不斷的建立新的對象,而原來的對象就會變爲垃圾被GC回收掉,可想而知這樣執行效率會有多底。

     而StringBuffer與StringBuilder就不同了,他們是字符串變量,是可改變的對象,每當咱們用它們對字符串作操做時,其實是在一個對象上操做的,這樣就不會像String同樣建立一些而外的對象進行操做了,固然速度就快了。

 

一個特殊的例子:

String str = 「This is only a」 + 「 simple」 + 「 test」;
StringBuffer builder = new StringBuilder(「This is only a」).append(「 simple」).append(「 test」);

    對於三者使用的總結: 1.若是要操做少許的數據用 = String

                        2.單線程操做字符串緩衝區 下操做大量數據 = StringBuilder

                        3.多線程操做字符串緩衝區 下操做大量數據 = StringBuffer

 參數的類型     實參和形參:形參就是函數定義時候用的,實參是在函數調用時候用的。

 

1. 好比你定義一個函數void add(int a, int b),這裏的a和b就是形參。








2. 當你進行函數調用的時候,add(1, 2),這裏的1和2就是實參。
 變量和參數     http://www.cnblogs.com/lanxiazhi/archive/2009/03/19/1417161.html

局部變量是指在函數型成員如方法、屬性、索引器中聲明的變量

聲明時指定了static修飾符的字段就是靜態變量

C#中一共有四種類型的參數:值參數,引用參數,輸出參數,參數數組。

 

 

 

 C# const, readonly, static readonly     http://www.cnblogs.com/qingxia/archive/2011/02/10/1950741.html

 

Const 定義的是靜態常在對象初始化的時候賦值.之後不能改變它的值.屬於編譯時常量。不能用new初始化。

Readonly 是隻讀變量.屬於運行時變量.能夠在類constructor裏改變它的值.不能做用於局部變量。

const 和 static 不能在一塊兒用,它已是靜態的了。

咱們都知道,const和static readonly的確很是像:經過類名而不是對象名進行訪問,在程式中只讀等等。在多數狀況下能混用。
兩者本質的差異在於,const的值是在編譯期間肯定的,所以只能在聲明時經過常量表達式指定其值

而static readonly,在程式中只讀, 不過它是在運行時計算出其值的,因此還能經過靜態構造函數來對它賦值,

readonly只能用來修飾類的field,不能修飾局部變量,也不能修飾property等其餘類成員

 委託 事件

什麼是委託?

委託和事件的關係?

   http://www.cnblogs.com/chengzish/p/4559268.html

http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx

委託 是存放方法的指針的清單,也就是裝方法的容器

事件是委託對象,事件自身實現了對委託對象的保護

因此event關鍵字本質就是作了兩個事情,從而實現對委託對象的保護:

    1,建立了一個對應的Private委託對象

    2,而後添加Add和Remove方法訪問、操做這個Private委託對象。

  

 Observer設計模式是爲了定義對象間的一種一對多的依賴關係,以便於當一個對象的狀態改變時,

其餘依賴於它的對象會被自動告知並更新。Observer模式是一種鬆耦合的設計模式。

 

<SPAN style="FONT-SIZE: 13px">using System; 
using System.Collections.Generic; 
using System.Text; 
  
namespace Delegate { 
     // 熱水器 
    public class Heater { 
        private int temperature; 
        public delegate void BoilHandler(int param);   //聲明委託 
       public event BoilHandler BoilEvent;        //聲明事件 
  
       // 燒水 
       public void BoilWater() { 
            for (int i = 0; i <= 100; i++) { 
               temperature = i; 
  
               if (temperature > 95) { 
                   if (BoilEvent != null) { //若是有對象註冊 
                      BoilEvent(temperature);  //調用全部註冊對象的方法 
                  } 
               } 
            } 
        } 
     } 
  
     // 警報器 
    public class Alarm { 
        public void MakeAlert(int param) { 
            Console.WriteLine("Alarm:嘀嘀嘀,水已經 {0} 度了:", param); 
        } 
     } 
  
     // 顯示器 
    public class Display { 
        public static void ShowMsg(int param) { //靜態方法 
           Console.WriteLine("Display:水快燒開了,當前溫度:{0}度。", param); 
        } 
     } 
       
     class Program { 
        static void Main() { 
            Heater heater = new Heater(); 
            Alarm alarm = new Alarm(); 
  
            heater.BoilEvent += alarm.MakeAlert;    //註冊方法 
           heater.BoilEvent += (new Alarm()).MakeAlert;   //給匿名對象註冊方法 
           heater.BoilEvent += Display.ShowMsg;       //註冊靜態方法 
  
           heater.BoilWater();   //燒水,會自動調用註冊過對象的方法 
       } 
     } 
 } 
輸出爲: 
Alarm:嘀嘀嘀,水已經 96 度了: 
Alarm:嘀嘀嘀,水已經 96 度了: 
Display:水快燒開了,當前溫度:96度。 
// 省略... 
</SPAN>
View Code

 

 多線程

static

單例

   線程上下文切換的性能損耗測試  http://www.cnblogs.com/EthanCai/p/3705834.html

 

static 在多線程的狀況

Static與線程安全 http://yinlei555.iteye.com/blog/707986

靜態方法是否有線程安全問題?要看在靜態方法中是否使用了靜態成員。

對於ASP.NET, 多個客戶端訪問服務器端, 這是一個多線程的例子

 

c#建立帶參數的線程

1、無參數線程的建立
Thread thread = new Thread(new ThreadStart(getpic));
thread.Start();
 private void showmessage()
{
     Console.WriteLine("hello world");
}
2、帶一個參數的線程
使用ParameterizedThreadStart,調用 System.Threading.Thread.Start(System.Object) 重載方法時將包含數據的對象傳遞給線程。
注意傳遞的參數只能是object類型,不過能夠進行強制類型轉換。
Thread thread = new Thread(new ParameterizedThreadStart(showmessage));
string o = "hello";
thread.Start((object)o);
private static void showmessage(object message)
{
     string temp = (string)message;
     Console.WriteLine(message);
}
3、帶兩個及以上參數的線程
這時候能夠將線程執行的方法和參數都封裝到一個類裏邊,經過實例化該類,方法就能夠調用屬性來盡享傳遞參數。
例如以下程序,想傳入兩個string變量,而後打印輸出。
public class ThreadTest
    {
        private string str1;
        private string str2;
 
        public ThreadTest(string a, string b)
        {
            str1 = a;
            str2 = b;
        }
        public void ThreadProc()
        {
            Console.WriteLine(str1 + str2);
        }
    }
public class Example {
    public static void Main() 
    {
       ThreadTest tt = new ThreadTest("hello ", "world");
       Thread thread = new Thread(new ThreadStart(tt.ThreadProc));
            thread.Start();
    }
} 

 
View Code

 

 http://www.cnblogs.com/aaa6818162/p/4516940.html

/// <summary>
        /// 定義公有方法提供一個全局訪問點,同時你也能夠定義公有屬性來提供全局訪問點
        /// </summary>
        /// <returns></returns>
        public static Singleton GetInstance()
        {
            // 當第一個線程運行到這裏時,此時會對locker對象 "加鎖",
            // 當第二個線程運行該方法時,首先檢測到locker對象爲"加鎖"狀態,該線程就會掛起等待第一個線程解鎖
            // lock語句運行完以後(即線程運行完以後)會對該對象"解鎖"
            // 雙重鎖定只須要一句判斷就能夠了
            if (uniqueInstance == null)
            {
                lock (locker)
                {
                    // 若是類的實例不存在則建立,不然直接返回
                    if (uniqueInstance == null)
                    {
                        uniqueInstance = new Singleton();
                    }
                }
            }
            return uniqueInstance;
        }
View Code

 

 Dispose(); .Clear(); = null    DataTable的 .Dispose(); .Clear(); = null; 三個有何區別,?http://zhidao.baidu.com/link?url=HE1FqLFeui856OhD7i3n4aKEicDJh42GaRm0EuLGvJC9xPIwQCmWM99D_iEmv3d035-8Td8hcIcJD-qIgXnz8_
 深拷貝淺拷貝    ICloneable  

淺拷貝就好比像引用類型,而深拷貝就好比值類型。

  淺拷貝是指源對象與拷貝對象共用一份實體,僅僅是引用的變量不一樣(名稱不一樣)。對其中任何一個對象的改動都會影響另一個對象。舉個例子,一我的一開始叫張三,後來更名叫李四了,

但是仍是同一我的,無論是張三缺胳膊少腿仍是李四缺胳膊少腿,都是這我的倒黴。

深拷貝是指源對象與拷貝對象互相獨立,其中任何一個對象的改動都不會對另一個對象形成影響。舉個例子,一我的名叫張三,後來用他克隆(假設法律容許)了另一我的,

叫李四,無論是張三缺胳膊少腿仍是李四缺胳膊少腿都不會影響另一我的。比較典型的就是Value(值)對象,如預約義類型Int32,Double,以及結構(struct),枚舉(Enum)等。

 Lambda表達式詳解  

 http://www.cnblogs.com/aaa6818162/p/4677140.html

           //傳入參數類型
            Action<string> action = s =>
            {
                Console.WriteLine(s);
            };

            //傳入參數類型 返回參數類型
            Func<int,int> gwl = p =>
            {
                return p + 10;
            };       

 

 c#擴展方法    
 async and await 簡單的入門  

 http://www.cnblogs.com/LoveJenny/archive/2011/11/01/2230933.html

http://blog.csdn.net/tianmuxia/article/details/17675681

http://www.cnblogs.com/jesse2013/p/async-and-await.html

線程的建立是比較佔用資源的一件事情,.NET 爲咱們提供了線程池來幫助咱們建立和管理線程。Task是默認會直接使用線程池,可是Thread不會。若是咱們不使用Task,又想用線程池的話,可使用ThreadPool類。

 

await並非針對於async的方法,而是針對async方法所返回給咱們的Task,這也是爲何全部的async方法都必須返回給咱們Task。因此咱們一樣能夠在Task前面也加上await關鍵字,這樣作其實是告訴編譯器我須要等這個Task的返回值或者等這個Task執行完畢以後才能繼續往下走。

 迭代器  

 http://www.cnblogs.com/yangecnu/archive/2012/03/17/2402432.html

 foreach編譯來調用GetEnumerator和MoveNext方法以及Current屬性

 http://dotnet.9sssd.com/csbase/art/794

考慮這樣一種狀況。假設數組是靠鏈表實現的(其實是線性表,可是咱們這裏假設)。
當你使用arr[i]訪問數組的一個元素的時候,它必須從數組的開頭開始找起。
咱們假設訪問一個節點須要1毫秒。
那麼咱們寫
for (i = 1; i < 5; i++)
{
    arr[i]
}
須要1+2+3+4+5=15毫秒。
可是若是咱們使用迭代器,在內部始終保持着最後一個訪問的節點,那麼咱們遍歷一樣的數組,只要1+1+1+1+1=5毫秒。

http://bbs.csdn.net/topics/390525082

for和foreach  

http://m.blog.csdn.net/blog/sansan52048/9159941

 

 1 在foreach循環中,迭代集合collectionObject的過程以下:
 21)調用collectionObject.GetEnumerator(),返回一個IEnumerator引用。這個方法能夠經過IEnumerable接口的實現代碼來得到。但這是可選的。
 32)調用返回的IEnumerator接口的MoveNext()方法。
 43)若是MoveNext()方法返回true,就使用IEnumerator接口的Current屬性獲取對象的一個引用,用於foreach循環。
 54)重複前面兩步,直到MoveNext()方法返回false爲止,此時循環中止。
 6 
 7 
 8 替代foreach實現:
 9 foreach (XXX a in b){ 
10 ... 
11 } 
12 
13 等同於
14 
15 XXX a;
16 IEnumerator ie = (IEnumable)b.GetEnumerator(); 
17 while (ie.MoveNext) { 
18 a = (XXX)ie.Current; 
19 ...
20 }
View Code

 

 

foreach是取只讀的,在取的時候數據隊列不能變(包括修改,刪除,添加等)。要避免這個問題,就應該使用for循環。

             IList<Person> iList = new List<Person>();

            iList.Add( new Person("david",13));
            iList.Add(new Person("bob", 11));
            iList.Add(new Person("justin",12));
 
        // 用linq從新排序 

            var textList = (from c in iList
                orderby c.age
                    select c);
 

            int iPerson =0;
            foreach (Person p in textList)
            {
                // 這時候在immediate Window裏面輸入iList.RemoveAt(2),程序會拋出異常
                Console.WriteLine(p.name + ":" + p.age);
                iList[iPerson] = p; // 排序後修改原來的隊列!!!
                iPerson++;
            }
            for (int ii = 0; ii < iList.Count; ii++)
            {
                // 這時候在immediate Window裏面輸入iList.RemoveAt(2),程序不會拋出異常
                Console.WriteLine(iList[ii].name);
            }
View Code

 

 狀態機    http://www.cnblogs.com/TianFang/archive/2007/12/27/1017665.html
 線程靜態字段 System.ThreadStaticAttribute  

 http://www.cnblogs.com/SkylineSoft/articles/1726232.html

ThreadStaticAttribute 的做用是告訴CLR,它標記的靜態字段的存取是依賴當前線程,而獨立於其餘線程的。

例如:

class MyClass{
    [ThreadStatic] static public string threadvalue;
}

MyClass 中的threadvalue就是一個線程靜態字段 。 若是一個程序中同時有多個線程同時訪問這個字段,則每一個線程訪問的都是獨立的threadvalue 。例如線程1設置它爲」hello」,而後線程2設置它爲」world」,最後線程1讀取它的時候,獲得的是」hello」。

基於這個,線程靜態字段有如下特徵:

  • 它是靜態的字段。因此不須要MyClass的實例,直接用 MyClass.threadvalue的形式來訪問就能夠了。
  • 它的存取是根據線程來指定內存位置的,因此它的存取速度較慢。
  • 訪問線程靜態字段不可能發生線程不一樣步問題。由於雖然語意上不一樣線程訪問的是同一字段,但實際上不一樣線程訪問的是不一樣的內存塊。
  • 一條線程不可能訪問到另一條線程上的線程靜態字段。就算你獲得另一條線程的System.Threading.Thread 對象的引用也不行。

可是,使用線程靜態字段要注意:

  • 字段上的初始化語句在類的靜態構造方法中執行。因此語句只執行一句。其餘線程再訪問這個字段時,爲字段的類型的默認值。
  • 若是不一樣線程上的字段都引用同一對象,那麼不表明該對象是線程同步的。由於[ThreadStatic]指的是字段是隔離的。可是它引用的對象則不被[ThreadStatic]控制。

若是你知道 System.Runtime.Remoting.Messaging.Context (如下簡稱MContext)
那麼MContext和線程靜態字段有什麼不一樣呢?

    • 他們能夠說都是與當前線程相關的。可是他們不是同一個東西。
    • MContext是基於名稱的,能夠根據名稱儲存不一樣的數據。而ThreadStatic不會有名稱衝突。
    • ThreadStatic 是CLR內部實現的。而 MContext 是附屬在 System.Threading.Thread 對象的一個字典。
    • 線程靜態字段的存取速度比MContext的快
    • MContext被叫作邏輯線程上下文數據。它的數據會在異步調用的時候複製到另一條線程中。而線程靜態字段是不會被複制的。(例如 eventHandlerInst.BeginInvoke(...)時,在新的線程中,就擁有原線程上MContext的數據。在eventHandlerInst.EndInvoke執行時,新線程上的MContext上的數據就會還原到調用EndInvoke的線程上.這個在之後講到Remoting時會詳細說)
    • System.Web.HttpContext.Current 是用 MContext 實現的。

http://www.cnblogs.com/lori/archive/2013/04/17/3026061.html

 List<T>傳值   
 [__DynamicallyInvokable]
    public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)
    {
      if (source == null)
        throw Error.ArgumentNull("source");
      return new List<TSource>(source);
    }




  /// <summary>
    /// 初始化 <see cref="T:System.Collections.Generic.List`1"/> 類的新實例,該實例包含從指定集合複製的元素而且具備足夠的容量來容納所複製的元素。
    /// </summary>
    /// <param name="collection">一個集合,其元素被複制到新列表中。</param><exception cref="T:System.ArgumentNullException"><paramref name="collection"/> 爲 null。</exception>
    [__DynamicallyInvokable]
    public List(IEnumerable<T> collection)
    {
      if (collection == null)
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.collection);
      ICollection<T> collection1 = collection as ICollection<T>;
      if (collection1 != null)
      {
        int count = collection1.Count;
        if (count == 0)
        {
          this._items = List<T>._emptyArray;
        }
        else
        {
          this._items = new T[count];
          collection1.CopyTo(this._items, 0);
          this._size = count;
        }
      }
      else
      {
        this._size = 0;
        this._items = List<T>._emptyArray;
        foreach (T obj in collection)
          this.Add(obj);
      }
    }
View Code

 

   [TestMethod]
        public void TestMethod2()
        {
            IList<PostData> list = new List<PostData>();
            list.Add(new PostData() { id = "1111", startId = "11" });
           list.Add(new PostData() { id = "2222", startId = "11" });
            file(list);
            Assert.IsTrue(list.Count==1);//2
        }

        public void file(IList<PostData> list)
        {
            list = list.Where(p => p.id == "1111").ToList();
        }

 

 終結器    http://blog.csdn.net/fxqcn/article/details/6717426
託管代碼和非託管代碼  

http://www.cnblogs.com/muzhiye/archive/2012/02/23/2365556.html 

net託管代碼是運行在.NET FRAMEWORK上的,相似於JAVA虛擬機

託管代碼:屬安全代碼,由於不涉及指針,但相對性能上較低,C#寫出來的東西就能夠認爲是託管代碼

非託管代碼:非安全的,可使用指針,性能較高,C++那是寫出來的東西就能夠認爲是非託管代碼,還有好比MFC等等

通常地,項目開發用託管代碼便可。

簡單來講:
託管代碼就是把有關內存管理的操做全都由CLR來管理,也就是把底層的一些操做全都封裝起來了(安全性上就相對高點,由於不能直接進行內存讀取,不會出現內存溢出之類的問題,但相對的,性能會有損失,使用起來也會不夠靈活);
非託管代碼,能夠直接進行硬件操做,性能比較好;
比較直觀的例子就是:C#使用垃圾回收,而C++須要手動釋放
-------------------------------------------
CLI的定義:Common Language Infrastructure公共語言基礎結構
C#生成的不是處理器能直接解釋的指令,而是一種中間語言指令,即CIL:Common Intermediate Language,第二個編譯步驟一般在執行時發生,在這個過程當中,CIL被轉換成處理器能理解的機內碼,但要想執行,僅僅轉換爲機內碼仍是不行的,C#程序還須要在一個代理的上下文中執行,負責管理C#程序執行的這個代理就是虛擬執行系統Virtual Execution System,VES,又稱爲「運行時」,運行時負責加載和運行程序,並在程序執行時提供額外的服務(好比安全、垃圾回收等)。
也就是說「運行時」:runtime它不是指一個時間,而是特指「虛擬執行系統」這個代理,負責管理C#程序的執行

 C#編譯器  JIT編譯器  

從C#的源代碼到機器代碼,中間要通過兩個編譯器。一個就是把C#源代碼編譯成託管模塊的C#編譯器。另外一個就是做爲CLR一個組件的JIT編譯器。每通過一次編譯,程序的語言就更低級一步。

C#編譯器生成的是IL語言和元數據

 

C#編譯器是用來生成包含IL和元數據的模塊的,一旦編譯完成,東西基本就是定下來了的。而JIT編譯器會根據元數據和狀況來作一些改變。好比泛型中的類型參數的填入和生成相應的機器代碼,都是JIT編譯器作的,而不是C#編譯器。C#編譯器的工做就是生成相應的IL和元數據告訴JIT這是一個泛型類型,有類型實參。編譯好的程序集,放在那裏不動,程序集裏的IL和元數據固然不會發生變化。而同一個程序集,在不一樣CLR版本中的行爲和性能就有可能不一樣,也是同樣的道理。

 

 http://www.cnblogs.com/lwzz/archive/2011/06/08/2075757.html

http://www.cnblogs.com/lwzz/archive/2011/06/11/2078576.html

 CLR VIA    http://www.cnblogs.com/janes/category/308324.html
 

.Net 託管模塊與程序集的關係

   http://blog.csdn.net/kmguo/article/details/17055065
  

.NET概念:.NET程序編譯和運行

 

  http://blog.csdn.net/yysyangyangyangshan/article/details/7306346

 

 

 淺談.NET中泛型的基本原理  

 http://www.cnblogs.com/DebugLZQ/archive/2012/09/03/2669383.html

 

 NET PDB文件究竟是什麼?  

 http://www.cnblogs.com/imjustice/archive/2013/06/07/note_about_dot_net_pdb_file.html

這個文件會在咱們調試的時候被使用到,這個東西能夠理解爲調試的時候應用程序和源文件之間的一個橋樑。正是歸功於這個文件,咱們才能在debug的時候看到程序當前執行相對應的代碼和監視到一些變量

主要遠程調試能夠用

 彙編    
 類型參數    

尖括號中的T是不肯定的數據類型,叫作類型參數,通常規定以字母T開頭,能夠是TKey, TValue均可以。而調用時指定的具體類型叫作類型實參

 開放類型與封閉類型    

開放類型:具備泛型參數的類型是開放類型,如List<T>,CLR不容許構造開放類型的實例;

封閉類型:在實際調用代碼時,若是全部類型實參都已經指定了實際數據類型,如List<string>,則該類型爲封閉類型。CLR容許構造封閉類型的實例。

 

正確實現 IDisposable 接口

 

 http://www.cnblogs.com/xlshcn/archive/2007/01/16/idisposable.html

在.NET的對象中實際上有兩個用於釋放資源的函數:Dispose和Finalize。Finalize的目的是用於釋放非託管的資源,而Dispose是用於釋放全部資源,包括託管的和非託管的。

Dispose和Finalize。Finalize的目的是用於釋放非託管的資源,而Dispose是用於釋放全部資源,包括託管的和非託管的。

 C# 託管資源和非託管資源  

 那麼對於非託管的資源,這裏再重申一下,就是Stream,數據庫的鏈接,GDI+的相關對象,還有Com對象等等這些資源

最多見的一類非託管資源就是包裝操做系統資源的對象,例如文件,窗口或網絡鏈接,對於這類資源雖然垃圾回收器能夠跟蹤封裝非託管資源的對象的生存期,但它不瞭解具體如何清理這些資源。還好.net Framework提供了Finalize()方法,它容許在垃圾回收器回收該類資源時,適當的清理非託管資源。若是在MSDN Library 中搜索Finalize將會發現不少相似的主題,這裏列舉幾種常見的非託管資源:ApplicationContext,Brush,Component,ComponentDesigner,Container,

Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen,Regex,Socket,StreamWriter,Timer,Tooltip 等等資源。

http://blog.csdn.net/liangjin1126/article/details/2660946

相關文章
相關標籤/搜索