`

C#函数传参的out与ref的应用

 
阅读更多

下面我总结下我对out和ref引用参数的看法: 
1.out和ref引用参数的相同点:都是通过引用传递参数给函数; 
2.out和ref引用参数的不同点是:用ref引用传递参数,该参数必须经过初始化,并且不能在调用它的函数中初始化,以下例子是错误的: 
             namespace refConsoleApp 
             { 
                 class MyRefClass 
                     { 
                                 static void MyRefMethod(ref int i) 
                                { 
                                         int i=20; 
                                } 
                                static void main(string[] args) 
                                { 
                                         int value;                  //not initialized the value; 
                                         MyRefMethod(ref value); 
                                         Console.WriteLine("The value is {0}",value);  
                                } 
                       } 
             } 
3.使用out引用多个参数来返回多个值,这允许方法任意地返回需要的值,以下例子: 
namespace multi_outConsoleApp 

    class MyMultipleoutClass 
    { 
        static void MyMultipleMethod(out int i, out string str1, out string str2) 
        { 
            i = 20; 
            str1 = "I was born"; 
            str2 = "zhaoqing";

        } 
        static void Main(string[] args) 
        { 
            int value; 
            string s1, s2; 
            MyMultipleMethod(out value,out  s1,out  s2); 
            Console.WriteLine("The integer value is {0} The first string value is {1} The second string value is {2}", value, s1, s2);

        } 
    } 
}

显示的结果为: 
The integer value is 20 
The first string value is I was born 
The second string value is zhaoqing 
4.  如果一个方法使用ref引用参数,另一个方法使用out引用参数,则这两个相同方法名的函数不能重载,否则出现编译错误,以下例子出现: " cannot define overloaded  methods that differ only on ref and out " 
namespace overloadofConsoleApp 

    class overloadofclass 
    { 
        static void MyMethod(ref int i) 
        { 
            i = 20; 
        } 
        static void MyMethod(out int i) 
        { 
          i = 40; 
        } 
        static void Main(string[] args) 
        { 
            int refvalue=0; 
            MyMethod(ref refvalue); 
            Console.WriteLine("The value is {0}", refvalue); 
            int outvalue; 
            MyMethod(out outvalue); 
           Console.WriteLine("The value is {0}", outvalue); 
        } 
    } 
}   
以下例子是正确的: 
namespace overloadofConsoleApp 

    class overloadofclass 
    { 
        static void MyMethod(ref int i) 
        { 
            i = 20; 
        } 
        static void MyMethod( int i) 
        { 
          i = 40; 
        } 
        static void Main(string[] args) 
        { 
            int refvalue=0; 
            MyMethod(ref refvalue); 
            Console.WriteLine("The value is {0}", refvalue); 
            int outvalue=0; 
            MyMethod(outvalue); 
           Console.WriteLine("The value is {0}", outvalue); 
        } 
    } 

显示结果为: 
The value is 20 
The value is 0 
         5.通过ref参数来改变引用类型,因为引用类型作为ref参数来传递,同时该对象会被改变.以下例子: 
namespace refConsoleApp 

    class refclass 
    { 
        static void RefMethod(ref string s) 
        { 
            s = "I was born in zhaoqing"; 
        } 
        static void Main(string[] args) 
        { 
            string str = "I am goalbell"; 
            RefMethod(ref str); 
            Console.WriteLine("The value is {0}", str); 
        } 
    } 

显示结果: 
The value is I was born in zhaoqing

           6.通过ref和out来传递数组,用ref传递数组的时候,必须在main函数里面初始化一个数组,而在被调用的方法中可以指定一个数组为空值或者初始 化成一个不同的数组;用out 传递数组的时候,在被调用的方法中确定为一个数组赋值.以下例子来区别一下它们: 
namespace refszConsoleApp 

    class refszclass 
    { 
        static void RefszMethod(ref int[] arr) 
        { 
            if (arr == null)        //assigned the null value 
            { 
                arr = new int[5];   //initialized to a different array 
            } 
        } 
        static void Main(string[] args) 
        { 
            int[] theArray ={ 1, 2, 3, 4, 5 };//initialize the theArray 
            RefszMethod(ref theArray); // pass the value using of ref 
            Console.WriteLine("Array elements are:"); 
            for (int i = 0; i < theArray.Length; i++) 
            { 
                Console.WriteLine(theArray[i] + ""); 
            } 
        } 
    } 

namespace outszConsoleApp 

    class outszclass 
    { 
        static void OutszMethod(out int[] arr) 
        {

            arr = new int[5] { 1, 2, 3, 4, 5 };//initialize the arr 
        } 
        static void Main(string[] args) 
        { 
            int[] theArray ; 
            OutszMethod(out theArray); 
            Console.WriteLine("Array elements are:"); 
            for (int i = 0; i < theArray.Length; i++) 
            { 
                Console.WriteLine(theArray[i] + ""); 
            } 
        } 
    } 
}

分享到:
评论

相关推荐

    C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用

    C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用

    C#事件传参

    在C#中,事件是基于委托(Delegate)的,委托可以视为指向方法的引用,类似于函数指针。事件是由发布者(Publisher)创建并触发的,而订阅者(Subscriber)通过添加事件处理程序(Event Handler)来响应这些事件。...

    C#函数式程序设计:经典编程技术在现代项目中的应用 code

    C#函数式编程源代码 Functional Programming in C#: Classic Programming Techniques for Modern Projects 由于清华大学没有提供下载 从国外出版商网站上http://www.wrox.com 原版下载后整理成一个压缩包 包含1~...

    C#_函数手册大全+c#公共函数

    本资源包含了"C#_函数手册大全+c#公共函数",旨在为开发者提供全面的C#函数参考资料。下面我们将详细探讨这两个文档可能涵盖的关键知识点。 一、C#函数基础 1. 函数定义:C#中的函数通过`void FunctionName(params)...

    c#函数库(比较常用)

    C#是一种面向对象的编程语言,由微软公司开发,用于构建Windows、Web和移动应用程序。在C#中,函数库是一系列预定义的函数集合,它们提供了标准操作,以简化编程任务。本C#函数库包含了常用且实用的函数,非常适合...

    C_中out和ref的区别

    下面将详细探讨`out`和`ref`在C#中的具体应用及其差异。 ### `out`关键字 `out`关键字用于指示方法的参数应该被视作输出参数,这意味着方法将负责给该参数赋值。在调用带有`out`参数的方法时,传递给它的变量可以...

    Javascript调用C#函数示例程序

    一个在HTML中使用Javascript的window.external调用C#内函数的示例程序。该方法可应用于网页程序开发中的网页-程序沟通,例如用C#的IHTMLWindow2.execScript替换HTML默认Javascript方法使其直接与C#传参、通讯。

    c#调用c++ dll 传参 string 崩溃的一种解决办法

    ### c#调用c++ dll 传参 string 崩溃的一种解决办法 在跨语言编程环境中,我们经常需要在不同编程语言之间进行交互。一个常见的场景是C#调用C++编写的动态链接库(DLL)。然而,在这种情况下可能会遇到一些问题,...

    FastReport 使用说明_动态传参总结(C#版)

    总的来说,理解和掌握FastReport的动态传参对于开发基于.NET平台的报表应用至关重要。通过灵活运用这一特性,你可以创建出更加智能、适应性强的报表解决方案。在深入学习和实践中,你可能会发现更多的应用场景,比如...

    C#动态调用DLL并对目标函数传递参数

    4. **创建委托(Delegate)**:由于C#是强类型语言,我们需要创建一个与目标函数签名匹配的委托类型,然后使用`Delegate.CreateDelegate`方法将其与`MethodInfo`关联。 ```csharp // 假设目标函数为无返回值,接受...

    C#中out与ref的区别实例解析

    本文实例讲述了C#中Out与Ref的区别,可以加深C#程序设计人员对Out和Ref用法的理解,具体分析如下: 一、区别分析: Out和Ref作为参数传递到方法体中,所传递的都是引用地址,两者在操作上本身没有区别。 但Out传递到...

    C# ref和out的区别

    ### C#中`ref`与`out`的关键区别 在C#编程语言中,方法的参数传递机制提供了多种方式来处理方法内部对外部变量的访问和修改。这其中包括了通过值(by value)和通过引用(by reference)两种基本模式。通过引用传递...

    C#函数实用手册

    本书涵盖了C#的核心类库,可以帮助程序员进行字符串处理、绘图、数学计算、数据库访问、网络应用等方面的工作,全面而系统地描述了使用C#语言编程常用的各种类库,主要包括类描述和接口描述。从类的层次结构示意图、...

    c# 调用C++编写 的DLL函数各种参数传递问题。

    在 C# 中,ref关键字将使得参数被传递给 C++ 函数,并且可以接收返回的值。 4. 传递结构体指针(C++ 填充) 在 C++ 中,函数原型为 BOOL NetGetConnectDetail(NET_INFO_STRUCT *lpNetInfo);,在 C# 中可以使用 ...

    C#调用DLL中非托管C++函数参数类型对照

    * 一维数组:C#参数在基本类型前加ref或out,out表示有返回数据。例如调用C++的f(float[] a),在C#中,为f(ref a)。 * 数据结构:C++中的struct SAMPLE_DATA { byte SampleID[255]; float Value[6]; } 在C#中对应...

    C++结构体/函数定义转换C#函数定义/结构体

    - C++的结构体成员排列可能与C#不同,需要考虑内存对齐问题。 - 在C#中,可能需要使用`[StructLayout(LayoutKind.Sequential)]`来指定布局,以匹配C++的结构体。 3. **函数定义转换**: - C++的函数指针在C#中...

    c#学习体会使用 ref 和 out 传递数组

    在C#语言中,`ref`和`out`是两个非常重要的关键字,它们主要用于处理函数参数的传递方式。通常情况下,在C#中调用方法时,参数是以值传递的方式进行的,也就是说,方法内的参数改变不会影响到方法外的原始变量。然而...

    详解C#中的out和ref

    要想充分理解C# out和ref,必须先明确如下两个概念(对值类型与引用类型掌握比较好的,可以跳过“一、明确两个基本概念”) 一、明确两个基本概念 值类型:  定义:通过值的方式来传递,即实际参数向形式参数传递...

    c#中ref和out用法

    在名为`refAndoutTest`的压缩包文件中,可能包含了一个或多个C#源代码文件,这些文件用于演示`ref`和`out`关键字的实际应用。通过查看和分析这些代码,你可以更深入地理解这两个关键字的工作原理和应用场景。在学习...

    C#函数手冊级代码解析

    1. **函数定义与调用**:C#函数由返回类型、函数名、参数列表和函数体组成。例如,一个简单的求和函数定义如下: ```csharp public int Sum(int a, int b) { return a + b; } ``` 调用这个函数可以这样: ```csharp...

Global site tag (gtag.js) - Google Analytics