- 浏览: 2162764 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1878)
- [网站分类]ASP.NET (141)
- [网站分类]C# (80)
- [随笔分类]NET知识库 (80)
- [随笔分类]摘抄文字[非技术] (3)
- [随笔分类]养生保健 (4)
- [网站分类]读书区 (16)
- [随笔分类]赚钱 (7)
- [网站分类].NET新手区 (233)
- [随笔分类]网站 (75)
- [网站分类]企业信息化其他 (4)
- [网站分类]首页候选区 (34)
- [网站分类]转载区 (12)
- [网站分类]SQL Server (16)
- [网站分类]程序人生 (7)
- [网站分类]WinForm (2)
- [随笔分类]错误集 (12)
- [网站分类]JavaScript (3)
- [随笔分类]小说九鼎记 (69)
- [随笔分类]技术文章 (15)
- [网站分类]求职面试 (3)
- [网站分类]其他技术区 (6)
- [网站分类]非技术区 (10)
- [发布至博客园首页] (5)
- [网站分类]jQuery (6)
- [网站分类].NET精华区 (6)
- [网站分类]Html/Css (10)
- [随笔分类]加速及SEO (10)
- [网站分类]Google开发 (4)
- [随笔分类]旅游备注 (2)
- [网站分类]架构设计 (3)
- [网站分类]Linux (23)
- [随笔分类]重要注册 (3)
- [随笔分类]Linux+PHP (10)
- [网站分类]PHP (11)
- [网站分类]VS2010 (2)
- [网站分类]CLR (1)
- [网站分类]C++ (1)
- [网站分类]ASP.NET MVC (2)
- [网站分类]项目与团队管理 (1)
- [随笔分类]个人总结 (1)
- [随笔分类]问题集 (3)
- [网站分类]代码与软件发布 (1)
- [网站分类]Android开发 (1)
- [网站分类]MySQL (1)
- [网站分类]开源研究 (6)
- ddd (0)
- 好久没写blog了 (0)
- sqlserver (2)
最新评论
-
JamesLiuX:
博主,能组个队么,我是Freelancer新手。
Freelancer.com(原GAF – GetAFreelancer)帐户里的钱如何取出? -
yw10260609:
我认为在混淆前,最好把相关代码备份一下比较好,不然项目完成后, ...
DotFuscator 小记 -
日月葬花魂:
大哥 能 加我个QQ 交流一下嘛 ?51264722 我Q ...
web应用程序和Web网站区别 -
iaimg:
我想问下嵌入delphi写的程序总是出现窗体后面感觉有个主窗体 ...
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部 -
iaimg:
代码地址下不了啊!
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部
class Program { static void Main(string[] args) { TestClass objA = new TestClass(); objA.Name = "I am ObjA"; Console.WriteLine(String.Format("In Main:{0}", objA.Name)); TestFun(objA); Console.WriteLine(String.Format("In Main:{0}", objA.Name)); Console.Read(); } static void TestFun(TestClass obj) { obj.Name = "I am be modified in TestFun"; Console.WriteLine(String.Format("In TestFun:{0}", obj.Name)); } public class TestClass { public string Name { get; set; } } }
将对象objA作为参数传递给函数TestFun,这时传递的是对象objA的引用,所以在函数内对objA的修改会直接应用到这个对象本身。在函数TestFun内修改了形参obj的Name属性,所以在Main中再调用objA.Name时这个属性值就变为在TestFun中修改后的值了。这一点很好理解,运行结果也就是:
如果我们换一种写法:
class Program { static void Main(string[] args) { TestClass objA = new TestClass(); objA.Name = "I am ObjA"; Console.WriteLine(String.Format("In Main:{0}", objA.Name)); TestFun(objA); Console.WriteLine(String.Format("In Main:{0}", objA.Name)); Console.Read(); } static void TestFun(TestClass obj) { TestClass objB = new TestClass(); obj = objB; obj.Name = "I am ObjB"; Console.WriteLine(String.Format("In TestFun:{0}", obj.Name)); } public class TestClass { public string Name { get; set; } } }
那结果又将如何呢? 在TestFun中新创建了一个对象objB,接着将obj指向新创建的对象objB并对其的Name属性赋值,所以在TestFun函数体里Console.WriteLine的时候obj.Name应该是“I am ObjB”。那在Main里调用了TestFun(objA)后objA指向的对象到底做了改变没有,它仍旧指向原来的对象还是已经指向了在TestFun里创建的objB呢?
我的猜测是这样的,将objA传递给TestFun传递的实际是objA的地址,在调用TestFun之前的对应关系是:
objA是个变量,他本身的地址是000001,它存放的是objA对象的地址00E001。当调用函数TestFun(objA)时,由于要将objA作为参数传递给TestFun,所以在
栈中就复制一个objA地址的副本,这个副本的地址为000003,他存放的仍旧是objA对象的地址00E001,如图:
所以在TestFun函数中,一开始obj指向的还是objA对象。当在TestFun中创建了一个对象objB后,内存模型变为:
TestFun中执行“obj=objB”后,obj指向objB对象,如下图:
所以执行完TestFun函数后,Main函数中objA仍旧指向原来的objA对象,故运行结果如下:
注:本文中的内存模型仅是个人猜测,肯定有不正确或者不严谨的地方,希望不要误导大家,也欢迎指正。
发表评论
-
where T:new() 是什么意思
2014-04-18 09:26 1450where T:new() 是什么意思 经常看到方法后面 ... -
好久没写blog了
2012-05-21 18:43 2好久没写blog了 -
test
2011-03-19 09:48 815testddddddddddd -
QQ自动发日志分析
2011-03-10 18:15 1261首先列举比较重要的问 ... -
test
2011-02-23 18:03 803test -
test
2011-02-23 17:53 873test -
为啥cnblogs的数据不能导了
2011-02-23 11:03 908为啥cnblogs的数据不能导了内容 -
如何保护.net中的dll文件(防破解、反编译)
2010-07-30 00:28 1486.net是一种建立在虚拟机上执行的语言,它直接生成 MSIL ... -
提搞网站访问速度可做哪些优化
2010-08-08 15:30 1116一、 服务器优化 ... -
ASP.NET(c#)如何判断浏览器是否支持cookies
2010-07-29 09:33 1711实例代码: 下面是写cookie ... -
N点虚拟主机管理系统(For Windows2003/2008)功能及介绍
2010-04-09 11:23 2258N点虚拟主机管理系统是 ... -
使用c#+(datagrid控件)编辑xml文件
2010-04-06 09:13 1163对xml文件的记录进行删除,修改,或增加新记录。 利用了d ... -
HTTP代理模块(HTTP Proxy)
2010-04-04 10:19 3045HTTP代理模块(HTTP Proxy ... -
Error 80040154 retreiving COM Class factory
2010-03-29 09:23 22481.ask: Greetings, I have ... -
petshop4.0 详解之二(数据访问层之数据库访问设计)
2010-03-27 11:08 1066在系列一中,我从整体上分析了PetShop的架构设计,并提及了 ... -
分享十五个最佳jQuery幻灯插件和教程
2010-03-25 09:17 2005<p>在网站前端中使用jQuery库已经变得越来越 ... -
20个软件开发常用设计文档大全下载
2009-08-27 10:22 965搜集了一些软件开发的常用文档,分享给大家 总下载地址: h ... -
asp.net 在线 mp3,wma, avi
2009-09-04 13:58 9291.前台js<script type="tex ... -
sql db link string
2009-09-06 21:52 978SQL Server ODBC Standar ... -
ASP.Net2.0小技巧 保持滚动条的位置 焦点移动到某个控件 $符号轻松的使用FindControl
2009-09-11 11:05 1293您可能不知道的ASP.Net2.0 ...
相关推荐
C# 调用 C++ 编写的 DLL 函数各种参数传递问题 在 C# 调用 C++ 编写的 DLL 函数时,参数传递是一个非常重要的部分。这篇文章将详细介绍 C# 调用 C++ 编写的 DLL 函数各种参数传递问题,包括不返回值的参数、带...
6. **传递参数**:动态调用时,`DynamicInvoke`方法接收一个对象数组作为参数,数组中的元素顺序应与目标函数的参数顺序一致。如果目标函数有返回值,`DynamicInvoke`会返回该值。 注意,如果DLL函数使用了非托管...
C#与MATLAB之间传递参数 C#和MATLAB是两个不同的编程语言,C#是微软公司开发的面向对象的高级编程语言,而MATLAB是MATLAB公司开发的高性能数值计算语言。两者之间的数据传递是非常重要的,因为在实际应用中,我们...
在获取参数值时,你需要将实际的参数传递给`Invoke`,这在大多数情况下可能无法实现,因为我们通常没有调用函数的实际上下文。在不修改调用代码的情况下,获取参数值的常规方法在C#中并不直接支持,除非你使用AOP...
3. **参数传递的意义**:向基类构造函数传递参数使得我们可以根据派生类实例化时的具体条件来设置基类的状态。这有助于保持代码的灵活性和可扩展性,因为基类的行为可以根据派生类的特性进行调整。 4. **封装和抽象...
在C#编程语言中,参数传递和参数调用是核心概念,它们关乎着函数和方法如何接收和处理数据。理解这些概念对于编写高效且可维护的代码至关重要。本篇文章将深入探讨C#中的参数传递机制及其应用。 首先,我们要了解...
在C#编程中,控制台程序之间的参数传递是一项常见的任务,尤其在系统集成或脚本自动化等场景下。本文将详细讲解如何从一个控制台应用程序(源程序)启动另一个控制台应用程序(目标程序),并传递参数字符串,以及...
【C#函数编程详解】 函数式编程是一种编程范式,它强调使用函数作为核心构建块,将计算视为函数的组合,而不是状态的变化或指令的序列。近年来,由于其简洁、可读性强和易于并行处理的特点,函数式编程在IT行业中...
当引用类型作为参数传递时,实际上是传递了引用的副本,但由于引用类型的特性,这仍然允许在函数内修改原始对象。 3. **按输出传递(Pass by Output)**:使用`out`关键字,可以用于任何类型。这种传递方式要求在...
本资源包含了"C#_函数手册大全+c#公共函数",旨在为开发者提供全面的C#函数参考资料。下面我们将详细探讨这两个文档可能涵盖的关键知识点。 一、C#函数基础 1. 函数定义:C#中的函数通过`void FunctionName(params)...
### 一、字符串参数传递 C#调用C++ DLL函数时,最常见的一种情况是处理字符串参数。例如,考虑以下C++函数: ```cpp bool SendNewSms(char* szTel, char* szMessage); ``` 对应的C#调用如下: ```csharp ...
在C#编程中,有时我们需要创建可执行文件(EXE)并传递参数,或者从一个应用程序调用另一个带有参数的EXE。以下是如何在C#中实现这些功能的详细步骤。 首先,我们来讨论如何创建一个带启动参数的EXE文件: 1. 定义...
函数使用说明通常包括函数的定义、参数、返回值、使用示例以及可能遇到的问题和解决方案。以下是对C#函数的一些详细说明: 1. **函数定义**: 在C#中,函数定义以`public`、`private`等访问修饰符开始,接着是返回...
"C#函数手册级代码解析"是一个深入理解C#函数和代码实现的重要资源,它旨在帮助开发者更高效地理解和运用C#语言中的函数和代码结构。 C#中的函数是可重用的代码块,它们执行特定的任务,并可能接收参数以定制其行为...
在C#语言中,函数或方法的参数传递方式是一个重要的概念。本文将深入解析C#中涉及的几种关键参数传递机制:值类型的基本传递、`ref`关键字以及`out`关键字,并通过具体示例来说明这些传递方式的区别及应用场景。 ##...
总的来说,C#中的对象参数传递特性对于理解和调试代码非常重要。理解这种行为可以帮助我们避免意外地修改了原本不想修改的对象,同时也能有效地利用引用传递来共享和修改数据。在编写函数时,要清楚地知道参数是值...
在C#编程中,回调函数是一种非常重要的设计模式,它允许我们将一个方法的引用作为参数传递给另一个方法,这样在特定条件下,被传递的方法可以被调用执行。在这个场景中,我们讨论的是如何在C#中传递回调函数给ATL...
在C#编程语言中,参数传递是一个至关重要的概念,它涉及到函数调用时,实参(函数调用时提供的值)如何与形参(函数定义中的变量)交互。C#支持两种基本的参数传递方式:值传递和引用传递。下面我们将深入探讨这两种...
回调函数通常用于异步编程,事件处理或者作为参数传递,使得代码更加灵活和可扩展。接下来,我们将深入探讨C#中实现回调函数的原理、方式以及应用场景。 首先,我们需要理解什么是回调函数。回调函数本质上就是一个...
// 子类构造函数,调用基类构造函数并传递参数 public DerivedClass(string commonValue, string derivedValue) : base(commonValue) // 调用基类构造函数 { DerivedProperty = derivedValue; } } ``` 在这个...