zoukankan      html  css  js  c++  java
  • C#: 引用变量与数值变量

    在C#中主要存在两大类型的数据:引用类型(class)和值类型(struct)。本文探讨一下C#中引用变量和数值变量的区别。

    1. 值参数

    当利用值向方法传递参数时,编译程序给实参的值做一份拷贝,并且将此拷贝传递给该方法。被调用的方法不传经修改内存中实参的值,所以使用值参数时,可以保证实际值是安全的。在调用方法时,如果形式化参数的类型是值参数的话,调用的实参的值必须保证是正确的值表达式。在下面的例子中,程序员并没有实现他希望交换值的目的:

    using System;
    class Test
    {
    static void Swap(int x,int y){
    int temp=x;
    x=y;
    y=temp;
    }
    static void Main(){
    int i=1,j=2;
    Swap(i,j);
    Console.WriteLine("i={0},j={1}",i,j);
    }
    }

    编译上述代码,程序将输出:

    i=1,j=2

    2. 引用型参数

    和值参不同的是,引用型参数并不开辟新的内存区域。当利用引用型参数向方法传递形参时,编译程序将把实际值在内存中的地址传递给方法。

    在方法中,引用型参数通常已经初始化。再看下面的例子。

    using System;
    class Test
    {
    static void Swap(ref int x,ref int y){
    int temp=x;
    x=y;
    y=temp;
    }
    static void Main(){
    int i=1,j=2;
    Swap(ref i,ref j);
    Console.WriteLine("i={0},j={1}",i,j);
    }
    }

    编译上述代码,程序将输出:

    i=2,j=1

    Main函数中调用了Swap函数,x代表i,y代表j。这样,调用成功地实现了i和j的值交换。

    在方法中使用引用型参数,会经常可能导致多个变量名指向同一处内存地址。见示例:

    class A
    {
    string s;
    void F(ref string a,ref string b){
    s="One";
    a="Two";
    b="Three";
    }
    void G(){
    F(ref s,ref s);
    }
    }

    在方法G对F的调用过程中,s的引用被同时传递给了a和b。此时,s,a,b同时指向了同一块内存区域。

  • 相关阅读:
    2019.7.28刷题统计
    2019.7.27刷题统计
    2019.7.26刷题统计
    2019.7.22刷题统计
    qdoj.xyz 6.18
    qdoj.xyz 6.17
    qdoj.xyz 6.16
    qdoj.xyz 6.15
    qdoj.xyz 6.14
    qdoj.xyz 6.13
  • 原文地址:https://www.cnblogs.com/xpvincent/p/2944100.html
Copyright © 2011-2022 走看看