惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
Cisco Talos Blog
Cisco Talos Blog
Y
Y Combinator Blog
罗磊的独立博客
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
GbyAI
GbyAI
The GitHub Blog
The GitHub Blog
S
SegmentFault 最新的问题
J
Java Code Geeks
C
CXSECURITY Database RSS Feed - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园 - 聂微东
B
Blog RSS Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
P
Privacy & Cybersecurity Law Blog
L
LangChain Blog
L
LINUX DO - 热门话题
Hugging Face - Blog
Hugging Face - Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Privacy International News Feed
F
Full Disclosure
S
Schneier on Security
T
Tenable Blog
量子位
NISL@THU
NISL@THU
Latest news
Latest news
V
Visual Studio Blog
C
Check Point Blog
aimingoo的专栏
aimingoo的专栏
博客园_首页
K
Kaspersky official blog
L
Lohrmann on Cybersecurity
美团技术团队
P
Proofpoint News Feed
P
Palo Alto Networks Blog
Spread Privacy
Spread Privacy
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
人人都是产品经理
人人都是产品经理
The Hacker News
The Hacker News
AWS News Blog
AWS News Blog
S
Securelist
The Register - Security
The Register - Security
G
GRAHAM CLULEY
Project Zero
Project Zero
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
Engineering at Meta
Engineering at Meta
C
Cisco Blogs

博客园 - Siko

Sql Server中的日期和时间函数 在html中显示PHP源文件的几种方法 neebaa依然缺人 如何才能成为一名真正的Web程序员 zt ASP常用函数表 - Siko - 博客园 关于弹窗 - Siko - 博客园 真正的大牛(zz) win 2003 server的一些优化设置 快速关闭Win2003的三种方法 生成静态页大全[ASP/PHP/ASPX] 收集自落伍论坛 ASP学习:错误80004005信息处理方法 ASP之对象总结 ASP中各种数据库连接代码 Temporary ASP.NET Files 下的不能生成dll文件。。。。 关于.NET 访问Oracle数据库 SQL查询语句使用 The Design of Sites: Patterns, Principles, and Processes for Crafting a Customer-Centered Web Experience SqlDataAdapter使用存储过程不能使用参数? IIS 错误代码大汇总
C#2.0相关
Siko · 2006-04-22 · via 博客园 - Siko

没有局部类型的时候(C# 1.0)

class App
{
   public void Foo(){...}
   ...
   public void Bar(){...}
   ...
}

有了局部类型之后(C# 2.0)

partial class App
{
   public void Foo()
   {...}
   ...
}
partial class App
{
   public void Bar()
   {...}
   ...
}

局部类型简介

局部类型允许我们将一个类型(类、结构或者接口)分成几个部分,分别实现在几个不同的.cs文件中。

局部类型适用于以下情况:
- 类型特别大,不宜放在一个文件中实现;
- 一个类型中一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。

局部类型是一个纯语言层的编译处理,不影响任何执行机制 - 事实上C#编译器在编译的时候仍会将各个部分的局部类型可并成一个完整的类。

局部类型的一些限制

局部类型只适用于类、结构、或接口,不支持委托或枚举。

同一个类型的各个部分必须都有修饰符partial。

使用局部类型时,一个类型的各个部分必须位于相同的名称空间中。

一个类型的各个部分必须被同时编译。换言之,C#不支持先编译一个类型的某些部分,然后再编译一个类型的某些部分。

局部类型的几个特点

关键字partial是一个上下文关键字,只有和class、struct、interface放在一起时才有关键字的含义。因此partial的引入不会影响现有代码中名称为partial的变量。

局部类型的个数并不必须为2个或2个以上,也可以为1个,虽然这时候已经没有“局部”的必要。

局部类型的各个部分一般是分开放在几个不同的.cs文件中,但C#编译器允许我们将它们放在同一个.cs文件中。

在局部类型上应用特性

局部类型上的特性具有“累加”效应。换言之,如下的代码:

[Attr1,Attr2("hello")]
partial class A{}

[Attr3,Attr2("goodbye")]
partial class A{}

相当于在A类上应用了如下特性:
[Attr1,Attr2("hello"),Attr3,Attr2("goodbye")]
partial class A{}

局部类型上的修饰符

一个类型的各个部分上的访问保护修饰符必须维持一致性。

如果一个类型有一个部分使用了abstract修饰符,那么整个类将被视为抽象类。

如果一个类型有一个部分使用了sealed修饰符号, 那么整个类将被视为密封类。

一个类的各个部分不能使用相互矛盾的修饰符,比如不能在一个部分上使用abstract,又在另一个部分上使用sealed。

局部类型的基类或接口

一个类型的各个部分上指定的基类必须一致。某些部分可以不指定基类,但如果指定,则必须相同。

局部类型上的接口具有“累加”效应,换言之,如下的代码:

partial class C:IA,IB{...}
partial class C:IC{...}
partial class C:IA,IB{...}

相当于如下代码:

class C:IA,IB,IC{...}

空属类型允许一个值类型具有“空值”意义,从而方便很多场合的运算,如数据库中的空字段。

空值类型演示:

int i = 123;
int? x = i;
double? y = x;
int? z = (int?)y;

空属类型的几个注意点

空属类型实际上是一个泛型类型
System.Nullable。空属类型的基础类型就是System.Nullable的类型参数,其中T必须为值类型。

空属类型如果值不为空,可以运用同样的基础类型所具有的运算,如:+、 -、 *、 /

空属类型的HasValue属性用来判断类型是否为空,如果不为空,则可以通过Value属性来获取它的基础类型的值。

静态类只用于包含静态成员的类型,它既不能实例化,也不能被继承。它相当于一个sealed abstract类。

static class MyUtility
{
   public const int data;
   public static void Foo()
   {
    ...
   }
}

静态类的几个注意点

静态类不能有实例构造器。
静态类不能有任何实例成员。
静态类不能使用abstract或sealed修饰符。
静态类默认继承自System.Object根类,不能显式指定任何其他基类。
静态类不能指定任何接口实现。
静态类的成员不能有protected或protected internal访问保护修饰符。

总结

局部类型是一个纯语言层的编译处理,不影响任何执行机制 - 事实上,C#编译器在编译的时候仍会将各个部分的局部类型合并成一个完整的类。

空属类型允许一个值类型具有“空值”意义,从而方便很多场合的运算,如数据库空字段,空属类型实际上是一个泛型类System.Nullable。

静态类只用语包含景泰成员的类型,他既不能实例化,也不能被继承。它相当于一个sealed abstract类。