【整理】C#2.0特性之局部类、空属类型和静态类
局部类
在没有局部类出现之前,我们采用下面方法定义类:
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class App
{
public void Foo()
{
//
![](/assets/blank.gif)
![](/assets/blank.gif)
}
public void Bar()
{
//
}
}
有了局部类之后,可将上述类拆分成如下两个局部类
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public partial class App
{
public void Foo()
{
//
![](/assets/blank.gif)
![](/assets/blank.gif)
}
}
public partial class App
{
public void Bar()
{
//
}
}
局部类型简介
1.局部类型允许我们将一个类型(类、结构体或接口)分成多个部分,分别是现在几个不同的cs文件中
2.局部类型实用于以下两种情况
第一 类型特别大,不宜放在一个类中实现
第二 一个类中的一部分代码是由自动工具生成的代码,不宜与我们编写的代码放到一起
3.局部类型是一个纯语言层的编译处理,不影响任何执行机制,IL在编译时会自动将局部类合称为一个完整的类。
局部类型的限制
1.局部类型只适用于类、接口和结构体,不支持委托和枚举。
2.同一个类型的各个部分都必须有修饰符partial
3.使用局部类时,一个类的各个部分必须放在相同的命名空间
4.一个类的各个部分必须被同时编译。换言之,就是C#不允许对一个类的各个部分单独编译。
局部类型的几个注意点
1.关键字partial只有和class、interface与struct放在一起的时候才有关键字的意义。因此partial的引入不会影响代码中现有的名称为partial的变量。
2.局部类型的个数并非必须是两个或两个以上,也可以是单独一个,不过这样做没意义。
3.局部类型的各个部分一般是放在不同的cs文件中的,但是C#也允许放在同一个cs文件中
局部类上应用特性
局部类的特性具有"累加"效应,举例如下:
[Attr1,Attr2("Hello")]
partial class A{......}
[Attr3,Attr2("GoodBye")]
partial class A{......}
相当于如下代码:
[Attr1,Attr2("Hello"),Attr3,Attr2("GoodBye")]
class A{......}
局部类上的访问修饰符
1.一个类型各个部分上的访问保护修饰符必须维持一致
2.如果一个类的某个部分上使用了abstract,那么这个类将被视为抽象类
3.如果一个类的某个部分上使用了sealed,那么这个类将被视为密封类
4.一个类的各个部分不能使用相互矛盾的修饰符,比如一个是abstract,一个是sealed
局部类型的基类和接口
1.一个类的各个部分的基类必须相同。因为C#不允许类的多重继承
2.局部类型上的接口具有"累加"效应,换言之如下代码
partial class A:IA,IB{...}
partial class A:IC{...}
partial class A:IA,IB{...}
等价于
class A:IA,IB,IC{...}
空属类型
空属类型简介
空属类型允许一个值类型具有"空值"意义,从而方便很多场合的运算,如数据库中的空字段。
空属类型本身就是一个值类型
空属类型演示:
int i = 123;
int? x = i; //等价于System.Nullable<int> x = new System.Nullable<int>(i);
double? y = x;
int? z = (int?)y;//空属类型支持强制转换
int? x = null;//同下面是不一样的,注意一下就是了
object obj=null;//表示obj不指向托管堆的任何内存空间,ojb的引用指针为0,即无效指针。
空属类型四则运算
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
using System;
using System.Collections.Generic;
using System.Text;
namespace Demo2
{
class Program
{
static void Main(string[] args)
{
int? x = 123;
int? y = null;
//加法
int? z0 = x + y;
Console.WriteLine(string.Format("x+y={0}", z0));
//减法
int? z1 = x - y;
Console.WriteLine(string.Format("x-y={0}", z1));
//乘法
int? z2 = x * y;
Console.WriteLine(string.Format("x*y={0}", z2));
//除法
int? z3 = x / y;
Console.WriteLine(string.Format("x/y={0}", z3));
Console.Read();
}
}
}
运算结果
值类型与空属类型下Equals的特点
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
using System;
using System.Collections.Generic;
using System.Text;
namespace Demo2
{
class Program
{
static void Main(string[] args)
{
int i = 10;
int? x = 10;
//x.Equals(i)的时候其中的i做了隐式转换
//等价于x.Equals(new System.Nullable<int>(i))
Console.WriteLine(x.Equals(i));
Console.Read();
}
}
}
演示结果
空属类型的几个注意点
1.空属类型实际上是一个泛型类型System.Nullable<T>。空属类型的基础类型就是泛型类型System.Nullable<T>中的T,其中T必须为值类型。
2.空属类型如果值不为空,可以使用同基础类型相同的运算,如加、减、乘和除操作
3.空属类型的HasValue用来判断空属类型是否为空,如果不为空,则可以通过Value属性获取它的基础类型的值。
静态类
静态类简介
静态类是只包含静态成员的类型,它既不能实例化,也不能被继承。它相当于一个sealed abstract类
静态类演示
static class MyUtility
{
public const int data;
public static void Main()
{...}
}
静态类的几个注意点
静态类不能有实例构造器。
静态类不能有实例成员。
静态类上不能使用sealed和abstract关键字。
静态类默认继承自System.Object类,不能显式的指定任何其他基类。
静态类不能指定任何借口实现。
静态类的成员不能有protected或protected internal访问修饰符。
转载于:https://www.cnblogs.com/jewleo/archive/2009/06/08/06081808_1.html
【整理】C#2.0特性之局部类、空属类型和静态类相关推荐
- Redis4.0、5.0、6.0、7.0特性整理(持续更新)
最近研究研究新版本redis的新特性,网上查了查资料,这里记录一下. 0. Redis的版本迭代和里程碑 Redis从发布至今,已经有十余年的时光了,一直遵循着自己的命名规则: 版本号第二位如果是奇数 ...
- C++ 学习笔记之(19) new、delete表达式、RTTI(运行时类型识别)、枚举、类成员指针、嵌套类、局部类、位域、volatile、extern C
C++ 学习笔记之(19) new.delete表达式.RTTI(运行时类型识别).枚举.类成员指针.嵌套类.局部类.位域.volatile.extern C C++ 学习笔记之(19) new.de ...
- 1024 程序员节专题论坛来袭,权威解读 MindSpore、CANN 5.0 特性和 HCIA MDC 开发者认证...
"授人以鱼不如授人以渔",一句古话中蕴含的发展真理,我们将其套用到如今炽手可热的 AI 领域之上会发现无比适用.2018 年,华为提出了普惠 AI 的概念,降低 AI 开发门槛,让 ...
- C++知识点杂记3——局部类、位域、volatile、链接指示、枚举、定位new
一.局部类 局部类就是定义在函数内部的类,因为作用域只是在函数内部,所以,所有成员定义必须完整,在Qt的源码中有几处使用了局部类,见博客https://blog.csdn.net/Master_Cui ...
- .NET Core 2.0 特性介绍和使用指南
前言 这一篇会比较长,介绍了.NET Core 2.0新特性.工具支持及系统生态,现状及未来计划,可以作为一门技术的概述来读,也可以作为学习路径.提纲来用. 对于.NET Core 2.0的发布介绍, ...
- C++模板类嵌套类内部类局部类的区别
模板类就是将类定义成模板的形式. C++中好像不区分内部类与嵌套类两个名词. 内部类与嵌套类都是指在类中定义类. 局部类是指在函数中定义类. (c++不能在函数中定义函数(python可以).c++在 ...
- 【Java 面向对象】基础、Java程序的内存划分、嵌套类(内部类、静态嵌套类)、局部类、接口的升级问题(默认方法、静态方法)、instanceof
面向对象 对象的内存 复杂对象的内存 对象数组的内存 思考:方法存储在哪里? Java程序的内存划分 this.super 注解(Annotation) 访问控制(Access Control) to ...
- Java方法工厂,接口,常用日期类Date面向对象,匿名内部类局部类
抽象 1抽象类不能生成对象 2类中包含抽象函数,这个类必须声明为抽象类 3抽象类不一定有抽象方法.有抽象方法必须是抽象类 4若全是抽象方法,则为接口 接口 比如 interface action{vo ...
- .NET Core 3.0特性初探:C# 8、WPF、Windows Forms、EF Core
.NET Core的下一个主要版本最近进入了预览阶段,.NET Core 3.0将支持使用Windows Presentation Foundation (WPF).Windows Forms(Win ...
最新文章
- 技术团队,你欠了一屁股债你造吗?
- 关于集体生活和个人生活的思考
- oracle 赋值到cmd,CMD操作oracle数据导库过程图解
- Dapr + .NET 实战(九)本地调试
- JDK 9:模块系统状态的重点
- 获取iOS任意线程调用堆栈(二)符号化理论:Mach-o文件结构
- php 查看扩展 代码,[扩展推荐] 使用 PHP Insights 在终端查看 PHP 项目代码质量
- 软件架构设计_软件架构设计的三个维度,软件架构师需要知道的点,了解一下吧...
- Javascript的数组操作(笔记)
- mysql 安装后大_Window下MySql 5.6 安装后内存占用很高的问题
- Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
- A-AUTOバッチ管理ツール(HOLD之后,如何再次启动)
- QQ资料清空php源码,[php源码][QQ玫瑰小镇]一键收铲种,php网页版
- 学习.net设计规范记录
- 自定义getElementByClass
- RFID天线—1.阻抗测量方法
- 无线射频专题《IEEE 802.11协议讲解4@可调参数,性能与兼容性考虑》
- POI Excel设置列宽
- 【他山之石】康师傅的本地化策略
- 【Lv1-Lesson004】Imperative Sentences
热门文章
- Eclipse中修改SVN地址
- 禁用行、列、单元格单元格编辑
- 赤橙黄绿青蓝紫html颜色,赤橙黄绿青蓝紫,超完整颜色词汇大全
- 判断参数大于0_能做条件判断的文本函数
- 液晶显示屏的C语言编码,单片机液晶汉字显示c语言程序
- Hibernate→ORM、简介、第一个Hibernate实现、核心XML配置、Hibernate执行流程、操作数据库对象session、事务、映射XML配置、单例CRUD、get与load
- LeetCode刷题目录
- c#endread怎么打印出来_C#中如何打印出整个PANEL的内容?
- C++中如何读取一个数的位数_初中数学:近似数和平均数知识点总结及练习
- Unity3D基础36:场景自适应与场景切换