黑马程序员技术交流社区

标题: 私有字段为什么在方法中使用时无法在方法中传递 [打印本页]

作者: boy_AND_gou    时间: 2014-5-17 08:08
标题: 私有字段为什么在方法中使用时无法在方法中传递
本帖最后由 boy_AND_gou 于 2014-5-19 06:11 编辑

private char c=' ';public void show()
{
     Hello(ref c);
}
public void Hello(char c)
{
  c='a';
}



作者: 方杰斌    时间: 2014-5-17 12:03
这个 问题 没必要纠结。
他这样做的目的 就是为了   显示 get 和 set 的好处。


还有如果你真要弄请 可以参考
1 如何访问私有成员  http://www.cnblogs.com/zhuqil/archive/2010/07/25/1784903.html
2 get、set 的好处   http://blog.csdn.net/deepwishly/article/details/5305017


【如果觉得能帮得上  请对问题 进行编辑  修改为 提问结束   麻烦了】
作者: czwanglei    时间: 2014-5-17 15:19
你这个写的不规范,在一个类中,方法可以访问到私有字段的,这个可以参考成员的访问修饰符。
作者: 林枫    时间: 2014-5-17 17:22
你这肯定报错,Hello方法没写ref修饰符 ref代表引用传递 方法声明的时候要写,调用的时候也要写
作者: 姜饼不甜    时间: 2014-5-18 07:16
private char c=' ';

public void show()
{
     Hello(ref c);
}
public void Hello( ref char c)
{
  c='a';
}
你的Hello方法参数也需要用ref修饰才可以,同类中的方法一定是可以访问私有变量的

作者: czwanglei    时间: 2014-5-18 08:45
当有人给你回复后,请把帖子编辑为提问结束,这样版主才给你加分。
作者: 陈君    时间: 2014-5-18 11:00
这里就是ref的用法的问题。 这里可以看到你这样写的话已经报错了。
正确的程序应该是
  private char c=' ';
        public void show()
        {
            Hello(ref c);
        }
        public void Hello(ref char c)
        {
            c='a';
        }
为什什么Hello的方法的实体部分也要加ref呢?其实这里的ref就好像是c语言中的*。ref char c的意思就好像是C语言中的char * c代表的是参数的类型是指向向char类型的指针。而不是char类型。char类型保存的是具体的值,但是char *类型保存的是保存char类型的值饿内存中的地址。
我拿一个C语言的传址调用的例子来说明下
#include "stdio.h"
#include "malloc.h"
void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
void main()
{
int x,y;
x=6;
y=10;
swap(&x,&y);
printf("x=%d,y=%d",x,y);
getchar();
}这里在调用swap的时候时用了&取地址。这样就能保证传进去的是内存的地址,而不是具体的值了。而且只有这样它才能swap要求的参数类型相匹配,这样就不会报错。
现在再来看看这个程序
private char c=' ';
public void show()
{
Hello(ref c);
}
public void Hello(ref char c)
{
c='a';
}只有调用的时候加上ref,并且方法的实体里参数类型也是ref char才能运行。
至于为什么加上ref。直接传值调用不行嘛?
我们来试下
    class Class1
    {
        private char c=' ';
        private int a = 0;
        public void show()
        {
            Hello(c);
        }
        public void Hello(char c)
        {
            c='a';
        }
    }
  private void Form1_Load(object sender, EventArgs e)
        {
            Class1 c1 = new Class1();
            c1.show();
        }

调试结果是这样的。我们可以看到c1.c的值还是' '。而c这个变量的值是a。结过和使用ref的进行比较下看看
我们发现使用了ref的话,c1.c的值也跟着发生了变化。这就是ref的进行引用调用的好处。也就相当于C语言中的传址调用。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2