C#类类型“.NET技术”

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

  在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(){}
上海网站建设="color: #008000;">//自定义构造函数
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上海企业网站设计与制作="color: #000000;"> (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/10/13/2210665.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux ext4 格式化工具,ext4格式化软件 mkfs.ext4 快速格式化

如何在 Windows 下访问 ext4 格式的硬盘你好,介绍两个能在 Windows 下读取ext4分区的软件。第一个是 Ext2Read。它能查看 ext2/3/4 分区并从中拷贝文件和目录,支持 LVM2 和 EXT4 extent ,以及递归拷贝整个目录。第二个是本站之前介绍过的 Ext…

信心满满的去面算法工程师,竟然凉了...

我是小A,一个没能当成算法工程师的菜鸡Java工程师,内心却等着上AI这趟车。去年正是人工智能火热的时候,看着各种高薪招聘,我沉寂很久的内心也火热起来了。但是想归想,我内心还是有很多纠结的。自己已经很多年没有碰过高…

使用 Redis Stream 实现消息队列

使用 Redis Stream 实现消息队列IntroRedis 5.0 中增加了 Stream 的支持,利用 Stream 我们可以实现可靠的消息队列,并且支持一个消息被多个消费者所消费,可以很好的实现消息队列Simple Usage首先我们来看一个简单版本的 Stream 使用&#xff…

用linux命令通常做什么,如何知道你在 Linux 里最常使用的几个命令?

不知道大家自接触 Linux 以来,都使用过哪些命令,其中最常用的命令是什么?我最常用的命令之一是 sudo ,因为我每天都在使用它在 Linux 上安装、更新、删除软件包以及其它各种需要超级用户权限的操作。那么你知道你自己最经常使用的…

资料分享 | python机器学习教程分享来袭

小天从大学开始,便开启资料收集功能。近几年以AlphaGo为契机,人工智能进入新的发展阶段,再加上日常的深入研究,小天收集整理了丰富的机器学习资料,内容涵盖“机器学习视频”,“机器学习教程”等。截止到今天…

Autofac框架初识与应用

一、前言这上一篇中,主要讲述了什么是IoC容器,以及了解到它是DI构造函注入的框架,它管理着依赖项的生命周期以及映射关系,同时也介绍实践了在ASP.Net Core中,默认提供的内置IoC容器,以及它的实例注册方式和相应的生命周…

聊一聊数据导出那些事

前言 数据导出,这可以说是一个随处可见的需求,大部分管理平台,报表系统都会有这个需求。对于这个需求,不少系统会做限制,只能从系统导出几千或几万的数据,再多的话就要提申请,经过层层审批&…

如何黑掉一台根本不联网的电脑

一直以来,拿到一台电脑上的密钥,方法无非有以下三种:1、直接拿到这台电脑,然后输入木马病毒进行盗取。(此种略微LowB的方法风险在于:如果被电脑主人“捉奸在床”,愤而报警,则需要黑客…

通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解

首先感谢张队geffzhang公众号转发了上一篇文章,希望广大.neter多多推广dapr,让云原生更快更好的在.net这片土地上落地生根。 书接上回通过Dapr实现一个简单的基于.net的微服务电商系统,今天来分享一下这套电商demo的通讯部分到底是如何工作的…

windows下整合tomcat和nginx

tomcat自带的apache服务器对于并发请求的处理能力比较差,并且耗费资源很大,而nginx这方便却很强悍,以下是在windows下整合tomcat和nginx的过程。 1.准备工作 下载tomcat(http://tomcat.apache.org/download-70.cgi),下…

从飞机上看下雨是这样子,太震撼了!

不同的角度,不一样的世界!来源:环球顶尖摄影版权归原作者所有,转载仅供学习使用,不用于任何商业用途,如有侵权请留言联系删除,感谢合作。数据与算法之美用数据解决不可能长按扫码关注

linux基础 linhaifeng,Linux基础之命令练习Day2(示例代码)

作业一:1) 新建用户natasha,uid为1000,gid为555,备注信息为“master”2) 修改natasha用户的家目录为/Natasha3) 查看用户信息配置文件的最后一行4) 为natasha用户设置密码“123”5) 查看用户密码配置文件的最后一行6) 将natasha用…

NET问答: 为什么 null + true = string 呢?

咨询区 Javed Akram:请问 null true 为什么是一个 string 类型的 True,代码如下:static void Main(string[] args){string b null true;Console.WriteLine(b);}谁知道这背后的原理?回答区 JaredPar:这是因为你一旦引…

华为21级程序员月薪曝光:270k封神!众网友直呼长见识……

如果一个人的薪水是每月几万,估计很多人都会认为很高,而能拿到这么高薪水的人一定是一个非常优秀人。最近,一名HR在互联网上发布了一个内容。该公司表示在招聘简历中找到华为高管的简历,简历的级别为21,月薪为27万&…

做移动互联网App,你的测试用例足够吗?

我在面试测试工程师时,经常问到的一个问题是“给出Word另存为这个功能的测试用例”。除开基本的测试用例外,考虑到各种异常情况,例如内存已满、硬盘空间不足是非常重要的。但是针对移动互联网App来说,情况还要复杂的多。一个重要原…

linux 手机 wlan信号桥,手机WLAN信号桥是什么?WLAN信号的作用和使用方法

什么是寒假必备?温暖的被窝和wifi绝对是不能少的。今天就给大家介绍一下和手机WIFI有关的WLAN信号桥的知识,让大家在寒假享受WIFI又多了一种选择。感兴趣的可以一起来看看。一、什么是WLAN信号桥?WLAN信号桥简单的来说就是手机连接一个WiFi后…

.NET 6 HotReload的试用

.net v6.0.0-preview.3的HotReload我是极喜欢的,因为之前有这样的需求——状态不丢,上下文不丢。为了验证,安装完.net 6 preview 3后,新建一个webapi项目,写了如下简单代码:using Microsoft.AspNetCore.Mvc…

如何撬动机器学习的冰山一角?

目前,人工智能的应用日渐广泛。而作为人工智能核心的机器学习,是一门多领域的交叉学科,专门研究计算机模拟或实现人类学习行为的方法,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。简单来说&a…

linux 下运行libnids,libnids出错

2017/03/28因为246上一般用的东西都比较多了,就直接使用了这部分。但当初编译的时候也不是我弄得。今天想试一下libnids的编程。编译错误在网上查了下,说是版本不够的原因,那我也不能重新编译了,毕竟还有别人说不定用的好好的。gc…

服务治理治什么,10张图告诉你答案

凌晨四点被公司的监控告警叫醒了,告警的原因是生产环境跑批任务发生故障。即刻起床处理故障,但还是花了不少时间才解决。这次故障是一次数据校验的跑批任务,校验前面跑批任务的数据是否正确。幸运的是,之前的核心任务已经完成&…