关于对参数为 ref的 引用类型 的看法

WoKanBuDao 2017-01-17 02:42:40



1.比如参数为(ref DataTable dt)
{
方法体;

}

这个方法是不是可以看做是 return dt 啊;我感觉是。还请大神帮我看看说的对吗?暂时感觉是这样。
...全文
166 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2017-01-18
  • 打赏
  • 举报
回复
引用 8 楼 u012948520 的回复:
我是支持以返回值作为函数结果的 除非有多个返回值才用ref和out 比如sql查询本身范围int表示查询是否成功,带ref或者out参数返回数据
之前的确是我理解错了。 ref对于值类型和引用类型的作用不同。
正怒月神 2017-01-18
  • 打赏
  • 举报
回复
引用 14 楼 crystal_lz 的回复:
ref对于值类型和 引用类型还真有区别 对于引用类型 默认直接就是传递的引用 可是加上了ref 传递的是一个地址指针 可以看上面我的回复 虽然你可以在f1 里面炒作 a 并且直接影响外面的 a b 变量 因为a b指向的是同一个内存 如果你在f1 里面a = new ClassA() 那么你此时再用a变量操作对象的时候 外面的a b变量根本就不会受到影响 因为new ClassA的时候创建了一个新的对象 并且把地址赋值给了a 所以你用a操作到的是新的对象 和外面的 a b 没有任何关系 可以你直接 ref传入 效果就不一样了
嗯,的确是我理解错了
crystal_lz 2017-01-18
  • 打赏
  • 举报
回复
引用 13 楼 hanjun0612 的回复:
[quote=引用 11 楼 u012948520 的回复:] 你看到方法里面的new了吗?引用类型和引用传值,你搞混了
你给的代码,我更多的认为问题出在new上。 你看如下代码,f1(a)后,b的值也跟着改变了。很明显是引用传递 static void Main(string[] args) { ClassA a = new ClassA(); a.x = 1; ClassA b = a; f1(a); Console.WriteLine(a.x); Console.WriteLine(b.x); Console.ReadLine(); } static void f1(ClassA a) { a.x = 5; } public class ClassA { public int x { get; set; } }[/quote] ref对于值类型和 引用类型还真有区别 对于引用类型 默认直接就是传递的引用 可是加上了ref 传递的是一个地址指针 可以看上面我的回复 虽然你可以在f1 里面炒作 a 并且直接影响外面的 a b 变量 因为a b指向的是同一个内存 如果你在f1 里面a = new ClassA() 那么你此时再用a变量操作对象的时候 外面的a b变量根本就不会受到影响 因为new ClassA的时候创建了一个新的对象 并且把地址赋值给了a 所以你用a操作到的是新的对象 和外面的 a b 没有任何关系 可以你直接 ref传入 效果就不一样了
正怒月神 2017-01-17
  • 打赏
  • 举报
回复
引用 11 楼 u012948520 的回复:
你看到方法里面的new了吗?引用类型和引用传值,你搞混了
你给的代码,我更多的认为问题出在new上。 你看如下代码,f1(a)后,b的值也跟着改变了。很明显是引用传递 static void Main(string[] args) { ClassA a = new ClassA(); a.x = 1; ClassA b = a; f1(a); Console.WriteLine(a.x); Console.WriteLine(b.x); Console.ReadLine(); } static void f1(ClassA a) { a.x = 5; } public class ClassA { public int x { get; set; } }
WoKanBuDao 2017-01-17
  • 打赏
  • 举报
回复
谢谢各位的回答- 0差不多明白了 感谢!!!!就不一一回复了,分不多。。
白衣如花 2017-01-17
  • 打赏
  • 举报
回复
引用 9 楼 hanjun0612 的回复:
[quote=引用 7 楼 u012948520 的回复:] [quote=引用 2 楼 hanjun0612 的回复:] ref 是给值类型用的。
static void Main(string[] args)
        {
            int a = 0;
            Test(a);
            Console.WriteLine(a);         // 0
            Test(ref a);
            Console.WriteLine(a);        //  10

            Console.ReadLine();
        }

        public static void Test(int a)
        {
            a = 10;
        }

        public static void Test(ref int a)
        {
            a = 10;
        }
理解有问题的

void f1(ClassA a)
{
    a = new ClassA();
    a.x = 5;
}
void f2(ref Class a)
{
    a = new ClassA();
    a.x = 5;
}

ClassA a = new ClassA();
a.x = 1;
f1(a); // a.x == 1
f2(a); // a/x == 5 
[/quote] 我的天。。。。 引用类型压根不需要用ref和 out 引用类型已经传递了引用。
static void Main(string[] args)
        {
            ClassA a = new ClassA();
            a.x = 1;
            f1(a);
            Console.WriteLine(a.x);
            Console.ReadLine();
        }

        static void f1(ClassA a)
        {
            a.x = 5;
        }
[/quote]你看到方法里面的new了吗?引用类型和引用传值,你搞混了
wanghui0380 2017-01-17
  • 打赏
  • 举报
回复
这个对应传统编程的 in和out参数 如果你玩c++的代码,他们会明确告诉你,返回对象是返回对象,输入参数是输入参数,输出参数是输出参数滴 //登录判定,传入用户名,密码。存在返回ture,失败返回false,同时传出用户对象,验证失败用户对象是null bool checker([in]string username,[in]string userpass,[out] user user) 好了,这这样说你明白他的意思没,他不是return,他只是“共享”了参数
正怒月神 2017-01-17
  • 打赏
  • 举报
回复
引用 7 楼 u012948520 的回复:
[quote=引用 2 楼 hanjun0612 的回复:] ref 是给值类型用的。
static void Main(string[] args)
        {
            int a = 0;
            Test(a);
            Console.WriteLine(a);         // 0
            Test(ref a);
            Console.WriteLine(a);        //  10

            Console.ReadLine();
        }

        public static void Test(int a)
        {
            a = 10;
        }

        public static void Test(ref int a)
        {
            a = 10;
        }
理解有问题的

void f1(ClassA a)
{
    a = new ClassA();
    a.x = 5;
}
void f2(ref Class a)
{
    a = new ClassA();
    a.x = 5;
}

ClassA a = new ClassA();
a.x = 1;
f1(a); // a.x == 1
f2(a); // a/x == 5 
[/quote] 我的天。。。。 引用类型压根不需要用ref和 out 引用类型已经传递了引用。
static void Main(string[] args)
        {
            ClassA a = new ClassA();
            a.x = 1;
            f1(a);
            Console.WriteLine(a.x);
            Console.ReadLine();
        }

        static void f1(ClassA a)
        {
            a.x = 5;
        }
白衣如花 2017-01-17
  • 打赏
  • 举报
回复
我是支持以返回值作为函数结果的 除非有多个返回值才用ref和out 比如sql查询本身范围int表示查询是否成功,带ref或者out参数返回数据
白衣如花 2017-01-17
  • 打赏
  • 举报
回复
引用 2 楼 hanjun0612 的回复:
ref 是给值类型用的。
static void Main(string[] args)
        {
            int a = 0;
            Test(a);
            Console.WriteLine(a);         // 0
            Test(ref a);
            Console.WriteLine(a);        //  10

            Console.ReadLine();
        }

        public static void Test(int a)
        {
            a = 10;
        }

        public static void Test(ref int a)
        {
            a = 10;
        }
理解有问题的

void f1(ClassA a)
{
    a = new ClassA();
    a.x = 5;
}
void f2(ref Class a)
{
    a = new ClassA();
    a.x = 5;
}

ClassA a = new ClassA();
a.x = 1;
f1(a); // a.x == 1
f2(a); // a/x == 5 
谷凯Jump 2017-01-17
  • 打赏
  • 举报
回复
看一下C# out和ref的区别,你应该会更理解一点! http://www.cnblogs.com/Tally/archive/2012/05/24/2516455.html 如果你的dt纯粹为了传出,而不传入的话,应该用out关键字
crystal_lz 2017-01-17
  • 打赏
  • 举报
回复
对于值类型 默认传值 Test(a) ->传入a值的拷贝 Test(ref a) ->传入a的地址 对于引用类型 默认本来就是传入引用(地址) Test(a) ->传入a的地址 Test(ref a) ->传入a的地址所在的地址
crystal_lz 2017-01-17
  • 打赏
  • 举报
回复

A a_1 = new A(); //假设a_1指向的地址为0x0001 即a=0x0010
a_1.Text = "test_a_1";
A a_2 = new A(); //假设a_2指向的地址为0x0002 即a=0x0020
a_2.Text = "test_a_2";
Test_1(a_1); //将0x0010 传入
Test_2(ref a_2); //将0x0020 所在的地址 0x0002传入
Console.WriteLine(a_1.Text);//输出为Test_1 因为a_1指向的是0x0010上面的A
Console.WriteLine(a_2.Text);//暑促为test_2_new 因为a_2的0x0020被修改成了0x0040
//==输出结果
Test_1
Test_2_new

public class A {
public string Text;
}
//默认对象传入的是引用(对象的地址)
public void Test_1(A a) { //此时a是指向一个A的地址(0x0010)
a.Text = "Test_1"; //通过a来访问A在内存中(0x0010)的数据
a = new A(); //此时创建了一个新的A(假设地址为0x0030) 并把地址给了;
a.Text = "Test_1_new"; //这里只会修改到0x0003上面的A
}
//加了ref就表示传入地址 而对象本生就是传地址的 所以此时传入的是地址指针(地址的地址) 0x0020这个值的地址
public void Test_2(ref A a) {
a.Text = "Test_2"; //方位到的是0x0020上面的对象
a = new A(); //创建一个新的A(0x0040) 并将其地址写入到0x0002这个地址(覆盖原来的0x0020)
a.Text = "Test_2_new"; //修改的是0x0040上面的对象
}

随手画了一个图
正怒月神 2017-01-17
  • 打赏
  • 举报
回复
ref的目的是 使参数按引用传递 所以第一个 方法 a还是0,因为传递进Test的是a的副本,一个新的a 第二个方法 a=10.因为参数按引用传递了。
正怒月神 2017-01-17
  • 打赏
  • 举报
回复
ref 是给值类型用的。
static void Main(string[] args)
        {
            int a = 0;
            Test(a);
            Console.WriteLine(a);         // 0
            Test(ref a);
            Console.WriteLine(a);        //  10

            Console.ReadLine();
        }

        public static void Test(int a)
        {
            a = 10;
        }

        public static void Test(ref int a)
        {
            a = 10;
        }
xiaoyu5425 2017-01-17
  • 打赏
  • 举报
回复
不对.......

110,536

社区成员

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

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

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