C#中按结构和封装传递参数的问题,谢谢!

flashmagic 2005-01-28 07:48:25
using System;

namespace ConsoleApplication9
{
class Class1
{
/*
static private int x,y,z;
static void Main(string[] args)
{
x=10;
y=20;
z=30;
Console.WriteLine(x+" "+y+" "+z);
changeVal(x,y,z);
Console.WriteLine(x+" "+y+" "+z);
}
参数在传递时是用的值传递。string是按引用吧?
static public void changeVal(int t1,int t2,int t3)
{
t1+=1;
t2+=1;
t3+=1;
Console.WriteLine("The function of changeVal: "+t1+" "+t2+" "+t3);
}
*/
/*
public struct values
{
public int x,y,z;
}
static void Main(string[] args)
{
values val=new values();
val.x=10;
val.y=20;
val.z=30;
Console.WriteLine(val.x+" "+val.y+" "+val.z);
changeVal(val);
Console.WriteLine(val.x+" "+val.y+" "+val.z);
}
//在传递结构的时候为什么不使用引用?我记得默认传递结构是按引用阿?
public static void changeVal(values t1)
{
t1.x+=1;
t1.y+=1;
t1.z+=1;
Console.WriteLine("The function of changeVal: "+t1.x+" "+t1.y+" "+t1.z);
}
*/

private static int t;
static void Main(string[] args)
{
t=11;
Console.WriteLine(t);
object temp=(object)t;
Console.WriteLine(t);
changeVal(temp);
Console.WriteLine(t);

}
//通过转换为object进行封箱来传递参数。这样为什么不是按引用传递?
public static void changeVal(object t1)
{
int k=(int)t1;
k+=1;
Console.WriteLine(k);
}
}
}
//某些地方是不是我理解错了?请指点。谢谢!:)
...全文
97 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
flashmagic 2005-01-28
  • 打赏
  • 举报
回复
谢!
机器人 2005-01-28
  • 打赏
  • 举报
回复
.Net框架支持的所有数据类型——本机数据类型和自定义的数据类型——都可以分为
引用类型(reference type)和值类型(value type)两个大类。简而言之,
引用类型的行为类似于对象,而值类型的行为类似于标量类型(Integer和Single)。
在.NET 框架中,一切都是对象,而大部分数据类型是引用类型。在声明一个引用类型
的变量时,会为一个指向实际对象的指针变量(一个在当前Windows平台上的32位整型值)
分配内存。对象本身存储在一个叫做托管堆(managed heap)的内存区域中,并处于
.NET框架运行库的管理之下;而指针变量可以保存在其他位置(例如,如果指针变量是
一个过程内部声明的动态变量,则该指针变量保存在堆栈中)。

所有的.NET数字类型都是值类型,枚举和结构体也是值类型。.NET字符串和数组、类是
引用类型。

在将一个值类型(如整型)赋给一个Object变量时,将发生一个最简单的装箱操作:
(1)在堆中分配出一块内存;
(2)在该内存块中原整型值被复制;
*************
(3)该内存的地址被赋给Object变量。
对一个值进行装箱是指编译器在托管堆中创建一份该值得副本,并将副本的地址赋予Object
类型的变量或参数,这样就可以将值类型用作引用类型。装箱值并不保留与原始值的链接,
所以可以修改这两值之一,而不会影响另一个值。
................
RunnaRen 2005-01-28
  • 打赏
  • 举报
回复
谁告诉你object是按引用传递?如果想这样做的话,把public static void changeVal(ref object t1),在调用方法的时候也要声明为changeVal(ref temp)这样。

不过你程序有点乱,自己再好好看看书吧
flashmagic 2005-01-28
  • 打赏
  • 举报
回复
嗯,结构真实的按值传递。。。
值类型
所有简单的预定义类型
所有结构
所有枚举

引用类型
object
string
所有的类

可object是按引用阿。。为啥也不对?

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧