1. 程式人生 > >c#引用型別變數在程式中的變化

c#引用型別變數在程式中的變化

這是我的第一篇部落格。

想到寫部落格,是因為記錄在紙上的東西,總怕哪天一丟,那些出過的錯誤又回來纏繞自己。

好了,那就步入正題吧!

c#引用型別,具體請看別人寫的部落格吧

這裡有一個有趣的現象:

class Program
    {
        static void Main(string[] args)
        {
            object a = "test";
            object b = "te" + "st";
            System.Console.WriteLine(string.Format("k == j:{0}",a == b));
            System.Console.WriteLine(string.Format("a:{0}->{1}  b:{2}->{3}", a, getMemory(a), b, getMemory(b)));
            string s1 = "test";
            string s2 = "te";
            s2 += "st";
            var a1 = (object)s1;
            var a2 = (object)s2;
            System.Console.WriteLine(string.Format("s1 == s2:{0}",s1 == s2));
            System.Console.WriteLine(string.Format("a1 == a2:{0}",a1 == a2));
            System.Console.WriteLine(string.Format("a1:{0}->{1}  a2:{2}->{3}", a1, getMemory(a1), a2, getMemory(a2)));
            System.Console.ReadLine();
        }
        public static string getMemory(object o) // 獲取引用型別的記憶體地址方法
        {
            GCHandle h = GCHandle.Alloc(o, GCHandleType.Pinned);
            IntPtr addr = h.AddrOfPinnedObject();
            return addr.ToString();
        }
    }

//-----輸出結果------

k == j:True
a:test->52754720  b:test->52754720
s1 == s2:True
a1 == a2:False
a1:test->52754720  a2:test->52759772

由此看出,引用型別變數是否相等,是要看引用的地址是否相同。特別說明,字串是特殊的應用型別,值相等,引用相同。

以上是鄙人在瞭解引用型別的過程中所做的功課,但是,發生這一切的,卻是另一個問題,簡單描述如下:

class A

{

IList<PatrolRecord> PatrolRecords;

functionName()

{

IList<PatrolRecord> patrolRecords = this.PatrolRecords.OrderBy(a => a.PatrolPoint).ThenBy(a => a.PatrolResult.Value).ToList();

}

}

當對A的例項,呼叫functionName方法的時候,我發現該例項的屬性PatrolRecords並沒有發生任何變化。出於質疑和好奇,最後驗證得出,OrderBy該屬性後,會產生一個新例項。

由此,我便恍然大悟,然而,其中緣由不得而知。鄙人雖好思考,但無從做參考,也就罷了。

相關推薦

c#引用型別變數程式變化

這是我的第一篇部落格。 想到寫部落格,是因為記錄在紙上的東西,總怕哪天一丟,那些出過的錯誤又回來纏繞自己。 好了,那就步入正題吧! c#引用型別,具體請看別人寫的部落格吧 這裡有一個有趣的現象: class Program     {         static void

關於C++多執行緒程式簡單型別(int/bool)的安全性

關於這個問題,很少有聽到權威的解答。偶這裡也只是收集各處資料,以嘗試對今後寫出高質量的程式碼做一定的保證。 通常會聯想到這個問題應該跟CPU架構相關。CSDN上也有人做了實驗。根據其結論,在x86上,對1位元組byte/2位元組word/4位元組int型別的讀寫操作都是原子

java為什麼不能在靜態域或方法引用型別變數

在《Java核心技術 卷I》中,提到“不能在靜態域或方法中引用型別變數”。示例程式碼如下:        接著,下面的文字解釋說:如果這個程式能夠執行(也就是允許題目中所提的情況),就可以宣告一個S

C++--引用型別,含有可變引數的函式

引用型別 引用是識別符號的別名 定義一個引用的時候,必須同時對他初始化,使它指向一個已經存在的物件  例如:其實在定義引用變數ri的時候,ri相當於變數j的別名 int i,j; int &ri = i;//定義int引用ri,並初始化為變數i的引用

JAVA基礎 引用型別變數和基本型別變數

一     基本型別的變數名是變數本身。   包括八種基本資料型別 引用型別變數的名字是複雜資料的儲存地點。包括類   陣列(字串)   介面 String s="Hello world!"; 許多人都寫過這樣的語句,但是,我們到底聲明瞭什麼呢?一休,你回答一下。 一休

c#資料型別/變數/常量/計算機資料儲存(進位制之間的相互轉化)

一c#資料型別 注:值型別:值直接儲存在堆疊中(儲存空間小,呼叫速度快); 引用型別:值儲存在堆中(儲存空間大,呼叫速度慢) 1.值型別 a. 值型別變數可以直接分配給一個值.它們是從類System.ValueType中派生的. b.值型別直接儲存其值. c.值型別的例項通常是線上程棧上

型別變數引用型別變數的區別

主要區別在於 系統在記憶體空間中為兩者分配儲存空間的方式不同。 1、記憶體空間 記憶體空間分為棧空間和堆空間。值型別資料的儲存空間在棧空間中分配,引用型別資料則在堆空間分配。 由系統管理棧空間的所有操作,包括進棧和出棧。當一個數據出棧後,其所分配到的儲存空間由系統自動回收。

Java基礎-基本型別變數引用型別變數

前言 每個變數佔據了一定的記憶體位置,宣告一個變數時,就是在告知編譯器這個變數可以存放什麼型別(佔據多少個位元組的記憶體)。 什麼是基本型別變數 一、定義 JAVA語言本身定義的整型、字元型、浮點型和布林型別是基本型別變數,通俗來說可利用關鍵字宣告的變數

c++ 引用型別【&】需注意之第一次有效性

c++中的引用型別大家都有所瞭解,但是它的“第一次有效性”常常被忽略。 什麼是第一次有效性呢?就是引用型別只有在第一次附值時被當作引用,其它時候的附值被認為是對它所引用的內容進行的附值。 舉個小例子: #include <iostream> using namespace

C# 引用型別陣列

先自定義一個類card,  class card     {          public  int par1;     }     card[] ca = new card[3];             for (int i = 0; i < 3; i++)

C#引用型別引數加ref或out與不加ref或out的區別

通過下面的例子說明引用型別引數加ref和不加ref的區別   class   a     {           int   val;     }     class   test     {           public   static   void   Main()           

c++各種型別變數的記憶體分配

                                                             VC ++ 6.0  編譯器編譯期儲存器分配模型(記憶體佈局)                                                              

C語言基礎--測試程式實現對FPS的控制

const int FRAMES_PER_SECOND = 25; const int SKIP_TICKS = 1000 / FRAMES_PER_SECOND; DWORD next_game_tick = GetTickCount(); // GetTickCoun

C#在控制檯應用程式顯示輸出位元組型資料

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T

基本型別變數引用型別變數的實參和形參

傳參即是實參的值賦給形參。對於基本型別的形參,在方法內部對形參的修改只會侷限在方法內部,不會影響實參。 比如,給Calculator增加一個increase(int)方法: class Calculator { public int add(int a,

C++ 引用型別const形參的用法

今天在看《C++沉思錄》後,對const引用形參的用法又有了進一步的認識。在此,想把我個人對const引用形參的了 解分享給大家。如果有不到之處,還往各位同仁指出。 第一種情況: class Tes

C++引用—臨時變數引用引數和const引用和左值右值引用

如果實參與引用引數不匹配,C++將生成臨時變數。如果引用引數是const,則編譯器在下面兩種情況下生成臨時變數:          實參型別是正確的,但不是左值          實參型別不正確,但可以轉換為正確的型別 Double refcube(const

C++ 引用型別

引用型別:可以獲得指標型別的效果,但是又可以避免指標可讀性和可維護性差等問題。 1. 定義     <型別> &<引用變數>;     定義時要初始化     <型別>可以是除了void以外的任意C++型別。     如: int

C#型別引用型別的區別

值型別是直接儲存一個數值,而引用型別是儲存對值的引用,這兩種型別分別儲存在不用的記憶體區域。而從記憶體上看,值型別是在棧中的操作,而引用型別是在堆中的操作。值型別是具體的那個數值所佔用的空間大小,而引用

c#引用型別/例項/堆/自動回收

自己用做記錄相關知識點,若你看到,則以批判眼光看,怕有些地方沒說對,或有些概念不合理,誤導你 首先我們看看c中的一段程式碼 ``` //main.cpp int a = 0; //全域性初始化區 int a = 0; //全域性初始化區 char *p1; /