结构体
结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体。
结构体是用来代表一个记录。
struct Books
{
public string title;
public string author;
};
public class testStructure
{
public static void Main(string[] args)
{
Books Book1; /* 声明 Book1,类型为 Books */
/* book 1 详述 */
Book1.title = "C Programming";
Book1.author = "Nuha Ali";
/* 打印 Book1 信息 */
Console.WriteLine( "Book 1 title : {0}", Book1.title);
Console.WriteLine("Book 1 author : {0}", Book1.author);
Console.ReadKey();
}
}
运行后的结果为
Book 1 title : C Programming
Book 1 author : Nuha Ali
类与结构的选择
首先明确,类的对象是存储在堆空间中,结构存储在栈中。堆空间大,但访问速度较慢,栈空间小,访问速度相对更快。故而,当我们描述一个轻量级对象的时候,结构可提高效率,成本更低。当然,这也得从需求出发,假如我们在传值的时候希望传递的是对象的引用地址而不是对象的拷贝,就应该使用类了。
C# 结构的特点
您已经用了一个简单的名为 Books 的结构。在 C# 中的结构与传统的 C 或 C++ 中的结构不同。C# 中的结构有以下特点:
结构可带有方法、字段、索引、属性、运算符方法和事件。
结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义无参构造函数。无参构造函数(默认)是自动定义的,且不能被改变。
与类不同,结构不能继承其他的结构或类。
结构不能作为其他结构或类的基础结构。
结构可实现一个或多个接口。
结构成员不能指定为 abstract、virtual 或 protected。
当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。
如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。
接口、继承、多态、重写、虚方法、抽象方法&抽象类、密封类
接口 interface
接口里面规定了一些规则、方法,但是接口不提供默认实现。(C#3.0之后,接口内也可以提供默认实现)
继承某个接口的话就要实现该接口里的所有方法。
继承 :
类的定义处,用冒号加父类的形式表示类的继承。子类可以使用父类里面的非private标记的方法和属性,也可以重写父类带override/virtual或父类所继承的接口的方法。
子类可以拥有只属于自己(不属于父类)的方法和属性。静态类或者静态成员无法继承或重写。
多态
子类可以隐式转换成父类,由子类变换得到的父类可以显式重新转换为对应的子类。子类转换为父类后,子类原有属性和方法不会丢失,只是无法访问。
重写 overrite
子类想要重新实现一个父类里面已经实现了的方法,就用overrite一个同名方法,然后在{ }里面实现,如果需要调用父类中被override的方法,需要用"base.方法名"。
虚方法 virtual
类对于有virtual方法提供默认的实现,并且允许子类重写。(有点类似于上文已经提供了默认实现的接口)
换句话说,父类中的虚方法一定要有默认实现,子类可以选择是否重写。
抽象方法,接口,标记为virtual的方法可以被重写(override),实方法不可以。
抽象方法&抽象类 abstract
当你不想实现某些方法的时候可以用abstract把方法设置为抽象方法,同时要把该方法所在的类设置为抽象类(因为抽象方法必须存在于抽象类中)。
那么抽象类中有两种成员:已经实现了的方法等成员、没有实现的方法(即抽象方法)。
所以抽象类不能实例化。
抽象类本身不可以实例化,只能通过某个继承该抽象类的非抽象子类来实例化,再隐式转化成该抽象类,该抽象类才得以运用。
密封类 sealed
如果不想自己写的类被别人继承,就用sealed规定成密封类。
索引器(Indexer)
索引器的行为的声明在某种程度上类似于属性(property)。就像属性(property),您可使用 get 和 set 访问器来定义索引器。但是,属性返回或设置一个特定的数据成员,而索引器返回或设置对象实例的一个特定值。换句话说,它把实例数据分为更小的部分,并索引每个部分,获取或设置每个部分
using System;
namespace IndexerApplication
{
class IndexedNames
{
private string[] namelist = new string[size];
static public int size = 10;
public IndexedNames()
{
for (int i = 0; i < size; i++)
namelist[i] = "N. A.";
}
public string this[int index]
{
get//只读
{
string tmp;
if( index >= 0 && index <= size-1 )
{
tmp = namelist[index];
}
else
{
tmp = "";
}
return ( tmp );
}
set//只写
{
if( index >= 0 && index <= size-1 )
{
namelist[index] = value;
}
}
}
static void Main(string[] args)
{
IndexedNames names = new IndexedNames();
names[0] = "Zara";
names[1] = "Riz";
names[2] = "Nuha";
names[3] = "Asif";
names[4] = "Davinder";
names[5] = "Sunil";
names[6] = "Rubic";
for ( int i = 0; i < IndexedNames.size; i++ )
{
Console.WriteLine(names[i]);
}
Console.ReadKey();
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.