类类型是由字段数据(成员变量)和操作字段数据的成员(属性、方法、构造函数、事件等)所构成的自定义类型。其中字段数据表示类实例(对象)的状态。

  在C#中,类使用class关键字定义,例如:

public class Car
{
//Car的字段(状态)
private 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=name;
this._speed=speed;
}
//Car的功能(方法)
public void ShowState()
{Console.WriteLine("Car {0} is going {1} MPH", this._name,this. _speed);}
}

  另:类的字段很少被定义为公开的,为了保护状态数据的完整性,最好把字段数据定义为私有(或者受保护的),然后通过属性对外提供受控制的访问。

  使用new关键字来分配对象

  对象必须使用了new关键字来分配到内存,如果不是用new,而随后尝试使用类变量的话,会收到一个编译错误。

public static void Main(string[] args)
{
//错误,忘记使用new
Car c;
c.Name="Bruce";
}

  正确的例子:

public static void Main(string[] args)
{
//创建Car对象。
Car c;//声明了指向尚未创建的Car对象的引用。
c=new Car("bruce wong",150);//通过new把有效的引用赋给对象,这引用才会指向内存有效的对象。
c.ShowState();
Console.ReadKey(true);
}



  类构造函数

  作用:给对象的字段(状态)赋值,它允许在创建对象时创建其状态。

  构造函数是类特殊的方法,在使用new关键字创建对象时被间接调用。

  注意:构造函数没有返回值(即使是void),它的名字总是和类的名字一样。

  默认构造函数

  C#提供一个默认的构造函数,需要时你可以重新定义,默认构造函数不接受任何参数。它把新的对象分配到内存和确保所有的字段都被设置为正确的默认值。当你对这些默认值不满意,你可以重新定义默认构造函数。如:

public Car()
{
this._name="My Car";
this._speed=100;
}

  那么每次使用new Car()都会创建状态_name="My Car" _speed=100的Car对象。

  自定义构造函数

  作用:在创建对象时可以直接初始化对象的状态。

public Car(string name,int speed)
{
this._name=name;
this._speed=speed;
}

  注意:一旦定义了自定义函数,自带的默认构造函数就自动从类移除(不能用默认构造函数创建对象了)。如果希望使用默认构造函数创建类对象,就必须显式定义默认构造函数。

  this关键字的作用

  一、提供对当前实例的访问。

  可以解决传入参数的名字与类型字段名字相同时产生的作用域歧义。例如:

class Car
{
private string name;
public void SetName(string name)
{ this.name=name;}
}

  表示把参数name的值赋给本对象(实例)的字段name,this表示本实例。

  二、参数传递。使用this进行串联构造函数调用

  使用一项名为构造函数链的技术来设计类。当类定义个了多个构造函数时,这个设计模式就会很有用。

  由于构造函数通常会检验传入的参数来强制各种业务规则,所以在类的构造函数集合中经常会找到冗余的验证逻辑。

class Car
{
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关键字把参数转给主构造函数,并提供其他必需的参数。这样,我们只关心主构造函数的逻辑,而其他构造函数体基本是空的了。

class Car
{
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、执行调用构造函数体的逻辑。

  三、自定义索引器

class CarCollection:IEnumerable
{
private ArrayList arCar=new ArrayList();
public Car this[int index]
{
get{ return (Car)arCar[index];}
set{arCar.Insert(index,value);}
}
//...
}

  static关键字

  C#类(或者结构)可以使用static关键字来定义许多静态成员。这些静态成员只能从类级别而不能从对象级别上调用(调用静态成员时不需要创建实例对象)。

  例如:

//错误,WriteLine是静态成员,是类级别的方法。
Console c=new Console();
c.WriteLine("Bruce Wong");

//正确!WriteLine是类级别的方法
Console.WriteLine("Bruce Wong");

  注意:

  一、静态成员只能操作静态数据或调用类的静态成员。而非静态成员可以操作实例数据与静态数据(成员),因为静态成员对类的所有实例都是可用的。

  二、CLR把静态数据分配到内存只进行一次,改变静态数据将影响此类的所有实例。

  定义静态构造函数

构造函数用于在创建类对象时设置类对象的数据值。如果使用实例级别的构造函数给静态数据赋值,你会惊奇的发现每次新建类对象时静态数据的只都会被重置。所以我们要初始化静态数据最好使用静态构造函数。

静态构造函数是特殊的构造函数,它非常适用于初始化在编译时未知的静态数据的值:

  一、一个类(结构)只能定义一个静态构造函数。

  二、静态构造函数不允许访问修饰符并且不能接受任何参数。

  三、无论创建多少个类实例,静态函数知执行一次。

  四、CLR创建类实例或首次调用类静态成员前,CLR会调用静态构造函数。

  五、静态构造函数先于实例级别的其他构造函数执行。

  静态类:一个类被定义为静态的(使用static关键字修饰),就不能使用new关键字来创建类实例,静态类只能包含用static标记的静态类成员或字段。

  PS:项目的应用程序对象(如定义Main()方法的类)通常定义为静态类,以此来确保只包含静态成员且不能被直接创建。如:

static class Program
{
static void Main(string[] args)
{
//...
}
}

转载于:https://www.cnblogs.com/waw/archive/2011/09/01/2162874.html

一起谈.NET技术,C#类类型相关推荐

  1. 如何设计好词袋模型BoW模型的类类型

    回顾过去自己写过的一些词袋模型,比如BoW图像检索Python实战.图像检索(CBIR)三剑客之BoF.VLAD.FV以及Bag of Words cpp实现,这些写出来的要么只是助于自己理解词袋模型 ...

  2. C++8种常见类类型

    C++8种常见类类型 前言 大部分面向对象开发工作中都应用了以下部分或者全部的基本类别的类: 1.具体类(concrete class) 2.抽象类(abstract class) 3.接口类(int ...

  3. C#类类型“.NET技术”

    类类型是由字段数据(成员变量)和操作字段数据的成员(属性.方法.构造函数.事件等)所构成的自定义类型.其中字段数据表示类实例(对象)的状态. 在C#中,类使用class关键字定义,例如: public ...

  4. 浅谈Hybrid技术的设计与实现【转】

    https://www.cnblogs.com/yexiaochai/p/4921635.html 前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术 ...

  5. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹--落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

  6. 再谈P2P技术:网络拓扑结构、核心技术分析

    随着P2P应用的蓬勃发展,作为P2P应用中核心问题的发现技术除了遵循技术本身的逻辑以外,也受到某些技术的发展趋势.需求趋势的深刻影响. P2P协议概述 P2P打破了传统的Client/Server ( ...

  7. (转)浅谈Hybrid技术的设计与实现

    转载地址:https://www.cnblogs.com/yexiaochai/p/4921635.html 前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hyb ...

  8. C#“.NET研究”类类型

    类类型是由字段数据(成员变量)和操作字段数据的成员(属性.方法.构造函数.事件等)所构成的自定义类型.其中字段数据表示类实例(对象)的状态. 在C#中,类使用class关键字定义,例如: public ...

  9. 技术创业需胆识 谈IT技术人员的创业 (http://www.cnblogs.com/dudu/archive/2007/05/27/761740.html)...

    技术创业需胆识 谈IT技术人员的创业 作者:李立辉 我自己介绍一下:本人96年西点毕业,学的是无线通信,柳传志是我的校友,后来分配到北京巨龙做交换机,98年去了深圳中兴,当时看到中兴日益强大,和华为的 ...

最新文章

  1. 理解卷积神经网络中的输入与输出形状 | 视觉入门
  2. feign调用多个服务_Spring Cloud多个微服务之间调用代码实例
  3. 全球数百万台 Mac 疑似因 Big Sur 更新险酿计算灾难,苹果官方回应来了!
  4. 为何要离开?该怎么离开?今天来谈谈辞职
  5. 厂办大集体改制不签字_许昌二印,磨砂技术被外国觊觎,老工人说烂在肚子里也不外漏...
  6. Flink+Alink,当大数据遇见机器学习! 博文视点Broadview 前天
  7. [转]C#加密解密源码
  8. IOS判断用邮箱登录验证是不是合法的方法
  9. [20190524]DISABLE TABLE LOCK(12c).txt
  10. Firefox必备的24款web开发插件
  11. C语言按位取反~的简单理解
  12. PPT小图标库及配色网站推荐
  13. SCI收录期刊——遥感学科
  14. 制作u盘winpe启动盘_u盘启动盘制作工具教程
  15. 《我的团长我的团》 - 观后感
  16. 为什么传统的验证码不再安全
  17. MAC安装chromedriver碰到的问题
  18. Systrace 基础知识 - 锁竞争解读
  19. 西安电子科技大学光学工程/电子信息(专业课代码851)考研经验分享
  20. 【Go】Go语言中的下划线

热门文章

  1. 银联支付h5返回商户的地址是post的吗?_php实现银联商务公众号+服务窗支付
  2. new 一个结构体数组_C语言结构体到底占多少内存?简单!一文助你解决结构体内存问题...
  3. elasticsearch6 php,elasticsearch 6.x php-client
  4. android中接口的作用是什么意思,Android为什么要序列化
  5. GitHub上如何创建文件夹
  6. 中兴myos和鸿蒙,继华为鸿蒙系统以后!中兴再次发布新系统MyOS:可媲美苹果
  7. tomcat修改http长度限制_设置tomcat nginx上传文件大小限制
  8. igmp是哪个层协议_【干货】IGMPv1协议闲聊
  9. centos安装mysql5.6系统崩溃_CentOS中安装MySQL5.6报错的解决方法
  10. python与matlab哪个更容易学-详解python和matlab的优势与区别