惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
A
About on SuperTechFans
量子位
B
Blog RSS Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园_首页
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
Microsoft Azure Blog
Microsoft Azure Blog
V
V2EX
Google DeepMind News
Google DeepMind News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
G
Google Developers Blog
U
Unit 42
D
DataBreaches.Net
博客园 - Franky
D
Docker
宝玉的分享
宝玉的分享
Y
Y Combinator Blog
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Hugging Face - Blog
Hugging Face - Blog

博客园 - 栖息的熊

Mark一些关于线程同步的信息 【转载】安卓巴士Android开发神贴整理 关于Join 异常诡异的mysql连接异常:Fatal error encountered during command execution. 误人子弟的面试题答案 .Net中的安全机制 用定制特性规范构件调用 用重载操作符实现用户数据类型的转换 override和new关键词的差别 windows用户配置文件的复制 求职:本人从事3年工作流引擎开发,熟悉XPDL,.net3.5中WF,Biztalk,开源工作流引擎OBE,期望工作地点上海 对Activity副本的再理解 Windows Workflow Foundation中实现人工活动的demo,按照XPDL规范的实现 WF消息队列的使用 查数据库死锁的实际例子 喜欢使用VMware的.net程序员要注意呀(Visual Studio启动不了的问题) 编译器错误信息: CS1595: 已在多处定义“ ”;一种可能出现的情况 BPM业务场景分析(1)——内部交易合并开票 高级工作流模式深入业务场景分析(1)——多路合并
你必须知道的值传递和引用传递
栖息的熊 · 2008-10-02 · via 博客园 - 栖息的熊

C#中默认使用的是值传递,加ref关键词则标记为引用传递。两者的差别是值传递是传递标识符所代表的变量的副本,而引用传递是传递的本身。以此概念来推敲值类型和引用类型在两种不同传递方式下的区别,这可能是很多人都忽视的,下面的例子表达了这些区别。
using System;

namespace TestMethodParams
{
    /// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class Class1
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //
            // TODO: 在此处添加代码以启动应用程序
            //

            int i = 0;
            //值类型的值传递
            ValueTypeTransByVale(i);
            Console.WriteLine("值类型的值传递:");
            Console.WriteLine(i);

            //值类型的引用传递
            ValueTypeTransByRef(ref i);
            Console.WriteLine("值类型的引用传递:");
            Console.WriteLine(i);

            MyClass m = new MyClass();
            //引用类型的值传递1
            m.X = 0;
            RefTypeTransByValue1(m);
            Console.WriteLine("引用类型的值传递1:");
            Console.WriteLine(m.X);

            //引用类型的值传递2
            m.X = 0;
            RefTypeTransByValue2(m);
            Console.WriteLine("引用类型的值传递2:");
            Console.WriteLine(m.X);

            //引用类型的引用传递1
            m.X = 0;
            RefTypeTransByRef1(ref m);
            Console.WriteLine("引用类型的引用传递1:");
            Console.WriteLine(m.X);

            //引用类型的引用传递2
            m.X = 0;
            RefTypeTransByRef2(ref m);
            Console.WriteLine("引用类型的引用传递2:");
            Console.WriteLine(m.X);

            Console.Read();
        }

        static void ValueTypeTransByVale(int i)
        {
            i = 100;
        }

        static void ValueTypeTransByRef(ref int i)
        {
            i = 100;
        }

        static void RefTypeTransByValue1(MyClass m)
        {
            m.X = 100;
        }

        static void RefTypeTransByValue2(MyClass m)
        {
            m = new MyClass();
            m.X = 100;
        }

        static void RefTypeTransByRef1(ref MyClass m)
        {
            m.X = 100;
        }

        static void RefTypeTransByRef2(ref MyClass m)
        {
            m = new MyClass();
            m.X = 100;
        }
    }

    public class MyClass
    {
        public int X;
    }
}