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

推荐订阅源

V
Visual Studio Blog
Engineering at Meta
Engineering at Meta
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
博客园 - Franky
The GitHub Blog
The GitHub Blog
大猫的无限游戏
大猫的无限游戏
The Cloudflare Blog
B
Blog RSS Feed
云风的 BLOG
云风的 BLOG
小众软件
小众软件
罗磊的独立博客
Microsoft Azure Blog
Microsoft Azure Blog
I
InfoQ
美团技术团队
H
Hackread – Cybersecurity News, Data Breaches, AI and More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
C
Check Point Blog
WordPress大学
WordPress大学
博客园 - 【当耐特】
博客园 - 司徒正美
D
Docker

博客园 - 栖息的熊

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;
    }
}