C# (using, 延迟初始化)

Posted by moloach on 2017-08-02

作为指令

为命名空间创建别名或导入在其他命名空间中定义的类型。

允许在命名空间中使用类型,

这样无需在该命名空间中限定某个类型的使用

允许访问类型的静态成员

无需限定使用类型名称进行访问。

为命名空间或类型创建别名。

1
2
3
4
5
using System.Text;

using static System.Math;

using Project = PC.MyCompany.MyProject;

using 语句

提供可确保正确使用 IDisposable 对象的方便语法。

示例

1
2
3
using (Font font1 = new Font("Arial",10.0f)){
byte charset = font1.GdiCharSet;
}

备注

File和Font是访问非托管资源的托管类型的示例。有许多其他类别的非托管资源和封装这些资源的类库类型。 所有此类类型都必须实现 IDisposable 接口。

通常,使用 IDisposable 对象时,应在 using 语句中声明和实例化此对象。 using 语句按照正确的方式调用对象上的 Dispose 方法,并(在按照前面所示方式使用它时)会导致在调用 Dispose 时对象自身处于范围之外。 在 using 块中,对象是只读的并且无法进行修改或重新分配。

using 语句确保调用 Dispose,即使在调用对象上的方法时出现异常也是如此。 通过将对象放入 try 块中,然后调用 finally 块中的 Dispose,可以实现相同的结果;实际上,这就是编译器转换 using 语句的方式。 前面的代码示例在编译时将扩展到以下代码(请注意,使用额外的大括号为对象创建有限范围):

1
2
3
4
5
6
7
8
9
10
11
12
{
Font font1 = new Font("Arial", 10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
}

Lazy 实现延迟初始化

在.NET4.0中,可以使用Lazy 来实现对象的延迟初始化,从而优化系统的性能。延迟初始化就是将对象的初始化延迟到第一次使用该对象时。

延迟初始化是我们在写程序时经常会遇到的情形,例如创建某一对象时需要花费很大的开销,而这一对象在系统的运行过程中不一定会用到,这时就可以使用延迟初始化,在第一次使用该对象时再对其进行初始化,如果没有用到则不需要进行初始化,这样的话,使用延迟初始化就提高程序的效率,从而使程序占用更少的内存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication{
public class Student{
public Student(){
this.Name = "DefaultName";
this.Age = 0;
Console.WriteLine("Student is init ...");
}
public string Name{get; set;}
public int Age{get;set;}
}

public class Program{
static void Main(){
Lazy<Student> stu = new Lazy<Student>();
if(!stu.IsValueCreated)
Console.WriteLine("Student isn't init!");
Console.WriteLine(stu.Name);
stu.Value.Name = "Tom";
stu.Value.Age = 21;
Console.WriteLine(stu.Value.Name);
Console.ReadKey();
}
}
}

reference:

https://docs.microsoft.com/zh-cn/dotnet/framework/performance/lazy-initialization