咨询热线:0731-88808590
切换到宽版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11231|回复: 3

如何C#参数传地址?

[复制链接]
发表于 2012-11-27 10:15:21 | 显示全部楼层 |阅读模式
在 2012-11-25 14:30:51,"臭鸡蛋" <439113299@qq.com> 写道:

    你好~
    请问一下我想在已知壳侧定性温度的情况下,计算饱和蒸汽的密度、动力粘度、比热,还有饱和水的密度、动力粘度、导热系数,还有热阻,能发给我一个计算方法么?
    我用C#做的程序,尝试过调用这个程序的dll文件,但是C#不支持参数的地址传递,所以想要一下计算方法。如果方便的话能不能发送给我一下,谢谢了

回复:
请C#爱好者积极参与解决此问题。谢谢。
回复

使用道具 举报

 楼主| 发表于 2012-11-27 15:22:19 | 显示全部楼层
你好:
我没用过C#,不知道怎么解决。期待高手解答。下面给出一篇资料仅供参考。


C#参数传递
http://blog.csdn.net/gaosiling865812/article/details/7564568

细分起来,在C#中参数传递应该是算有四种情况的。参数传递方式有按值传递和按引用传递两种,而C#支持的类型呢,也分为两种:值类型和引用类型。所以排列组合一下,就有四种情况了:值类型按值传递、引用类型按值传递、值类型按引用传递和引用类型按引用传递。

  1. 值类型按值传递

值类型变量是直接包含其数据,而引用类型包含的是对数据的引用(即数据的地址)。因此对于值类型变量按值传递时,传递的是变量的一个副本。方法内发生的对参数的更改对原变量中存储的原数据无任何影响,只会影响到变量的副本。

我们用段示例代码来解释。


值类型按值传递

static void Main(string[] args)

         {

             var number = 14;



             Console.WriteLine(

                 string.Format("Inside main method.before calling [ChangeValueByValue] method, value is {0}",

                               number.ToString()));

             ChangeValueByValue(number);

             Console.WriteLine(string.Format(

                 "Inside main method.after calling [ChangeValueByValue] method, value is {0}", number.ToString()));

             Console.ReadLine();

         }



         static void ChangeValueByValue(int number)

         {

             number = 23;

         }



•number变量赋值为14.
•执行方法ChangeValueByValue时,传递number变量的副本给方法,假设变量copynumber为该副本,则其初始值和number一样,也为14。
•方法内修改number的值为23,其实是修改number的副本,所以copynumber的值被修改为23。而number的值保持14不变。
执行结果如下:



  2. 值类型按引用传递

值类型按引用传递向方法传递的是变量的地址,因此在方法内对变量的任何改变都会影响到原数据。必须使用ref或out关键字来传递变量。下面的示例使用ref来说明。


static void Main(string[] args)

         {

             var number = 14;



             Console.WriteLine(string.Format("Inside main method.before calling [ChangeValueByRef] method, value is {0}", number.ToString()));

             ChangeValueByRef(ref number);

             Console.WriteLine(string.Format("Inside main method.after calling [ChangeValueByRef] method, value is {0}", number.ToString()));

             Console.ReadLine();

         }



         static void ChangeValueByRef(ref int number)

         {

             number = 234;

         }



•number变量赋值为14
•执行方法ChangeValueByRef时,传递变量number的地址(59997)到方法内,假设为copynumberaddress存放的是number变量的地址14,其实个人觉得这里应该是number变量地址的副本传递给了方法
•方法内修改number值为234,也即对地址59997存放的数据进行修改为234。所以number的值也会变成234
执行结果如下:



  3. 引用类型按值传递

引用类型按值传递和值类型按引用传递在某种程度上具有相同的行为。引用类型按值传递是向方法内传递变量地址的副本,因此对该变量的数据的修改会直接影响到原数据(注意是对数据的修改,其他修改是不会影响到原数据的,比如你在方法内,将对象指向一个同类型的新对象,是不会影响到原数据的,因为你只是将变量地址的副本改成了新对象的地址。原数据还是指向旧的地址)。请看下面简单示例说明:


static void Main(string[] args)

         {

             int[] array = { 54, 691, 1234 };

             Console.WriteLine(string.Format("Inside main method.before calling [ChangeRefByValue] method, value is {0}", array[0].ToString()));

             ChangeRefByValue(array);

             Console.WriteLine(string.Format("Inside main method.after calling [ChangeRefByValue] method, value is {0}", array[0].ToString()));



             Console.ReadLine();

         }



         static void ChangeRefByValue(int[] array)

         {

             array[0] = 98;

             array = new int[5] { -2, -34, -12, -43, -392 };

             Console.WriteLine(string.Format("Inside method [ChangeRefByValue],the first element is {0}", array[0]));

         }



•创建一个新数组array,其第0个元素值为54
•执行方法ChangeRefByValue,传递变量array地址(2000)的副本到方法内,假设copyarrayaddress存放了array地址副本
•在方法ChangeRefByValue内,首先将array第0个元素值改为98,因为指向同样的地址单元,因此会影响到原来数组array第0个元素的值
•然后执行


array = new int[5] { -2, -34, -12, -43, -392 };语句,其实是将array地址的副本copyarrayaddress指向了新数组的地址(1980),而array变量还是指向的之前的地址(2000)

执行结果如下:





  4. 引用类型按引用传递

引用类型按引用传递是向方法内传递变量地址(注意这里不是地址副本),因此对变量的任何改变都会影响到原变量(不管是数据的改变,还是指向新的对象)。请看下面示例:


static void Main(string[] args)

         {

             int[] array = { 98, 691, 1234 };



             Console.WriteLine(string.Format("Inside main method.before calling [ChangeRefByRef] method, value is {0}", array[0].ToString()));

             ChangeRefByRef(ref array);

             Console.WriteLine(string.Format("Inside main method.after calling [ChangeRefByRef] method, value is {0}", array[0].ToString()));



             Console.ReadLine();

         }



         static void ChangeRefByRef(ref int[] array)

         {

             array[0] = 35;

             array = new int[5] { -2, -34, -12, -43, -392 };

             Console.WriteLine(string.Format("Inside method [ChangeRefByValue],the first element is {0}", array[0]));

         }



•创建一个新数组array,其第0个元素值为98
•指向方法ChangeRefByRef,传递变量array的地址(2000)到方法内
•在方法ChangeRefByRef内,首先将array第0个元素值改为35,因为指向同样的地址单元,因此会影响到原来数组array第0个元素的值
•然后执行
array = new int[5] { -2, -34, -12, -43, -392 };语句,将array指向新的数组newarray,其数组的地址也变成了新数组的地址(1980)。因此在执行方法后,array数组和newarray是相等的。

执行结果如下:


回复 支持 反对

使用道具 举报

发表于 2012-12-2 10:19:15 | 显示全部楼层
       支持地址传递的,这是我以前做的,加ref
        [DllImport("uewasp.DLL")]
        public static extern void P2T(double p, ref double t, ref long a);
        [DllImport("uewasp.DLL")]
        public static extern void P2HL(double p, ref double hl, ref long a);
        [DllImport("uewasp.DLL")]
        public static extern void P2HG(double p, ref double hg, ref long a);
        [DllImport("uewasp.DLL")]
        public static extern void T2P(double t, ref double p, ref long a);
        [DllImport("uewasp.DLL")]
        public static extern void T2HL(double t, ref double hl, ref long a);
        [DllImport("uewasp.DLL")]
        public static extern void T2HG(double t, ref double hg, ref long a);
        [DllImport("uewasp.DLL")]
        public static extern void PT2H(double p, double t, ref double h, ref long a);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-7 17:14:41 | 显示全部楼层
谢谢radish163解答。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们

长沙优易软件开发有限公司(中文简称:优易软件,英文简称:UESOFT)是三维管道CAD/CAE一体化设计软件开发商,也是新一代三维工厂设计管理系统的开创者。公司开发的自主知识产权的管道应力分析软件AutoPSA居于中国大陆市场前2名。UESOFT于2000年10月23日经湖南省长沙市工商行政管理局核准登记设立。

联系我们

  • 地址: 中国湖南省长沙市高新区桐梓坡西路保利麓谷林语中心i区1栋718-725
  • 电话: 0731-88808590
  • Email: uesoft@163.com
© 2001-2021  Powered by Discuz! X3.4 永益科技
快速回复 返回顶部 返回列表