C#“.NET研究”类类型
类类型是由字段数据(成员变量)和操作字段数据的成员(属性、方法、构造函数、事件等)所构成的自定义类型。其中字段数据表示类实例(对象)的状态。
在C#中,类使用class关键字定义,例如:
{
//Car的字段(状态)
private上海闵行企业网站制作yle="color: #000000;"> int _speed;
private string _name;
//Car操作字段的属性
public int Speed
{
set {this._speed=value;}
get{return this._speed;}
}
public string Name
{
set { this._name=value;}
get{return this._name;}
}
//显式定义默认构造函数
public Car(){}
//自定义构造函数
public Car(string name,int speed)
{
this._name上海企业网站设计与制作yle="color: #000000;">=name;
this._speed=speed;
}
//Car的功能(方法)
public void ShowState()
{Console.WriteLine("Car {0} is going {1} MPH", this._name,this上海闵行企业网站设计与制作"color: #000000;">. _speed);}
}
另:类的字段很少被定义为公开的,为了保护状态数据的完整性,最好把字段数据定义为私有(或者受保护的),然后通过属性对外提供受控制的访问。
使用new关键字来分配对象
对象必须使用了new关键字来分配到内存,如果不是用new,而随后尝试使用类变量的话,会收到一个编译错误。
{
//错误,忘记使用new
Car c;
c.Name="Bruce";
}
正确的例子:
{
//创建Car对象。
Car c;//声明了指向尚未创建的Car对象的引用。
c=new Car("bruce wong",150);//通过new把有效的引用赋给对象,这引用才会指向内存有效的对象。
c.ShowState();
Console.ReadKey(true);
}
类构造函数
作用:给对象的字段(状态)赋值,它允许在创建对象时创建其状态。
构造函数是类特殊的方法,在使用new关键字创建对象时被间接调用。
注意:构造函数没有返回值(即使是void),它的名字总是和类的名字一样。
默认构造函数
C#提供一个默认的构造函数,需要时你可以重新定义,默认构造函数不接受任何参数。它把新的对象分配到内存和确保所有的字段都被设置为正确的默认值。当你对这些默认值不满意,你可以重新定义默认构造函数。如:
{
this._name="My Car";
this._speed=100;
}
那么每次使用new Car()都会创建状态_name="My Car" _speed=100的Ca上海网站建设r对象。
自定义构造函数
作用:在创建对象时可以直接初始化对象的状态。
{
this._name=name;
this._speed=speed;
}
注意:一旦定义了自定义函数,自带的默认构造函数就自动从类移除(不能用默认构造函数创建对象了)。如果希望使用默认构造函数创建类对象,就必须显式定义默认构造函数。
this关键字的作用
一、提供对当前实例的访问。
可以解决传入参数的名字与类型字段名字相同时产生的作用域歧义。例如:
{
private string name;
public void SetName(string name)
{ this.name=name;}
}
表示把参数name的值赋给本对象(实例)的字段name,this表示本实例。
二、参数传递。使用this进行串联构造函数调用
使用一项名为构造函数链的技术来设计类。当类定义个了多个构造函数时,这个设计模式就会很有用。
由于构造函数通常会检验传入的参数来强制各种业务规则,所以在类的构造函数集合中经常会找到冗余的验证逻辑。
{
public int Speed{get;set;}
public string Name{get;set;}
public Car(){}
public Car(int speed)
{
if(speed>150)
{speed=150;}
this.Speed=speed;
}
上海徐汇企业网站制作>public Car(string name)
{
this.Name=name;
}
public Car(int speed,string name)
{
if(speed>150)
{speed=150;}
this.Speed=speed;
this.Name=name;
}
}
串联构造函数方案:让一个接受最多参数个数的构造函数做“主构造函数”,并实现必须的验证逻辑。其余的构造函数使用this关键字把参数转给主构造函数,并提供其他必需的参数。这样,我们只关心主构造函数的逻辑,而其他构造函数体基本是空的了。
{
public int Speed{get;set;}
public string Name上海徐汇企业网站设计与制作{get;set;}
public Car(){}
public Car(int speed):this(speed,""){}
public Car(string name):this(0,name){}
// 主构造函数
public Car(int speed,string name)
{
if(speed>150) {speed=150;}
this.Speed=speed;
this.Name=name;
}
}
使用this关键字串联构造函数方式可以简化编程任务,类定义更加容易维护、更更加简明。但它不是强制使用的。
串联构造函数的执行顺序:
1、调用构造函数把调用者提供的参数值转发给主构造函数,并提供其他必须的初始化参数值。
2、执行主构造函数。
3、执行调用构造函数体的逻辑。
三、自定义索引器
{
private ArrayList arCar=new ArrayList();
public Car this[int index]
{
get{ return (Car)arCar[index];}
set{arCar.Insert(index,value);}
}
//...
}
static关键字
C#类(或者结构)可以使用static关键字来定义许多静态成员。这些静态成员只能从类级别而不能从对象级别上调用(调用静态成员时不需要创建实例对象)。
例如:
Console c=new Console();
c.WriteLine("Bruce Wong");
//正确!WriteLine是类级别的方法
Console.WriteLine("Bruce Wong");
注意:
一、静态成员只能操作静态数据或调用类的静态成员。而非静态成员可以操作实例数据与静态数据(成员),因为静态成员对类的所有实例都是可用的。
二、CLR把静态数据分配到内存只进行一次,改变静态数据将影响此类的所有实例。
定义静态构造函数
构造函数用于在创建类对象时设置类对象的数据值。如果使用实例级别的构造函数给静态数据赋值,你会惊奇的发现每次新建类对象时静态数据的只都会被重置。所以我们要初始化静态数据最好使用静态构造函数。
静态构造函数是特殊的构造函数,它非常适用于初始化在编译时未知的静态数据的值:
一、一个类(结构)只能定义一个静态构造函数。
二、静态构造函数不允许访问修饰符并且不能接受任何参数。
三、无论创建多少个类实例,静态函数知执行一次。
四、CLR创建类实例或首次调用类静态成员前,CLR会调用静态构造函数。
五、静态构造函数先于实例级别的其他构造函数执行。
静态类:一个类被定义为静态的(使用static关键字修饰),就不能使用new关键字来创建类实例,静态类只能包含用static标记的静态类成员或字段。
PS:项目的应用程序对象(如定义Main()方法的类)通常定义为静态类,以此来确保只包含静态成员且不能被直接创建。如:
{
static void Main(string[] args)
{
//...
}
}
转载于:https://www.cnblogs.com/waw/archive/2011/10/19/2218052.html
C#“.NET研究”类类型相关推荐
- 理论研究类硕士学位论文写作思路
理论研究类学位论文是学术色彩比较浓的论文,是在某一学术问题或理论上具有新的科研成果或创新性的见解而形成的学术专业性较强的论文,或是对某种已知的理论在实际应用或研究中取得新进展的总结而形成的研究论文.理 ...
- Scala类型系统——高级类类型(higher-kinded types)
高级类类型就是使用其他类型构造成为一个新的类型,因此也称为 类型构造器(type constructors).它的语法和高阶函数(higher-order functions)相似,高阶函数就是将其它 ...
- 拷贝构造函数的第一个参数必须是自身类类型的引用
拷贝构造函数的第一个参数必须是自身类类型的引用 拷贝构造函数的定义:如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数 第一个参数必须是自身类类型的引 ...
- 如何设计好词袋模型BoW模型的类类型
回顾过去自己写过的一些词袋模型,比如BoW图像检索Python实战.图像检索(CBIR)三剑客之BoF.VLAD.FV以及Bag of Words cpp实现,这些写出来的要么只是助于自己理解词袋模型 ...
- typeScript面试必备之-通识七:typeScript中的可索引接口(数组,对象)+类类型接口...
可索引接口:数组.对象的约束 (不常用) ts定义数组的方式 var arr:number[]=[2342,235325]var arr1:Array<string>=['111','22 ...
- 无法将类型为“System.__ComObject”的 COM 对象强制转换为类类型“mshtml.HTMLInputElementClass...
环境: VS2008+Win7 64bit 代码: public string Execute(WebBrowser browser, HtmlElement btn) { bool loadFini ...
- 【Debug】— C++ 表达式必须包含类类型
错误一般发生在使用.进行访问时,原因可能在于: 你以为你定义了一个类对象,其实你是声明了一个函数,在编译器看来: 对类对象指针采用.的方式访问其成员变量: 也包括基本类型变量,错误地使用. int a ...
- C#类类型“.NET技术”
类类型是由字段数据(成员变量)和操作字段数据的成员(属性.方法.构造函数.事件等)所构成的自定义类型.其中字段数据表示类实例(对象)的状态. 在C#中,类使用class关键字定义,例如: public ...
- 基类数组存放派生类_永远不要将派生类数组赋值给基类类型指针
C.152: Never assign a pointer to an array of derived class objects to a pointer to its base C.152:永远 ...
最新文章
- 【Discuz】云平台服务:出了点小错,由于站点ID/通信KEY等关键信息丢失导致Discuz!云平台服务出现异常
- CSS——清除浮动的六种解决方案
- 常见的DNS攻击——偷(劫持)、骗(缓存投毒)、打(DDos)
- 做支付遇到的HttpClient大坑(一)
- Hadoop异常 hdfs.DFSClient: DataStreamer
- 索引-python核心技术-pyhui版
- JSON基础 JS操作JSON总结
- 数控镗铣床行业调研报告 - 市场现状分析与发展前景预测
- mysql.sys用户权限_MySQL用户及权限小结
- Linux的shell终端常用快捷键大全
- java中怎么判断返回200_java – 从Spring REST API返回HTTP代码200
- python小星_Python学习【第3篇】:列表魔法
- Bootstrap模态框如何垂直居中?
- 中缀表达式——表达式树
- c语言背包问题非递归算法,数据结构基础 背包问题(一) 之 非递归解
- windows电脑提醒功能,定时打卡
- uilable 上面加子视图图
- http和tcp区别
- 业余草分享面试题,JVM结构、GC工作机制详解
- NLTK(1.2)NLTK简介