属性和字段的区别
在C#中,我们可以非常自由的、毫无限制的访问公有字段,但在一些场合中,我们可能希望限制只能给字段赋于某个范围的值、或是要求字段只能读或只能写,或是在改变字段时能改变对象的其他一些状态,这些单靠字段是无法做到的,于是就有了属性,属性中包含两个块:set和get,set块负责属性的写入工作,get块负责属性的读取工作。在两个块中都可以做一些其他操作,如在set中验证赋的值是否符合要求并决定是否进行赋值。当缺少其中一块时属性就只能读或只能写,set和get块中属性必需有一个,因为即不能读又不能写的属性是没有意义的。
class MyClass
{
Private string name;
public string Name
{
get {return Name;}
set {Name=value;}
}
}
(1)属性可以保证安全,当不在本类中使用时可以保证使用属性名可以避免
用字段的名字。
(2)属性的set和get函数可以限制字段的一些功能,以达到某种目的。
如:
静态成员
1. (初始化) C#静态方法及属性在程序启动的时候,就全部装入内存的,而不管这些方法、属性以后有没有用到。即使是没有人再访问程序,这部分内存仍然不会释放
-
- 【实验证明,甚至不需要访问到静态变量,它就会被赋值,只要你代码里对它有赋值操;如果没有赋值操作,int会被设为0】
- 【实验证明,不需要显示访问到对象,静态变量就会被处理。顺序为:声明时自带的赋值操作 -> 静态构造函数 -> 程序入口Main】
- 总结来说,静态成员变量是在程序入口前,所有的初始赋值以完成;如果有赋值则赋值,否则给缺省值。
2. (被谁访问)可以被静态方法和非静态方法所访问
静态方法
1. 是一种特殊的成员方法,不属于类的某一个具体的实例,它属于类本身。
2. (不能访问什么)静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等
3. (能访问什么)静态成员函数仅能访问静态的数据成员,不能访问非静态的数据成员,也不能访问非静态的成员函数,这是由于静态的成员函数没有this指针。
非静态方法
1. (能访问什么)所有的静态方法,静态成员,非静态方法,非静态成员
访问关系总结
静态构造函数
- 用于对静态字段、只读字段等的初始化。
- 添加static关键字,不能添加访问修饰符,因为静态构造函数都是私有的。
- 类的静态构造函数在给定应用程序域中至多执行一次:只有创建类的实例或者引用类的任何静态成员才激发静态构造函数 [实验看,不访问也会处理]
- 静态构造函数是不可继承的,而且不能被直接调用。
- 如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项。
- 如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数。
静态类
我们常常希望类只包含静态成员,且不能用于实例化对象,为此,一种简单的方法是使用静态类,而不是把类的构造函数设置为私有。静态类只能包含静态成员,不需要实例构造函数,因为按照定义,它根本不能实例化。但一个类可以有一个静态构造函数。
C# 通过 .NET Framework 公共语言运行库 (CLR) 自动释放用于存储不再需要的对象的内存。内存的释放具有不确定性;一旦 CLR 决定执行垃圾回收,就会释放内存。但是,通常最好尽快释放诸如文件句柄和网络连接这样的有限资源。
using 语句允许程序员指定使用资源的对象应当何时释放资源。为 using 语句提供的对象必须实现 IDisposable 接口。此接口提供了 Dispose 方法,该方法将释放此对象的资源。
可以在到达 using 语句的末尾时,或者在该语句结束之前引发了异常并且控制权离开语句块时,退出 using 语句。
可以在 using 语句中声明对象,或者在 using 语句之前声明对象
下面的示例显示用户定义类可以如何实现它自己的 Dispose 行为。注意类型必须从 IDisposable 继承
using System;
class C : IDisposable
{
public void UseLimitedResource()
{
Console.WriteLine("Using limited resource...");
}
void IDisposable.Dispose()
{
Console.WriteLine("Disposing limited resource.");
}
}
class Program
{
static void Main()
{
using (C c = new C())
{
c.UseLimitedResource();
}
Console.WriteLine("Now outside using statement.");
Console.ReadLine();
}
}
结构体与类很相似,但是结构体是按值传递的,而类是按址传递的。