c#中this的用法 20
namespace CallConstructor
{
public class Car
{
int petalCount = 0;
String s = "null";
Car(int petals)
{
petalCount = petals;
Console.WriteLine("Constructor w/int arg only,petalCount = " + petalCount);
}
Car(String s, int petals)
: this(petals)
{
this.s = s;
Console.WriteLine("String & int args");
}
Car()
: this("hi", 47)
{
Console.WriteLine("default constructor");
}
public static void Main()
{
Car x = new Car();
Console.Read();
}
}
}
能帮我解释一下这段代码中几个this的意思吗? 展开
1、在构造函数中this用于限定被相同的名称隐藏的成员,例如:
public class Student{
public Student(string name, string age){
this.name = name;
this.age = age;
}}
2、将对象作为参数传递到其他方法时也要用this表达,例如:fun(this)。
3、可以通过this[]来声明索引器,例如:
public int this [int param]{
get{return array[param];}
set{array[param]=value;}
}
扩展资料:
在实例代码中,类的私有成员变量name与类成员方法的入参名称相同,所以在函数体中,类的私有成员变量name被入参name隐藏,要想在函数体中使用该私有成员变量,需要使用this关键字来指定,作用就是告诉编译器,此处的name为类的私有成员变量而不是函数的入参name。
this代表的是调用这个函数的对象的引用,而静态方法是属于类的,不属于对象,静态方法成功加载后,对象还不一定存在。静态方法不可使用this因为静态方法不针对任何实例对象。实例对象调用静态方法会因参数中多出一个指向自己的指针(this)而发生错误。
也可以用this来做为参数状当前实例做为参数传入方法.
还可以通过this[]来声明索引器
下面是你这段程序的注解:
// 引入使命空间System
using System;
// 声明命名空间CallConstructor
namespace CallConstructor
{
// 声明类Car
public class Car
{
// 在Car类中:
// 声明一个非静态的整型变量petalCount,初始值为0
// 未用Static声明的变量叫做静态变量,非静态成员属于
类的实例,我们只能在调用类的构造函数对类进行实例化后才能通过所得的实例加"."来访问
int petalCount = 0;
// 声明一个非静态的字符串变量s,初始值为"null";
// 注意:s = "null"与s = null是不同的
String s = "null";
// Car类的默认构造函数
Car(int petals)
{
// Car类的默认构造函数中为 petalCount 赋值为传入的参数petals的值
petalCount = petals;
// 输出petalCount
Console.WriteLine("Constructor w/int arg only,petalCount = " + petalCount);
}
// 重载Car类的构造函数
// : this(petals) 表示从当前类中调用petals变量的值来作为构造函数重载方法Car(String s, int petals)的第二个参数
Car(String s, int petals)
: this(petals)
{
// 在构造函数中为s赋值
// 非静态成员可以在构造函数或非静态方法中使用this.来调用或访问,也可以直接打变量的名字,因此这一句等效于s = s,但是这时你会发类的变量s与传入的参数s同名,这里会造成二定义,所以要加个this.表示等号左边的s是当前类自己的变量
this.s = s;
Console.WriteLine("String & int args");
}
// 重载构造函数,: this("hi", 47) 表示调Car(String s, int petals) 这个重载的构造函数,并直接传入变量"hi"和47
Car()
: this("hi", 47)
{
Console.WriteLine("default constructor");
}
public static void Main()
{
Car x = new Car();
Console.Read();
}
}
}
this用法1:限定被相似的名称隐藏的成员
/// <summary>
/// /******************************************/
/// /* this用法1:限定被相似的名称隐藏的成员 */
/// /******************************************/
/// </summary>
/// <param name="Name"></param>
public Person(string Name, string Sex)
{
this.Name = Name;
this.Sex = Sex;
}
this用法2:将对象作为参数传递到其他方法
/// <summary>
///Person 的摘要说明
/// </summary>
public class Person
{
/// <summary>
/// 姓名
/// </summary>
public string Name { set; get; }
/// <summary>
/// /*******************************************/
/// /* this用法2:将对象作为参数传递到其他方法 */
/// /*******************************************/
/// </summary>
public void ShowName()
{
Helper.PrintName(this);
}
}
/// <summary>
/// 辅助类
/// </summary>
public static class Helper
{
/// <summary>
/// 打印人名
/// </summary>
/// <param name="person"></param>
public static void PrintName(Person person)
{
HttpContext.Current.Response.Write("姓名:" + person.Name + "<br />");
}
}
this用法3:声明索引器
/// <summary>
/// 其它属性
/// </summary>
public NameValueCollection Attr = new NameValueCollection();
/// <summary>
/// /*************************/
/// /* this用法3:声明索引器 */
/// /*************************/
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public string this[string key]
{
set
{
Attr[key] = value;
}
get
{
return Attr[key];
}
}
this用法4:扩展对象的方法
/// <summary>
///Person 的摘要说明
/// </summary>
public class Person
{ /// <summary>
/// 性别
/// </summary>
public string Sex { set; get; }
}
/// <summary>
/// 辅助类
/// </summary>
public static class Helper
{
/// <summary>
/// /*****************************/
/// /* this用法4:扩展对象的方法 */
/// /*****************************/
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
public static string GetSex(this Person item)
{
return item.Sex;
}
}
调用:
Person person = new Person();
person.GetSex();
string
name;
private
string
alias;
//
上面两个变量是私有的,只能在本类中访问,其余的类不能访问他们
//而下面的构造方法是外界能访问的,由于除本类之外的类不能访问上面的两个变量name和alias,但是又要给它们传值(如果不传值定义这两个变量就毫无意义),怎么办呢?于是就用下面的构造方法,通过这个构造方法的形参name和alias把值传递进来。这样做的目的就是为了提高程序的安全性,不能让外界直接访问里面的name和alias
//这样在其余的类中就可以写:
Employee
emp
=
new
Employee("姓名",“别名”);
在本类中就是:
this.name=name;//这里的name=”姓名“;
this.alias=alias;//这里的alias=”别名“
这样就达到了外界并没有访问本类的name和alias,但是值也传递进来了,所以达到了提高安全性的目的
public
Employee(string
name,
string
alias)
{
//将构造方法带的值赋给本类中的name,这个this你可以看成是“本类”的意思
this.name
=
name;
this.alias
=
alias;
}
括号里的的参数不一定要取相同的名称这个方法也可以写成
public
Employee(string
a,stirn
b)
{这样写就不用this了,因为这里name和alias是唯一的
name=a;
alias=b;
}
string
name;
private
string
alias;
//
上面两个变量是私有的,只能在本类中访问,其余的类不能访问他们
//而下面的构造方法是外界能访问的,由于除本类之外的类不能访问上面的两个变量name和alias,但是又要给它们传值(如果不传值定义这两个变量就毫无意义),怎么办呢?于是就用下面的构造方法,通过这个构造方法的形参name和alias把值传递进来。这样做的目的就是为了提高程序的安全性,不能让外界直接访问里面的name和alias
//这样在其余的类中就可以写:
Employee
emp
=
new
Employee("姓名",“别名”);
在本类中就是:
this.name=name;//这里的name=”姓名“;
this.alias=alias;//这里的alias=”别名“
这样就达到了外界并没有访问本类的name和alias,但是值也传递进来了,所以达到了提高安全性的目的
public
Employee(string
name,
string
alias)
{
//将构造方法带的值赋给本类中的name,这个this你可以看成是“本类”的意思
this.name
=
name;
this.alias
=
alias;
}
括号里的的参数不一定要取相同的名称这个方法也可以写成
public
Employee(string
a,stirn
b)
{这样写就不用this了,因为这里name和alias是唯一的
name=a;
alias=b;
}