<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

        ASP.NET Ref和Out關(guān)鍵字區(qū)別分析

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:44:46
        文檔

        ASP.NET Ref和Out關(guān)鍵字區(qū)別分析

        ASP.NET Ref和Out關(guān)鍵字區(qū)別分析: 值類型 引用類型 以C#為例:其值類型為sbyte,byte,char,short,ushort,int,uint,long和ulong,float和double,當(dāng)然還有decimal和bool。而引用類型則是string和object。 我想說的 我想說的就是——Ref和Out把我弄糊涂的原因是,當(dāng)時(shí)沒有認(rèn)真
        推薦度:
        導(dǎo)讀ASP.NET Ref和Out關(guān)鍵字區(qū)別分析: 值類型 引用類型 以C#為例:其值類型為sbyte,byte,char,short,ushort,int,uint,long和ulong,float和double,當(dāng)然還有decimal和bool。而引用類型則是string和object。 我想說的 我想說的就是——Ref和Out把我弄糊涂的原因是,當(dāng)時(shí)沒有認(rèn)真

        1. 值類型
        2. 引用類型

        以C#為例:其值類型為sbyte,byte,char,short,ushort,int,uint,long和ulong,float和double,當(dāng)然還有decimal和bool。而引用類型則是string和object。

        我想說的

        我想說的就是——Ref和Out把我弄糊涂的原因是,當(dāng)時(shí)沒有認(rèn)真的去分析它對(duì)不同類型所做出的不同的動(dòng)作。

         

        對(duì)于值類型。

        使用了Ref和Out的效果就幾乎和C中使用了指針變量一樣。它能夠讓你直接對(duì)原數(shù)進(jìn)行操作,而不是對(duì)那個(gè)原數(shù)的Copy進(jìn)行操作。舉個(gè)小例子:

        using System;namespace ConsoleApplication4
        {
             /// <summary>
             /// Class1 的摘要說明。
             /// </summary>
         class Class1
         {
              /// <summary>
              /// 應(yīng)用程序的主入口點(diǎn)。
              /// </summary>
          [STAThread]
          static void Main(string[] args)
          {
               int a = 5;
               int b;       squareRef(ref a);
               squareOut(out b);       Console.WriteLine("The a in the Main is: " + a);
               Console.WriteLine("The b in the Main is: " + b);
          }  static void squareRef(ref int x)
          {
               x = x * x;
               Console.WriteLine("The x in the squareRef is: " + x);
          }  static void squareOut(out int y)
          {
               y = 10;
               y = y * y;
               Console.WriteLine("The y in the squareOut is: " + y);
          }
         }
        }

        顯示的結(jié)果就是——25 100 25 100。

        這樣的話,就達(dá)到了和C中的指針變量一樣的作用。

        對(duì)于引用類型。

        對(duì)于引用類型就比較難理解了。

        先要了解到這一層——就是當(dāng)一個(gè)方法接收到一個(gè)引用類型的變量的時(shí)候,它將獲得這個(gè)引用(Reference)的一個(gè)Copy。由于Ref關(guān)鍵字可以用來向方法傳遞引用。所以,如果這個(gè)功能被誤用了——比如:當(dāng)一個(gè)如數(shù)組類型的引用對(duì)象用關(guān)鍵字Ref傳遞的時(shí)候,被調(diào)用的方法實(shí)際上已經(jīng)控制了傳遞過來的引用本身。這樣將使得被調(diào)用方法能用不同的對(duì)象甚至NULL來代替調(diào)用者的原始引用!

        如圖。內(nèi)存地址為2000的變量arrayA中其實(shí)存放著數(shù)組{1,2,3,4,……}的內(nèi)存起始地址10000。如果一個(gè)方法fun()使用fun( arrayA[] )的話,它將順利的獲得數(shù)據(jù)10000,但這個(gè)10000將放在一個(gè)Copy中,不會(huì)放到內(nèi)存的2000位置。而這個(gè)時(shí)候我們?nèi)绻褂胒un( ref arrayA[] )的話,我們得到的值就是2000啦(也就是說,被調(diào)用方法能夠修改掉arrayA中的那個(gè)引用,使之不再指向10000,甚至可以用NULL來代替10000,這樣的話,那個(gè)10000地址中的數(shù)據(jù)可能就要被垃圾回收機(jī)制清理了。)

        有個(gè)例子:

        using System;
        using System.Drawing;
        using System.Collections;
        using System.ComponentModel;
        using System.Windows.Forms;
        using System.Data;

        namespace RefOut
        {
         /// <summary>
         /// Form1 的摘要說明。
         /// </summary>
         public class Form1 : System.Windows.Forms.Form
         {
          private System.Windows.Forms.Button button1;
          private System.Windows.Forms.Label label1;
          /// <summary>
          /// 必需的設(shè)計(jì)器變量。
          /// </summary>
          private System.ComponentModel.Container components = null;

          public Form1()
          {
           //
           // Windows 窗體設(shè)計(jì)器支持所必需的
           //
           InitializeComponent();

           //
           // TODO: 在 InitializeComponent 調(diào)用后添加任何構(gòu)造函數(shù)代碼
           //
          }

          /// <summary>
          /// 清理所有正在使用的資源。
          /// </summary>
          protected override void Dispose( bool disposing )
          {
           if( disposing )
           {
            if (components != null)
            {
             components.Dispose();
            }
           }
           base.Dispose( disposing );
          }

          #region Windows 窗體設(shè)計(jì)器生成的代碼
          /// <summary>
          /// 設(shè)計(jì)器支持所需的方法 - 不要使用代碼編輯器修改
          /// 此方法的內(nèi)容。
          /// </summary>
          private void InitializeComponent()
          {
           this.button1 = new System.Windows.Forms.Button();
           this.label1 = new System.Windows.Forms.Label();
           this.SuspendLayout();
           //
           // button1
           //
           this.button1.Dock = System.Windows.Forms.DockStyle.Top;
           this.button1.Location = new System.Drawing.Point(0, 0);
           this.button1.Name = "button1";
           this.button1.Size = new System.Drawing.Size(480, 32);

        ; this.button1.TabIndex = 0;
           this.button1.Text = "顯示輸出";
           this.button1.Click += new System.EventHandler(this.button1_Click);
           //
           // label1
           //
           this.label1.Location = new System.Drawing.Point(8, 48);
           this.label1.Name = "label1";
           this.label1.Size = new System.Drawing.Size(456, 336);
           this.label1.TabIndex = 1;
           this.label1.Text = "label1";
           //
           // Form1
           //
           this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
           this.ClientSize = new System.Drawing.Size(480, 405);
           this.Controls.Add(this.label1);
           this.Controls.Add(this.button1);
           this.MaximizeBox = false;
           this.MinimizeBox = false;
           this.Name = "Form1";
           this.Text = "Ref & Out";
           this.ResumeLayout(false);

         

          }
          #endregion

          /// <summary>
          /// 應(yīng)用程序的主入口點(diǎn)。
          /// </summary>
          [STAThread]
          static void Main()
          {
           Application.Run(new Form1());
          }

          private void button1_Click(object sender, System.EventArgs e)
          {
           int[] firstArray = {1, 2, 3};
           int[] firstArrayCopy = firstArray;

           this.label1.Text = "Test Passing firstArray reference by value";
           this.label1.Text += "\n\nContents of firstArray before calling FirstDouble:\n\t";

           for(int i = 0;i < firstArray.Length; i++)
           {
            this.label1.Text += firstArray[i] + " ";
           }

           FirstDouble(firstArray);

           this.label1.Text += "\n\nContents of firstArray after calling FirstDouble.\n\t";

           for(int i=0;i<firstArray.Length;i++)
           {
            this.label1.Text += firstArray[i] + " ";
           }

           if(firstArray == firstArrayCopy)
            this.label1.Text +="\n\nThe references refer to the same array.\n";
           else
            this.label1.Text +="\n\nThe reference refer to different arrays.\n";

           int[] secondArray = {1, 2, 3};
           int[] secondArrayCopy = secondArray;

           this.label1.Text += "\nTest passing secondArray reference by reference.";
           this.label1.Text += "\n\nContents of secondArray before calling SecondDouble:\n\t";

           for(int i=0;i<secondArray.Length; i++)
           {
            this.label1.Text += secondArray[i] + " ";
           }

           SecondDouble(ref secondArray);
           this.label1.Text +="\n\nContents of secondArray after calling SecondDouble:\n\t";

           for(int i=0; i<secondArray.Length;i++)
           {
            this.label1.Text += secondArray[i] + " ";
           }

           if(secondArray== secondArrayCopy)
            this.label1.Text += "\n\nThe reference refer to the same array.";
           else
            this.label1.Text += "\n\nThe reference refer to different arrays.";

           this.label1.Text += "\n___________________heshi_________________\nsecondarray\n";

           for(int i = 0;i<secondArray.Length;i++)
           {
            this.label1.Text += secondArray[i] + " ";
           }
           this.label1.Text +="\nsecondarraycopy\n";
           for(int i=0;i<secondArrayCopy.Length;i++)
           {
            this.label1.Text += secondArrayCopy[i] + " ";
           }


          }

          void FirstDouble(int[] array)
          {
           for(int i = 0;i<array.Length;i++)
            array[i] *= 2;
           array = new int[] {11, 12, 13};
          }

          void SecondDouble(ref int[] array)
          {
           for(int i=0;i<array.Length;i++)
           {
            array[i] *= 2;

           }
           array = new int[] {11, 12, 13};
          }
         }
        }
        運(yùn)行后的結(jié)果是:運(yùn)行后的結(jié)果

        這個(gè)就說明了被調(diào)用的程序已經(jīng)改變了原有的Reference。

        總結(jié)

        總的說來,Ref和Out這兩個(gè)關(guān)鍵字都能夠提供相似的功效,其作用也很像C中的指針變量。稍有不同之處是:

        1. 使用Ref型參數(shù)時(shí),傳入的參數(shù)必須先被初始化。而Out則不需要,對(duì)Out而言,就必須在方法中對(duì)其完成初始化。
        2. 使用Ref和Out時(shí)都必須注意,在方法的參數(shù)和執(zhí)行方法時(shí),都要加Ref或Out關(guān)鍵字。以滿足匹配。
        3. Out更適合用在需要Return多個(gè)返回值的地方,而Ref則用在需要被調(diào)用的方法修改調(diào)用者的引用的時(shí)候。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        ASP.NET Ref和Out關(guān)鍵字區(qū)別分析

        ASP.NET Ref和Out關(guān)鍵字區(qū)別分析: 值類型 引用類型 以C#為例:其值類型為sbyte,byte,char,short,ushort,int,uint,long和ulong,float和double,當(dāng)然還有decimal和bool。而引用類型則是string和object。 我想說的 我想說的就是——Ref和Out把我弄糊涂的原因是,當(dāng)時(shí)沒有認(rèn)真
        推薦度:
        標(biāo)簽: 區(qū)別 out 關(guān)鍵字
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 一本色道久久88综合亚洲精品高清| 希望影院高清免费观看视频| 免费一级毛片在线播放| 亚洲一久久久久久久久| 日韩免费a级毛片无码a∨| 久久亚洲AV无码精品色午夜麻豆| 91在线手机精品免费观看| 亚洲国产美国国产综合一区二区| 久久99精品视免费看| 亚洲毛片在线观看| AV大片在线无码永久免费| 亚洲人成在线精品| 日本免费电影一区| 亚洲视频在线免费| 亚洲今日精彩视频| 成年美女黄网站18禁免费| 国产亚洲精品精品精品| 红杏亚洲影院一区二区三区| 中国精品一级毛片免费播放| 亚洲一区二区影院| 成人免费视频一区| 午夜成人无码福利免费视频| 亚洲欧洲日产国码无码网站 | 国产成人亚洲精品狼色在线| 好男人资源在线WWW免费| 亚洲AV无码乱码国产麻豆| 99热在线观看免费| 亚洲日韩一区精品射精| 亚洲第一区精品观看| 国内精品一级毛片免费看| 亚洲同性男gay网站在线观看| 日本最新免费不卡二区在线| fc2免费人成在线| 亚洲国产韩国一区二区| 国产老女人精品免费视频| 你懂的免费在线观看| 亚洲最大的黄色网| av在线亚洲欧洲日产一区二区| 18禁成人网站免费观看| 黄床大片30分钟免费看| 4480yy私人影院亚洲|