C#“.NET研究”类类型

简介:   类类型是由字段数据(成员变量)和操作字段数据的成员(属性、方法、构造函数、事件等)所构成的自定义类型。其中字段数据表示类实例(对象)的状态。  在C#中,类使用class关键字定义,例如:public class Car{//Car的字段(状态) private上海闵行企业网站制作...

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

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

 
 
public class Car
{
// 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,而随后尝试使用类变量的话,会收到一个编译错误。

 
 
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的Ca上海网站建设r对象。

  自定义构造函数

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

 
 
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)
{
// ...
}
}
目录
相关文章
|
10月前
|
存储 算法 安全
如何控制上网行为——基于 C# 实现布隆过滤器算法的上网行为管控策略研究与实践解析
在数字化办公生态系统中,企业对员工网络行为的精细化管理已成为保障网络安全、提升组织效能的核心命题。如何在有效防范恶意网站访问、数据泄露风险的同时,避免过度管控对正常业务运作的负面影响,构成了企业网络安全领域的重要研究方向。在此背景下,数据结构与算法作为底层技术支撑,其重要性愈发凸显。本文将以布隆过滤器算法为研究对象,基于 C# 编程语言开展理论分析与工程实践,系统探讨该算法在企业上网行为管理中的应用范式。
273 8
|
10月前
|
存储 监控 算法
基于 C# 的局域网计算机监控系统文件变更实时监测算法设计与实现研究
本文介绍了一种基于C#语言的局域网文件变更监控算法,通过事件驱动与批处理机制结合,实现高效、低负载的文件系统实时监控。核心内容涵盖监控机制选择(如事件触发机制)、数据结构设计(如监控文件列表、事件队列)及批处理优化策略。文章详细解析了C#实现的核心代码,并提出性能优化与可靠性保障措施,包括批量处理、事件过滤和异步处理等技术。最后,探讨了该算法在企业数据安全监控、文件同步备份等场景的应用潜力,以及未来向智能化扩展的方向,如文件内容分析、智能告警机制和分布式监控架构。
247 3
|
10月前
|
存储 监控 算法
局域网上网记录监控的 C# 基数树算法高效检索方案研究
在企业网络管理与信息安全领域,局域网上网记录监控是维护网络安全、规范网络行为的关键举措。随着企业网络数据量呈指数级增长,如何高效存储和检索上网记录数据成为亟待解决的核心问题。基数树(Trie 树)作为一种独特的数据结构,凭借其在字符串处理方面的卓越性能,为局域网上网记录监控提供了创新的解决方案。本文将深入剖析基数树算法的原理,并通过 C# 语言实现的代码示例,阐述其在局域网上网记录监控场景中的具体应用。
213 7
|
JSON C# 数据格式
【Azure Function】C#独立工作模式下参数类型 ServiceBusReceivedMessage 无法正常工作
Cannot convert input parameter 'message' to type 'Azure.Messaging.ServiceBus.ServiceBusReceivedMessage' from type 'System.String'.
274 73
|
JSON 安全 API
.net 自定义日志类
在.NET中,创建自定义日志类有助于更好地管理日志信息。示例展示了如何创建、配置和使用日志记录功能,包括写入日志文件、设置日志级别、格式化消息等。注意事项涵盖时间戳、日志级别、JSON序列化、线程安全、日志格式、文件处理及示例使用。请根据需求调整代码。
244 13
|
人工智能 机器人
D1net阅闻 | 谷歌DeepMind研究发现LLM新特性
D1net阅闻 | 谷歌DeepMind研究发现LLM新特性
|
JSON 数据格式
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
444 2
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
218 3
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
347 2
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
281 0