改为
private static void gt(ref cls t,ref cls y)
private static void gt(ref cls t,ref cls y)
解决方案 »
- datetime 计算问题,急急急急!~~
- 50分求解:C#怎么实现类似js的replace(regex,function(){..arguments[i]..})
- Dictionary.OrderBy(Func) how to understand this usage.
- 窗体重绘占用CPU过高,如何解决
- 我用wmi的Win32_NetworkAdapter,为什么会得到三个不同的网卡物理地址,而用ipconfig/all在dos窗口中只得到一个网卡物理地址,这是怎么回事?
- 如何把sql读出来的二进制信息(图片)另外保存?
- 一个关于session的问题??
- 求救:连接数据库问题!!!
- 一个C#与Oracle连接的程序
- VS编译环境中的脚本<SCRIPT language="..." >中那么多到底是指什么?
- vs.net安装中的奇怪问题,请各位大虾指点
- 请救急!
private static void gt(ref cls t,ref cls y)
想要知道为什么private static void gt(cls t,cls y)会出现这种情况?
我记得我说是在静态存储区里面,就是static可是你没给分我
之所以要ref是因为static只能对值类型操作
而要对引用类型就只能用他的引用即:用引用引用他在堆里的地址!
我不知道我说的清不清楚,你可看看有关引用方面的资料!
{
static void Main()
{
test b=new test(); cls s = new cls("class-s"),c = new cls("class-c");
// 为什么能修改类s.p属性,却不修改类c?
b.gt( s, c);
System.Console.WriteLine("s.x = {0},c.x ={1}",s.x,c.x); }
// 为什么能修改类s.p属性,却不修改类c?
private void gt( cls t, cls y)
{
t.p=new cls("class-t.p");
y = t.p;
}
class cls
{
public string x;
public cls p; public cls(string s)
{
x=s;
}
}
}}
---------------------------------------------
class test
{
static void Main()
{
test b=new test();
string s="hijklmno"; // 为什么能修改类s.p属性,却不修改类c?
b.gt( s);
System.Console.WriteLine(s); }
// 为什么能修改类s.p属性,却不修改类c?
private void gt( string temp)
{
temp="abcdefg";
}
}
}
C#中的参数是按值传递的。也就是它传递的是一个考贝。。所以不能修改。
假如加上关健字ref 或是out的话它就是以引用传递了
和静态还是非静态好像没什么关系。
你的另外一个贴子我也试过了。应该就是这样的。不是因为你的参数是引用就可以修改它的值。关健的是要看它加没加ref,out关健字!
class test
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
public int x;
}
struct stuct
{
public int y;
}
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
Class1 a=new Class1();
a.x=10;
Console.WriteLine(a.x);//输出10
Class1 c=a;//引用类型赋值将复制到一个对像的引用
c.x=100;
Console.WriteLine(a.x);//输入100
stuct b=new stuct();
b.y=20;
Console.WriteLine(b.y);//输出20
stuct d=b;//值类型赋值将复制一个对像的值
d.y=200;
Console.WriteLine(b.y);//输入20
}
}
引类型赋值将复制到一个对像的引用,值类型赋值将复制一个对像的值,C#中的参数是按值传递的,关健字ref 或是out的话它就是以引用传递。
(这些话是C#精髓里面说的)
静态还是非静态函数没有关系吧,我试过了,结果也一样!to snewxf(心疤):
你也差不多理解我的想法了,我要问的问题是:在不加ref的前提下为什么可以修改类的属性,但就不能修改它自己的引用(指定另一个类)?争论就是这里:"类是引用类型,结构是值类型".
既然类是引用类型,gt(cls y)可以说明:
public void gt(cls y)
{y.x = "方法gt修改了y.x的值";} 但gt(cls t,cls y)为什么能修改类属性,却不修改类的指向:
private void gt(cls t,cls y)
{t.p=new cls("class-t.p");
y = t.p;}用语句gt(s,c);调用后,类c没有被修改.
所以要问一下,类为参数时是以什么来传递参数的?
它传递的它本身的一个考贝吧!而不是它本身的引用。(虽然它本身是一个引用)
就像INT类型一样。它传递的是一个值过去。
当然这个考贝的内容到底是什么我也说不清楚!呵呵!
class test
{
static void Main()
{
test b=new test(); cls s = new cls("class-s"),c = new cls("class-c");
// 为什么能修改类s.p属性,却不修改类c?
b.gt( s, c);
System.Console.WriteLine("s.x = {0},c.x ={1}",s.x,c.x); }
// 为什么能修改类s.p属性,却不修改类c?
private void gt( cls t, cls y)
{
t.p=new cls("class-t.p");
y=t.p;
Console.WriteLine(y.x);//这加了一句**结果就不同了。 }
class cls
{
public string x;
public cls p; public cls(string s)
{
x=s;
}
}
}
这样好像很明白了吧!y=t.p;也就是Y以被修改了。
--------------------------------------------------
class Class1
{
public int x;
public Class1()
{
x=10;
}
public static void gt(Class1 y)
{
y.x=1000000;
} /// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
Class1 c= new Class1();
Console.WriteLine(c.x);
Class1 d=c;//当然这句注释掉。传C过去也是一样的。
gt(d);
Console.WriteLine(c.x);
}
}
这个例子说白了它引用的是同一个对像呀!因为D=C赋值的是C的引用呀!
唉!你自已多看看这几个例题就应该能理解了。呵呵!我也不知道如何才能说清楚。
可能表达能力太差吧!