在下基础不牢,还望诸位多多海涵,不吝赐教. public class ClassA { public string _strValue = "defaultValue"; } void RefTest(ClassA param) { param._strValue = "Changed"; } ClassA srcClass = new ClassA(); print("Before function called : " + srcClass._strValue); RefTest(srcClass); print("After function called: " + srcClass._strValue);这段代码输出结果为: Before function called : defaultValue After function called: Changed将类作为参数,结果类的成员变量的值被改变了.这不是说明参数是按引用类型传递的吗? 还是说参数是按值传递的,但复制的是该变量的地址,而非复制的值.如果是这样的话,那么我的参数即使包含很大的数据量,不显示的用ref也不会影响性能?
首先你要分清楚按引用传递和引用类型的参数的不同,这点在,.NET框架程序设计(修订版),第9章第5小节有详细的解释。其次推荐你看篇博客C#的引用给我的感觉很像指针,依我看来,值类型在创建对象的时候得到的是对象本身,而引用类型在创建时得到的是它的地址(当然很有可能这个地址不是物理地址,但也是通过它计算得到的),所以在复制参数的时候,值类型的修改不会影响到外部的本身,而引用类型的参数在复制引用后能改变对象的值是因为寻址的原因,相当于两个指针指向了同一个地址,不知道正确否还请版主看一下我这理解的有问题没? C#语言版 class Entry { public static void Main() { int a = 1; Set( ref a ); }
public static void Set( ref int b ) { b = 2; } } C语言 void Set( int *b ) { *b = 2; }int main( void ) { int a = 1; Set( &a ); //&相当于C#中的ref }
首先你要分清楚按引用传递和引用类型的参数的不同,这点在,.NET框架程序设计(修订版),第9章第5小节有详细的解释。其次推荐你看篇博客C#的引用给我的感觉很像指针,依我看来,值类型在创建对象的时候得到的是对象本身,而引用类型在创建时得到的是它的地址(当然很有可能这个地址不是物理地址,但也是通过它计算得到的),所以在复制参数的时候,值类型的修改不会影响到外部的本身,而引用类型的参数在复制引用后能改变对象的值是因为寻址的原因,相当于两个指针指向了同一个地址,不知道正确否还请版主看一下我这理解的有问题没? C#语言版 class Entry { public static void Main() { int a = 1; Set( ref a ); }
public static void Set( ref int b ) { b = 2; } } C语言 void Set( int *b ) { *b = 2; }int main( void ) { int a = 1; Set( &a ); //&相当于C#中的ref }对的对的,完全正确。
嗯,我在C# primer plus里也看到了一句话,“C++中的指针等价于C#中的引用”,在结合版主的话,可以推出,C#和C语言一样,参数传递本质上是值传递,没有“引用传递”,所谓的“引用”,只是把外部的引用“赋值”给了内部的参量而已,然后经过寻址修改就可以改变外部引用所引用的对象
{
...
}
(2)在方法体外,写一个断言,比较调用前后的GetHashCode()是否一致,如果不一致,说明被修改,果断中止程序丢出异常。
例如int i=10;
Conslole.WriteLine(i);//相当于把i存储的值复制一份给Conslole.WriteLine使用,内存中存在两个10myType my=new myType();//假设myType是引用类型;
Conslole.WriteLine(my);//这是把my这个引用复制一份给Conslole.WriteLine使用,内存中有两个对myType实例的引用。
加上ref或者out则不会引起参数的复制,传递的是参数地址【值类型引用类型相同】
public class ClassA
{
public string _strValue = "defaultValue";
}
void RefTest(ClassA param)
{
param._strValue = "Changed";
}
ClassA srcClass = new ClassA();
print("Before function called : " + srcClass._strValue);
RefTest(srcClass);
print("After function called: " + srcClass._strValue);这段代码输出结果为:
Before function called : defaultValue
After function called: Changed将类作为参数,结果类的成员变量的值被改变了.这不是说明参数是按引用类型传递的吗?
还是说参数是按值传递的,但复制的是该变量的地址,而非复制的值.如果是这样的话,那么我的参数即使包含很大的数据量,不显示的用ref也不会影响性能?
首先你要分清楚按引用传递和引用类型的参数的不同,这点在,.NET框架程序设计(修订版),第9章第5小节有详细的解释。其次推荐你看篇博客
{
ClassA srcClass = new ClassA();
Console.WriteLine("Before function called : " + srcClass._strValue);
RefTest(srcClass);
Console.WriteLine("After function called: " + srcClass._strValue);
}void RefTest(ClassA param)
{
ClassA copy_one = (ClassA)param.Clone();
copy_one._strValue = "Changed";
}public class ClassA:ICloneable
{
public string _strValue = "defaultValue";
#region ICloneable 成员 public object Clone()
{
return this.MemberwiseClone();
} #endregion
}
首先你要分清楚按引用传递和引用类型的参数的不同,这点在,.NET框架程序设计(修订版),第9章第5小节有详细的解释。其次推荐你看篇博客C#的引用给我的感觉很像指针,依我看来,值类型在创建对象的时候得到的是对象本身,而引用类型在创建时得到的是它的地址(当然很有可能这个地址不是物理地址,但也是通过它计算得到的),所以在复制参数的时候,值类型的修改不会影响到外部的本身,而引用类型的参数在复制引用后能改变对象的值是因为寻址的原因,相当于两个指针指向了同一个地址,不知道正确否
首先你要分清楚按引用传递和引用类型的参数的不同,这点在,.NET框架程序设计(修订版),第9章第5小节有详细的解释。其次推荐你看篇博客C#的引用给我的感觉很像指针,依我看来,值类型在创建对象的时候得到的是对象本身,而引用类型在创建时得到的是它的地址(当然很有可能这个地址不是物理地址,但也是通过它计算得到的),所以在复制参数的时候,值类型的修改不会影响到外部的本身,而引用类型的参数在复制引用后能改变对象的值是因为寻址的原因,相当于两个指针指向了同一个地址,不知道正确否还请版主看一下我这理解的有问题没?
C#语言版
class Entry
{
public static void Main()
{
int a = 1;
Set( ref a );
}
public static void Set( ref int b )
{
b = 2;
}
}
C语言
void Set( int *b )
{
*b = 2;
}int main( void )
{
int a = 1;
Set( &a ); //&相当于C#中的ref
}
首先你要分清楚按引用传递和引用类型的参数的不同,这点在,.NET框架程序设计(修订版),第9章第5小节有详细的解释。其次推荐你看篇博客C#的引用给我的感觉很像指针,依我看来,值类型在创建对象的时候得到的是对象本身,而引用类型在创建时得到的是它的地址(当然很有可能这个地址不是物理地址,但也是通过它计算得到的),所以在复制参数的时候,值类型的修改不会影响到外部的本身,而引用类型的参数在复制引用后能改变对象的值是因为寻址的原因,相当于两个指针指向了同一个地址,不知道正确否还请版主看一下我这理解的有问题没?
C#语言版
class Entry
{
public static void Main()
{
int a = 1;
Set( ref a );
}
public static void Set( ref int b )
{
b = 2;
}
}
C语言
void Set( int *b )
{
*b = 2;
}int main( void )
{
int a = 1;
Set( &a ); //&相当于C#中的ref
}对的对的,完全正确。