第三章 对象和类型
1. 类和结构的区别:
a. 最大的区别是存储位置不一样:类是引用类型,存放在堆上,结构式值类型,存放在堆栈上。所以new运算符与类的工作方式不同,不分配内存,只是调用构造函数,初始化字段
b. 结构不支持继承
c. 结构不允许定义无参数构造函数,不能给字段提供初始值
2. 类成员
类中的数据(字段、常量、事件)和函数(方法、属性、构造函数和终结器、运算符以及索引器)称为类的成员
(1) ref参数 迫使参数通过引用传送给方法 带入前初始化
(2) out输出参数 参数前加out关键字时,传递给该方法的变量可以不初始化
static void Main(string[] args)
{
//ref关键字
//int[] ints = {10};
//int i = 10;
//SomeFunction(ints,ref i);
//Console.WriteLine(ints[0].ToString()+i.ToString());
//out关键字
int i;
SomeFunction2(out i);
Console.WriteLine(i);
}
/// <summary>
/// ref
/// </summary>
/// <param name="ints"></param>
/// <param name="i"></param>
static void SomeFunction(int[] ints, ref int i)
{
ints[0] = 100;
i = 100;
}
/// <summary>
/// out
/// </summary>
/// <param name="i"></param>
static void SomeFunction2(out int i)
{
i = 100;
}
(3) 方法重载 方法中的参数名称、参数类型或参数个数不同
a. 两个方法不能仅在返回类型上有区别
b. 两个方法不能仅根据参数是声明为ref还是out来区分
(4) 构造函数
C#中默认有一个没有参数没有返回值的构造函数
把构造函数定义为private或protected,不相关的类就不能访问
public class MyNumber
{
private int number;
private MyNumber(int number)
{
this.number = number;
}
}
在这个例子中,我们没有为MyNumber定义任何公共或受保护的构造函数。所以MyNumber类不能使用new运算符在外部代码中实例化(但可以在MyNumber上编写一个公共静态属性或方法,已进行实例化),适用于以下两种情况:
类仅用作某些静态成员或属性的容器,因此永远不会实例化
希望类仅通过调用某个静态成员函数来实例化
a.静态构造函数 没有访问修饰符,不能带任何参数,一个类只能有一个静态构造函数,显然,静态构造函数只能访问静态成员
(5) 只读字段
public class DocumentEditor
{
public readonly DateTime CreationDate;
public DocumentEditor()
{
CreationDate = new DateTime(2002,1,1);
}
}
把字段声明为只读类型,表示其值只能在构造函数中设置
3. 结构与类的区别
结构是值类型,不是引用类型。他们存储在堆栈中火存储为内联(如果他们是对象的一部分,就会保存在堆中),其生存期的限制与简单的数据类型一致
结构不支持继承
结构的构造函数的工作方式有一些区别。尤其是编译器总提供一个无参数的构造函数,这是不允许替换的
使用结构,可以指定字段如何在内存中布局
4. 部门类(partial)
Partial关键字允许把类、结构或接口放在多个文件中。如果没有类的源代码时,可以使用部分类给其添加内容
//BigClassPart1.cs
partial class TheBigClass
{
public void MethodOne()
{
Console.WriteLine("one");
}
}
//BigClassPart2.cs
partial class TheBigClass
{
public void MethodTwo()
{
Console.WriteLine("two");
}
}
5. 静态类(static)
如果一个类只包含静态的方法和属性,该类就可以是静态的。静态类不能创建实例。条用静态类中的方法:类名.方法名