一.类的定义
1.1类的访问修饰符
修饰符 | 含义 |
---|---|
无或internal | 只能在当前项目中访问类 |
public | 可以在任何地方访问类 |
abstract或internal abstract | 只能在当前项目中访问,不能实例化,只能被继承 |
public abstract | 可以在任何地方访问,不能实例化,只能被继承 |
sealed或internal sealed | 只能在当前项目访问,只能被实例化,不能被继承 |
public sealed | 可以在任何地方访问,只能实例化,不能被继承 |
1.2普通类
public class MyClass
{
}
1.3抽象类
public abstract class MyClass
{
}
1.4密封类
public sealed class MyClass
{
}
1.5嵌套类
public sealed class MyClass
{
public class MyNestedClass
{
public int NestedClassField;
}
}
要在MyClass外部实例化MyNestedClass,必须限定名称,例如:
MyClass.MyNestedClass myObj = new MyClass.MyNestedClass();
1.6泛型类
class MyClass<T>
{
}
1.7类的继承
public class MyClass:MyBase, IFlyable
{
}
类支持的接口必须放在基类(如果有)后面,用逗号隔开。
二.类成员的定义
类的成员包括字段、方法和属性。所有成员都有自己的访问级别,用下面关键字定义:
关键字 | 含义 |
---|---|
public | 成员可以由任何代码访问 |
private | 成员只能由类中的代码访问(如果没有指定任何关键字,默认为此关键字) |
internal | 成员只能由定义它的程序集(项目)内部的代码访问 |
protected | 成员只能由类或派生类中的代码访问 |
2.1定义字段
class MyClass
{
public int Myint;
}
字段也可以使用关键字readonly,表示该字段只能在执行构造函数的过程中赋值,或由初始化赋值语句赋值。例如:
class MyClass
{
public readonly int Myint = 17;
}
也可以使用static关键字将字段声明为静态,例如:
class MyClass
{
public static int Myint;
}
静态字段必须有类访问,不能通过类的对象实例来访问。
2.2定义方法
方法和定义函数格式相同,在前面加上访问修饰符。
class MyClass
{
public string GetString()
{
return "hello";
}
}
关键字 | 含义 |
---|---|
virtual | 方法可以重写 |
abstract | 方法必须在非抽象的派生类中重写(只用于抽象类) |
override | 重写基类方法 |
extern | 方法定义可以放在项目外部其他地方 |
static | 方法只能通过类访问,不能通过对象实例访问 |
如果使用override,也可以使用sealed指定派生类不能再对该方法进行修改,不能被再次重写。
class MyClass:MyBaseClass
{
public override sealed void DoSomething()
{
}
}
2.3定义属性
属性与字段差不多,但增加了两个类似函数的访问器:get和set,一个用于获取属性的值,一个用于设置属性的值。两个属性至少得有一个,属性才有效。属性本质是一个方法,本身不存储数据,主要用来操作私有字段,或者限定属性只读或只写,还进行一些其他操作(避免出现非法数据)。下面定义了一个Name属性,同时限制Name不能为“张三”。
class MyClass
{
//字段
private string _name=string.Empty;
//属性
public string Name
{
get
{
return _name;
}
set
{
if(value!="张三")
{
_name= value;
}
else
{
_name= string.Empty;
}
}
}
属性可以像方法一样使用virtual、override和abstract关键字,例如:
class MyClass
{
//字段
private string _name=string.Empty;
//属性
public string Name
{
get
{
return _name;
}
protected set
{
_name= value;
}
}
}
只有类或派生类中的代码才可以使用set访问器。要注意的是,访问器的可访问性级别不能高于它所在属性的访问级别。就是说私有属性的访问器不能包含任何访问修饰符,而公共属性才可以对两个访问器进行访问级别设置。
除了上述方式定义属性外,可以以C#提供了另外简洁方式定义属性,通过一个公共属性来直接访问一个私有成员,即自动属性。自动属性可以简化语法,编译器会自动声明私有字段,并在属性的get和set块使用该字段。自动属性只能通过属性访问数据,不能通过底层的私有字段访问,不过限制是必须包含get和set访问器,但可以改变访问级别。
class MyClass
{
public int Age
{
get;
private set;
}
}
2.4定义索引器
class Person
{
private string[] _cars = new string[5];
//索引器,一个特殊的属性(方法)
public string this[int index]
{
get
{
if (index < 0 || index >= _cars .Length)
{
throw new ArgumentException();
}
return _cars [index];
}
set
{
_cars [index] = value;
}
}
}
通过索引器可以操作类的实例中的数组成员,使用方法与数组类似,形式如下:对象名[索引]。
Person p=new Person();
p[0]="奥迪";
Console.WriteLine(p[0]);