生命如此短暂,掌握技艺却要如此长久

风流不在谈锋胜, 袖手无言味最长。**_** 莫言大道人难得,自是功夫不到头。

导航

统计

公告

2006年1月9日 #

使用sealed声明密封类(sealed class)如何对于提高性能有帮助

如果基类(base class)B中定义了虚方法,而sealed class S从B类衍生。对于一个类型为S的名为s的变量调用虚方法的代码,编译器可以确信s一定是类型为S的。但是如果类S实际上没有被sealed,则这个变量s可能是类S的衍生类的实例而这个衍生类同时又重写(override)了该虚方法。这时为了正确性,编译器必须以虚方法调用的方式执行该代码。这比直接执行的成本要高。C#中string类型就用的类似方法,实例化时不用new关键字。
Class B
{}
sealed Class S
{virtual void Do(){...}}
s.Do();//如果S不是sealed的,那么s可能是S的衍生类的对象
如下:
Class S
{virtual void Do(){...}}
Class C
{override void Do(){...}}
C s=new C.C();/*这个s也是S类型的,从而编译器必须以虚方法调用的方式执行该代码。这比直接执行的成本要高。*/

另外一个例子是attribute属性类。有一个FxCop的规则(Avoid unsealed attributes)专门检查定义的属性类是不是sealed。除了上面谈及的原因,还特别提到Attribute.GetCustomAttributeAPI. 其解释如下:The .NET Framework class library provides methods for retrieving custom attributes. These methods search the attribute inheritance hierarchy by default; for example System.Attribute.GetCustomAttribute searches for the specified attribute type, or any attribute type that extends the specified attribute type. Sealing the attribute eliminates the search through the inheritance hierarchy, and can improve performance.

原文:http://forlan.bokee.com/3637173.html有些改动,请原谅

posted @ 2006-01-09 16:33 拼命郎 阅读(1085) 评论(0) 编辑

类定义中可以使用的访问修饰符总结

类定义中可以使用的访问修饰符组合

none or internal

类只能在当前工程中访问

public

类可以在任何地方访问

abstract or internal abstract

类只能在当前工程中访问,不能实例化,只能继承

public abstract

类可以在任何地方访问,不能实例化,只能继承

sealed or internal sealed

类只能在当前工程中访问,不能派生,只能实例化

public sealed

类可以在任何地方访问,不能派生,只能实例化

posted @ 2006-01-09 15:57 拼命郎 阅读(93) 评论(0) 编辑

C# 2.0 局部类型、空属类型、静态类 (转载)

  局部类型
局部类型的引入
没有局部类型的时候(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类。

作者Blog:http://blog.csdn.net/shoutor/
 

posted @ 2006-01-09 15:53 拼命郎 阅读(101) 评论(0) 编辑