在没有ref的情况下如果是基本类型,如int,decimal肯定是传值操作
如果是一个对象,默认就是传地址,不必加ref也就是说
public void myfunction(object objsend)
等价于
public void myfunction(ref object objsend)不知这么说对不对?

解决方案 »

  1.   

    对的,但是引用的话,函数可以改变参数的植
    ------------------------------------------
    如果是对象类型的话,不加ref也可以改变参数的值啊
      

  2.   

    楼主说的应该是错误的吧
    C#中所有值类型都是继承Object类型的,继承它的值类型都有区分
    不用ref或者out引用object参数,就和值类型一样都是传值引用
      

  3.   

    你可以用Hashtable试验一下看看用ref和不用ref的区别Class1 myclass = new Class1(); 
    Hashtable myhash = new Hashtable();
    myhash.Add("2","2");
    MessageBox.Show(myhash.Count.ToString());
    myclass.addhash(myhash);
    MessageBox.Show(myhash.Count.ToString());显示为1,2
      

  4.   

    ref和不加ref不等价,他们的区别在这里:
    public class MyClass
    {
    public static void Main()
    {
    Hashtable ht = new Hashtable();
    ht["abc"] = 1;
    Console.WriteLine(ht.Count);
    myFunction(ht);
    Console.WriteLine(ht.Count);
    myRefFunction(ref ht);
    Console.WriteLine(ht.Count);
    }

    public static void myFunction(Hashtable ht)
    {
    ht = new Hashtable();
    }

    public static void myRefFunction(ref Hashtable ht)
    {
    ht = new Hashtable();
    }
    }
    猜一下输出的结果是什么吧。不加ref的参数传递是by value的方式,如果是一个引用类型那么传递的是一个指针,也就是把对象的指针复制了一份传递给函数的参数,两个指针指向同一个对象,因此对他们的修改是对同一个对象的修改。
    但是在myFunction中重新建立了一个对象,实际上是修改了hashtable对象指针的一个副本,原来的那个hashtable并没有受到影响。
    加了ref就是按引用传递了,自是之中都只有一个指针,也指向同一个对象,对这个指针进行的操作自然是会影响原来的那个对象。因此在myRefFunction中改变了传递过来的指针的值,在最初的掉用函数中的原来的指针也改成了新建的对象。因此输出结果是
    1
    1
    0
      

  5.   

    fancyf(凡瑞) ( ) 
    分析的有道道
      

  6.   

    也就是说
    不加ref相当于复制了一个指针的副本,两个指针指向同一个对象,如果指针副本发生改变(指向了另一个对象),不会改变原来的指针
    加ref就相当于是完完全全是一个指针了。
      

  7.   

    不对!!完全不对!!
    结构类型加 ref 是引用,也就是所引用的结构的内存地址,这个你说得对,但是后面一个说错了!在引用类型上加 ref,这是相当于 C++ 或 C 语言中的二级指针,也就是指向地址的地址,这可以用以下事例来说明,
    class MainClass
    {
    static void Main(string[] args)
    {
    TestClass test = new TestClass();
    test.Text = "Main";
    Console.WriteLine(test.Text); Func(test);
    Console.WriteLine(test.Text); Func(ref test);
    Console.WriteLine(test.Text); Console.Read();
    } static void Func(ref TestClass test)
    {
    test = new TestClass();
    test.Text = "ref Func";
    } static void Func(TestClass test)
    {
    test = new TestClass();
    test.Text = "Func";
    }
    } class TestClass
    {
    public string Text;
    }
    输出结果是
    Main
    Main
    ref Func
    你会发现在调用 Func(TestClass test) 后原来在 Main 方法里的 test 变量并没有被更改,这是因为 Func 方法里的 test 和 Main 方法里的 test 是分别独立的,而在调用 Func(ref TestClass test) 方法之后,Main 方法里的 test 被改变了,因为 Func 方法里的 test 指向的是 Main 方法里的 test 变量的地址,是地址的地址,也就是 Main 方法里的 test 指向的是 TestClass 实例的地址,而 Func 里的 test 指向的是 Main 方法的 test 的地址(不是 TestClass 实例的地址!)。
    总结,以上表述非常绕口,如果没有 C 语言或 C++ 的基础,可能理解起来会比较麻烦,会需要较长的时间慢慢想通它。鉴于 ref 的难以理解,因此,对于一般的程序员不建议使用 ref 修饰方法参数。
      

  8.   

    MyNameEPC是对的
    TestClass *test = new TestClass();MyNameEPC说的ref类似这样
    void FuncRef1(TestClass** tc)
    {
    *tc = new TestClass();
    (*tc)->n = 1;
    }我说的ref类似这样
    void FuncRef2(TestClass& tc)
    {
    TestClass *test = new TestClass();
    tc = *test;
    tc.n = 1;
    }.NET用的是MyNameEPC说的那种传递参数的方式
    还是拿这一段来说
    Hashtable ht = new Hashtable();
    ht["abc"] = 1;
    Console.WriteLine(ht.Count);
    myFunction(ht);
    Console.WriteLine(ht.Count);
    myRefFunction(ref ht);
    Console.WriteLine(ht.Count);
    开始ht是一个指针,ht的内容是对象的内存地址
    myFunction的调用所传递的值是 ht的内容,也就是对象的内存地址
    myRefFunction所传递的参数是 ht的地址
      

  9.   

    楼主没体会到ref的用处啊,有ref可以把对象彻底换了,不加ref只能改变其值。
      

  10.   

    哦,多谢 MyNameEPC(MyName) 兄指点。以前只知道类是引用类型;变量是值类型。我体会楼主的意思是:认为类就是一个引用类型。