C#中不同类的类型

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

  在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)

  {

  //...

  }}

时间: 2024-12-30 08:25:42

C#中不同类的类型的相关文章

hashcode-java中不同类的对象的引用有什么不同呢?

问题描述 java中不同类的对象的引用有什么不同呢? 比如,为什么A a不能指向一个B对象呢?小白,求不打脸= = 下面是我用Boy和Student类做的两个测试,打印了hashcode()值,为什么感觉一直在重复,而且感觉有规律的的样子 st1的引用地址725211281 st2的引用地址1656303042 st3的引用地址1802194480 st4的引用地址1373268072 st5的引用地址1509731795 st6的引用地址1542989260 st7的引用地址7971648 s

CAML中比较日期时间类型

在做Sharepoint的列表查询的时候,经常要用到CAML,今天我在做一个工作流授权列表的查询,里面要求根据人员.工作流名称.授权开始时间和授权结束时间找到对应的授权人,没有找到就返回本人.使用CAML QueryBuilder生成了查询,然后修改了其中的对应的变量,进行查询.结果发现查询结果有问题.原来是在CAML中使用的日期类型的表示必须是一种国内很少用的特殊的格式,,形如"2009-04-09T15:11:20Z"网上找了一下,使用SPUtility.CreateISO8601

java类的问题-java编写从10000到99999种数字中,找到AABCC类型的所有数字

问题描述 java编写从10000到99999种数字中,找到AABCC类型的所有数字 java编写从10000到99999种数字中,找到AABCC类型的所有数字的程序.求指点 解决方案 我不认为本题有必要去"找到"这些类型的数字,我们用程序去生成的效率更高更方便. for(int i=1;i<10;i++){ for(int j=1;j<10;i++){ for(int k=1;k<10;k++){ //如果要求A,B,C不相同,加上 //if(i==j||i==k|

SQL2005-SSIS 对同一个文件中的不同行类型做不同处理

sql2005 SQL2005-SSIS 对同一个文件中的不同行类型做不同处理 某些时候数据来源是文本文件,有时候我们经常看到包含主/细.父/子记录在同一个文本文件中,这在DTS中是非常难以处理的,但这种情况在SSIS中有所改变在本文中,我将制造这样一个例子让你明白如何处理这种类型的要求 大体的数据流构造像下面这样,我会仔细加以讲解:  下面这个图显示了我们要处理的数据来源的文本格式,其中含有"M"的为主行,含有"D"的为子行  我们将建立一个flat file c

C#中的基元类型

这篇文章我想复习下C#中的基元类型.虽然搞清楚基元类型的知识并不会是你工作的必要条件,但做为一个搞技术的人来说还是非常有必要的.起码可以对付有些显得比较BT的面试题,哈哈! 关于什么是基元类型,我想并不是每一位开发者都清楚的,有部分的朋友只知道怎么在工作中应用它(例如int,string).如果一个编程基础比较扎实的朋友来说当然不在话下,就不说别人,拿我自己来说,编程三年多,我都不太关心什么是基元类型,它有什么用,其实不知道这些对工作也不会产生决定性的影响.如果你不知道基类型的概念,但会用int

Excel中四种常用类型图表的创建方法

Excel中四种常用类型图表的创建方法   上图中的四种不同类型的图表都是根据同一个表格创建的,也就是说,这四种常用的图表是没有特定的数据限制的. 一.创建柱形图 1.将光标定位到要创建图表的数据区域内,然后切换到"插入"选项卡,在"图表"组的"柱形图"下选择一种需要的柱形图类型进行创建. 2.现在工作表中已经插入了一个选择的柱形图. 二.创建条形图 1.将光标定位到表格区域内,然后选择一个合适的条形图类型进行创建. 2.现在工作表中已经插入了一

Java 8中的Optional 类型与 Kotlin 中的可空类型

Java 8中的Optional 类型与 Kotlin 中的可空类型 在 Java 8中,我们可以使用 Optional 类型来表达可空的类型. package com.easy.kotlin; import java.util.Optional; import static java.lang.System.out; /** * Optional.ofNullable - 允许传递为 null 参数 * Optional.of - 如果传递的参数是 null,抛出异常 NullPointerE

java中不能创建fileoutptstream 类型的对象

问题描述 java中不能创建fileoutptstream 类型的对象 import java.io.*; public class FileOutputStream { public static void main(String[] args) { //定义一个FileOutputStream 类型的变量 FileOutputStream fo = null; try{ //利用绝对路径创建一个FileOutputStream类型的对象 fo = new FileOutputStream (

关于HTML中input标签checkbox类型的疑问

问题描述 关于HTML中input标签checkbox类型的疑问 首先产生疑问的由来是我之前自己写的代码,需要实现选中删除的原理,可能是看别人的,也可能是自己灵光一现,实现了这个功能,但是如今回头看看又不懂了,所以在这里做个死记硬背的总结,也期待一个大神来开导我一下. 在form表单中代码是这样的(因为尖括号会被屏蔽所以用中文中括号代替) [input type='checkbox' name='eletment[ ] ' value='$id'] 于是我们用php把$id的变为数据库里相对应的