1. 程式人生 > >反射中使用值型別與引用型別的引數的區別

反射中使用值型別與引用型別的引數的區別

程式 :

 public class ClassExample
    {
        public string myString;
    }
    public struct StructExample {
        public string myString;
    }

    public class FieldInfo_SetValue
    {
        public static void Main()
        {

            ClassExample c = new ClassExample();
            StructExample s = new StructExample();
            object o = s;
            ArrayList al = new ArrayList();
            al.Add(s);

            Type cType = c.GetType();
            FieldInfo cFieldInfo = cType.GetField("myString");
            cFieldInfo.SetValue(c, "value");
            Console.WriteLine("ClassExample:" + c.myString);
           
            Type sType = s.GetType();
            FieldInfo sFieldInfo = sType.GetField("myString");
            sFieldInfo.SetValue(s,"value");
            Console.WriteLine("StructExample:" + s.myString);


            sFieldInfo.SetValue(o, "value");
            Console.WriteLine("objectExample:" + ((StructExample)o).myString);
           
            sFieldInfo.SetValue(al[0], "value");
            Console.WriteLine("ArrayList:" + ((StructExample)al[0]).myString);
   
            Console.Read();
        }
    } 

結果

ClassExample:value
StructExample:
objectExample:value
ArrayList:value

結果表明在

sFieldInfo.SetValue(s,"value"); ////這兒有個裝箱過程setvalue(s,"value")時s被copy了一份

//這樣操作的結果是在SetValue另一個StructExample  克隆被設定了值,但傳入的值StructExample   s並不會被改變
Console.WriteLine("StructExample:" + s.myString);

s.myString此時還是預設值String.Empty,解決的方法是傳入一個引用型別還不是值型別,比如將struct轉為object然後傳入.或其它任何辦法都行

相關推薦

C#傳遞引用傳遞的區別

以值傳遞引數 當實參當作值來傳遞時,就產生了一個新的拷貝。 class Test { static void Main(string[] args) { int x=8; Fo(x);

反射使用型別引用型別引數區別

程式 :  public class ClassExample    {        public string myString;    }    public struct StructExample {        public string myString;  

C#的棧和堆、型別引用型別引數引用引數、輸出引數引數陣列

程式執行時,資料必須儲存在記憶體中,一個數據需要多大的記憶體、儲存的位置、如何儲存依賴於該資料的資料型別。執行中的程式使用兩個記憶體區域來儲存資料:棧和堆。 棧:                 棧是一

C#型別引用型別區別

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

js的基本型別引用型別,以及物件引用,物件的淺拷貝深拷貝

js有兩種型別的值:棧:原始資料型別(undefinen,null,boolead,number,string)堆:引用資料型別(物件,函式和陣列)兩種型別的區別是:儲存位置不同,原始資料型別直接儲存在棧(stack)中的簡單資料段,佔據空間小,大小固定,屬於被頻繁使用的資料,所以放入棧中儲存;引用資料型別儲

第九回:品味型別---型別引用型別)-規則無邊

 本文將介紹以下內容: 型別的基本概念  值型別深入 引用型別深入 值型別與引用型別的比較及應用   1. 引言 上回[第八回:品味型別---值型別與引用型別(上)-記憶體有理]的釋出,受到大家的不少關注,我們從記憶體的角度瞭解了值型別和引用型別的所以然,留下的任務當然是

深入解析js基本資料型別引用型別,函式引數傳遞的區別

ECMAScript的資料有兩種型別:基本型別值和引用型別值,基本型別指的是簡單的資料段,引用型別指的是可能由多個值構成的物件。 Undefined、Null、Boolean、Number和String是值型別,其他都是引用型別。其他語言String是

.NET型別引用型別

.NET中的值型別與引用型別 這是一個常見面試題,值型別(Value Type)和引用型別(Reference Type)有什麼區別?他們效能方面有什麼區別? TL;DR(先看結論) 值型別 引用型別 建立位置 棧 託管堆 賦值時 複製值 複製引用 動態記憶體分配 無 需要分配記憶體

js的棧堆的講解/基本資料型別引用型別的講解

1、棧(stack)和堆(heap)   stack為自動分配的記憶體空間,它由系統自動釋放;而heap則是動態分配的記憶體,大小不定也不會自動釋放。        2、基本型別和引用型別   基本型別:存放在棧記憶體中的簡單資料段,資料大小確定,記憶體空間大小可以分配。   5種基

型別引用型別區別

值型別 struct結構,enum列舉 結構包括: 簡單結構(int,char,float,double,bool.....),使用者自定義的結構體, 引用型別 類,陣列,介面,代理 類包括 object,string,使用者自定義類 區別 (1)值型別存在棧上

PythonJavaScript對比:型別引用型別

終於鼓起勇氣學習Python了,簡單做些筆記 Python值型別:Number、str、tuple、num 等 a = 2 b = a a = 3 修改值型別的值,只是讓它指向一個新的記憶體地址,並不會改變變數b的值 -----------------------

型別引用型別之間的區別

值型別:是指直接將記憶體儲存在棧內,由系統自動釋放資源的資料型別. 引用型別:是指由型別的實際值引用表示的資料型別. 兩者直接的區別在於值型別儲存具體的值,引用型別儲存值的地址 值型別: 例如:var a=1,b=2; b++; 這時b為3,a為1 引用型別:

淺析型別引用型別的記憶體分配[轉載]

1、值型別和引用型別的區別 1.值型別的資料儲存在記憶體的棧中;引用型別的資料儲存在記憶體的堆中,而記憶體單元中只存放堆中物件的地址。 2.     值型別存取速度快,引用型別存取速度慢。 3.     值型別表示實際資料,引用型別表示指向儲存在記憶體堆中的資料的指標或引用

型別引用型別及其物件複製

引言 本文之初的目的是講述設計模式中的 Prototype(原型)模式,但是如果想較清楚地弄明白這個模式,需要了解物件克隆(Object Clone),Clone其實也就是物件複製。複製又分為了淺度複製(Shallow Copy)和深度複製(Deep Copy),淺度複製 和 深度複製又是以

型別引用型別淺析

1、 總概括:        值型別就是現金,要用直接用;引用型別是存摺,要用還得先去銀行取現。 2、值型別與引用型別簡介 (1)C#的所有值型別均派生自System.ValueType:            結構體:                數值型別:整型(by

golang 型別引用型別區別

1最本質的區別 值型別:記憶體中變數儲存的是具體的值 比如: var num int  num存放的是具體的int值  但是變數在記憶體中的地址可以通過 &num 來獲取 引用型別:變數直接存放的就是一個地址值,這個地址值指向的空間存的才是值。 例如 va

C#學習筆記(5)-型別引用型別

值型別 值型別的值存在棧上 int double char decimal bool enum struct 引用型別 引用型別存在堆上 - string - 陣列 - 自定義類 - 集合 - object - 介面

C# 淺析型別引用型別的記憶體分配

1、  值型別和引用型別的區別 1.值型別的資料儲存在記憶體的棧中;引用型別的資料儲存在記憶體的堆中,而記憶體單元中只存放堆中物件的地址。 2.     值型別存取速度快,引用型別存取速度慢。 3.     值型別表示實際資料,引用型別表示指向儲存在記憶體堆中的資料的指標

C#型別引用型別在使用上的區別

值型別與引用型別 為了探明兩者區別,直接看程式碼: public class Object_1 { private int m_Age; public int Age { get

java基本型別引用型別

java基本型別與引用型別 一、基本資料型別 二、引用型別 三、基本型別與引用型別的區別 1.預設值 2.記憶體分配 3.自動裝箱、自動拆箱 4.自動裝箱、拆箱帶來的問題 1.程式的效能