【整理】C#2.0特性之局部类、空属类型和静态类
局部类
在没有局部类出现之前,我们采用下面方法定义类:
public class App
{
public void Foo()
{
//
}
public void Bar()
{
//
}
}
有了局部类之后,可将上述类拆分成如下两个局部类
public partial class App
{
public void Foo()
{
//
}
}
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,即无效指针。
空属类型四则运算
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的特点
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 ...
最新文章
- 三星 arm9 linux,基于arm9内核三星s3c2410平台下linux四键按键驱动程序
- 漫画 | 你看的每一篇Nature论文,都是这样出炉的!
- Moved to Google Blogger: hongstudios.blogspot.com
- pooled-jms_Hibernate隐藏的宝石:pooled-lo优化器
- python实现猜数字小游戏
- python pandas csv getitem,访问.csv文件时使用Pandas获取KeyError
- OmniGraffle 7 Pro全新推出!V7.18.3(204.9.0)正式版 支持M1
- java如何看手机型号,基于JAVA代码 获取手机基本信息(本机号码,SDK版本,系统版本,手机型号)...
- html视频标签video旋转播放方向,video视频文件有方向怎么处理?
- 电话程控交换机 配置
- medini analyze软件下载安装使用试用购买
- Photoshop - 高反差保留
- chmod 777 修改文件权限
- 唱歌发声的基础知识与训练方法
- qmc5883磁力计指南针 linux驱动
- Linux下使用云笔记及OneNote
- 浙江移动物联网应用开放平台(免费使用)
- 菜鸟在Linux零碎中安置Oracle 11G
- opencv生成单位矩阵
- RISC-V架构解析
热门文章
- Tomcat启动时日志报 dcom.sun.manager.jmxremote 异常导致无法正常启动使用
- div背景图自适应占满
- 【Codeforces	1426	D】Non-zero Segments,贪心,前缀和,数组子段统计
- Codeforces Round #666 (Div. 2)C - Multiples of Length(错位相减)
- C++文本处理造轮子
- 共享打印机从网络访问此计算机,win7连接共享打印机时出现,你没有权限访问网络资源...
- git 分支管理策略(7)
- 批量处理word文件内容_word文档批量处理大师
- 证书 vivo_vivo秦飞:真假5G不存在 NSA模式手机未来仍可用
- hget如何获取多个value_《深入微服务》之 如何给老婆解释什么是微服务的基础框架SpringBoot?...