zoukankan      html  css  js  c++  java
  • c#关键字,ref和out

        最近在写程序时遇到ref,out 参数问题。回头有自习看了看MSDN,才有巩固了基础。我把我的测试程序贴出来,大家分享一下。
        ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。传递到 ref 参数的参数必须最先初始化。这与 out 不同,后者的参数在传递之前不需要显式初始化。这是out与ref的却别所在。
         有点像,c++中的函数传递引用,和传递值。比较经典的程序是交换两个数。这里不在贴出代码。

    代码
    using System;
    using System.Collections.Generic;

    public class MyClass
    {
     
    public static void Main()
     {
     
      
    /// 通过测试发现,基类型的参数,在没有用ref 的声明后,其值并没有改变,说明此函数中传递的是值。
      
    /// 但是,当使用ref 参数是发现,其值发生了变化,说明在此函数中传递的是引用。
      int x=100;
      ChangeTheNumber(
    ref x);
      Console.WriteLine(x.ToString());
      
      
      
    ///通过测试发现,类的实例作为,参数,即使不用ref 参数,它的属性也发生了变化。那是因为,类的的实例,是一个引用。所以不用再使用ref了。
      
    /// 这让我想到了,几个月前的项目开发,在不同窗体之间传递参数,但是一直想着做个什么共有方法,然后互相调用。但是,其实很简单,
      
    /// 在构造函数中传入需要传入的类的实例就可以了,因为传递的是引用。其属性都会变化。不用再用什么麻烦的方法了。
      
    ///TestTheClass
         TestClass classInstance1=new TestClass("firstname");
      ChangeTheNumber(classInstance1);
      Console.WriteLine(classInstance1.Name);
      
      TestClass classInstance2
    =new TestClass("second");
      ChangeTheNumber(classInstance2);
      Console.WriteLine(classInstance2.Name);
      Console.Read();
     }
     
     
    #region Helper methods

     
    private static void WL(object text, params object[] args)
     {
      Console.WriteLine(text.ToString(), args); 
     }
     
     
    private static void RL()
     {
      Console.ReadLine(); 
     }
     
     
    private static void Break() 
     {
      System.Diagnostics.Debugger.Break();
     }

        
    private static void ChangeTheNumber(ref int number)
     {
      number
    =100;
     }
     
     
    private static void ChangeTheNumber(int x)
     {
      x
    =100;
     }
     
     
    private static void ChangeTheNumber(TestClass classInstance)
     {
      classInstance.Name
    ="change to another name";
     }
     
     
    private static void ChangeTheNumber(ref TestClass classInstance)
     {
      classInstance.Name
    ="change to another name";
     }
     
    #endregion
    }

    ///
    ///测试类
    ///
    public class TestClass
    {
     
    public TestClass(string name)
     {
      
    this.name=name;
     }
     
     
    private string name;
     
    public string Name
     {
      
    get
      {
       
    return name;
      }
      
    set
      {
       name
    =value;
      }
     }
    }

  • 相关阅读:
    C++ 解析CSV文件
    MFC/WTL 设置背景图和控件透明的方法
    VS2008安装x64版本所遇问题
    VS2012 安装番茄插件
    16年面试提问
    git 使用笔记
    03_运算符、键盘录入、流程控制
    02_java关键字、表识符、注释、进制转换、补码反码、数据类型转换
    01_计算机和java基础
    10 js一维数组、一维数组细节
  • 原文地址:https://www.cnblogs.com/csharponworking/p/1616625.html
Copyright © 2011-2022 走看看