A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© me黄小峰 黑马帝   /  2012-4-5 12:39  /  3081 人查看  /  19 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 me黄小峰 于 2012-4-24 16:31 编辑

例:class Preson
{
string name;
public Preson(string name)
{
this.name=name
}
}
这个类中已经定义了name,并且构造函数中也可以访问,那在构造函数中定义的参数也是为name,构造函数中也可以访问这个参数name,那为什么在构造函数中这两个name没有冲突,求解,希望谙练一些。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

19 个回复

倒序浏览
this.name表示当前类里的name字段,后面的那个name是参数

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
this 是指当前类 this.name 就是指当前类的name的字段

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
this 你就理解为当前的类,那么this.name 就是在类中的name,即你定义的那个name字段,后面的name就是参数了,你可以把光标点在name上 右键 有一个转到定义,看看光标跑哪里了,就知道这个name是指那个了。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 徐刚 于 2012-4-5 14:55 编辑

其实你可以把构造方法中的参数name用value来代替,就好理解了,如下:
class Preson
{
    string name;
    public Preson(string value)
    {
        this.name=value;
    }
}

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报

例:class Preson
{
string name;
public Preson(string name)
{
this.name=name
}
}

this.name 是当前类中的一个字段,括号中的name是来接受传过来的参数的,右键转到定义看看,或者把一个name改个名字

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
this是当前对象,this.name是当前对象的name属性,name是setName方法传入的参数  因此不会冲突

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
this是你当前类的每一个实例代指
比如person p = new person();
在person类中 你可以使用this关键字来表示 p.

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
各位兄弟我说想问的是为什么字段name 与参数name 没有冲突,他们都是想同的类型,相同的变量名,为什么不报错
或都说参数在底层是以什么样的形式存在的。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
string name;这里是类的字段,用于初始化变量name
public Preson(string name)这里的name是构造函数传的参数,与上面的name是不会冲突的,当然这里也不一定要写成name,
写成public Preson(string a)
{
this.name=a;
}
也是可以的

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
“各位兄弟我说想问的是为什么字段name 与参数name 没有冲突,他们都是想同的类型,相同的变量名,为什么不报错
或都说参数在底层是以什么样的形式存在的。 ”、
我来彻底的给你解释一下 这两个name之间的区别。因为我初学的时候也犯过和你一样的迷糊。

首先来看一下你的例子:
class Preson
{
string name;
public Preson(string name)
{
this.name=name
}
}

会发现 this.name  和 name之间 不完全一样。 前面的name前面有一个this的关键字,而后面的没有。
我在上面也已经说明了,在类中,this关键字就是该类实例的代指的关键字。this 它代表这个person每生成一个实例 的对象。
比如 person p = new person(); this可以代表p  person p2 = new person();this 在此代码中又代指p2这个对象。
当你person p = new person("我的名字");的时候,会首先执行构造函数。(构造函数是类在实例化由.NET默认自动调用的函数,来用于初始化字段)
此时 在你构造函数中的this 其实 就是你在外面申明的p对象。
   其实 你也可以这么理解,我不知道 外面会申明一个什么样的对象名 不知道是 p 还是p1 还是p2,p3,p4....等等乱七八糟的对象名。
但是 没有关系,只要是你申明了 我的这个对象,你就必须要进入到我的构造函数,我的this就是代指你外面申明的那个对象,那我又何必管你在外面申明的是i什么名字呢?

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
都给解释了……  我飘过……  {:soso__4070760796089380785_1:}
回复 使用道具 举报
因为前面的this.name是字段后面的那个是参数,当然不会重复了,建议最好不用重名的!!!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
编译器说不会冲突就是不会冲突。。。  这需要为什么吗{:soso_e127:}
回复 使用道具 举报
其实这个是this使用的方法之一,使用this访问,在类的实例构造函数或者实例函数成员中,this表示当前的类实例或者对象引用,this不能在静态的函数和函数成员中

class Person
{
    private string name = string.Empty;
    public Person(string name) // 在这个函数内,name是指传入的参数name
    {
        this.name = name;           // this.name表示字段name
        /* 非静态成员可以在构造函数或非静态方法中使用this.来调用或访问,也可以直接打变量的名字。因此这一句等效于name = name;
       但是这时你会发现的变量name与传入的参数name同名,这里会造成二定义,所以要加个this.表示等号左边的name是当前类自己的变量。*/
    }
}

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
构造函数中形参name是赋值给类的属性(字段)name,举个简单例子:

int a=3;//定义一个变量
a+=a;//a自加操作,相当于a=a+a,并不会冲突

其实这和两个类型一样的name同时出现并不会冲突一样,希望能帮助你理解。{:soso_e100:}

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
它们的作用域不同,一个是全局变量,一个是参数,当然不会冲突了!!!

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
意义不同

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
this.name=name;
this.表示当前对象,this.name = name表示把构造函数被调用时,传入的name赋值给当前对象的name。
回复 使用道具 举报
this.name表示当前Preson类中的属性,写法:Preson.name,而 构造函数中的string name,表示的只是一个函数中参数
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马