类是最常见的一种引用类型,最简单的定义如下
class YouClassNam
{}
复杂的类可能包含一下内容
类属性 类属性以及类修饰符. 非嵌套的类修饰符有:public,internal,abstract,sealed,static, unsafe,partial
类名 各种类型参数,唯一基类,多个接口
花括号内 类成员(方法,成员属性,索引器,事件,字段,构造方法,运算符函数,嵌套类型和终止器)
1---->字段
字段是类或结构体中的变量.
字段不一定要初始化,没有初始化的字段会赋一个默认值(0,\0,null,false).字段初始化语句在构造方法之前执行
只读 字段只能在声明时或者在其所属的类构造方法中被赋值,且赋值后不能改变.
可以同事声明多个字段
class MyOne
{
static readonly int leg=8,eye=2;
string name;
public int Age=10;
}
以下修饰符可以用来修饰字段
静态修饰符 | static |
访问权限修饰符 | public internal private protected |
继承修饰符 | new |
不安全代码修饰符 | unsafe |
只读修饰符 | readonly |
跨线程访问修饰符 | volatile |
2---->方法
方法是用一组语句实现实现某个行为.
方法可以应一下修饰符修饰
静态修饰符 | static |
访问权限修饰符 | public internal private protected |
继承修饰符 | new abstract virtual override sealed |
部分方法修饰符 | partial |
非托管代码修饰符 | unsafe extern |
(1)重载方法
确保方法签名相同,就可以在类中重载方法(多方法公用同一方法名)
void Foo(int x){...}
void Foo(double x){...}
void Foo(int x,double y){...}
void Foo(double x,int y){...}
(2)值传递和引用传递
参数是值传递还是引用传递,也是方法签名的一部分.例如Foo(int)和Foo(ref int)或Foo(out int)可以同时出现在一个类中,但是Foo(ref int)和Foo(out int)不能同时出现在同一个类中
void Foo(int x){...}
void Foo(ref int x){...}//此处正确
void Foo(out int x){...}//此刻错误
3---->构造方法
构造方式是执行类或者结构体的初始化代码.
构造方法和方法定义类似,区别仅在于构造方法名和返回值只能和封装它的类相同
public class Person
{
string name; //定义字段
public Person (string n)//定义构造方法
{
name=n; //初始化字段
}
}
...
Person p=new Person("HanMei");//调用构造方法
构造方法支持以下修饰符
访问权限修饰符 | public internal private protected |
非托管代码修饰符 | unsafe extern |
(1)重载构造方法
为避免重复,一个构造方法可以用this关键字调用另一个构造方法
当一个构造方法调用另一个时,被调用的构造方法先执行.
using System;
namespace 构造函数重载
{
public class Person
{
private string _name;
private int _age;
public string Name
{
get { return _name; }
set { _name = value; }
}
public int Age
{
get { return _age; }
set { _age = value; }
}
public Person(string name)
{
this.Name = name;
}
public Person(string name, int age):this(name)
{
this.Age = age;
}
}
}
(2)隐式无参数构造方法
默认c#编译器会自动为木有显式定义构造方法的类生成构造方法.一旦显示定义构造方法,系统将不再自动生成无参构造方法,即使显示定义无参构造函数,也不是原来的了
public class Person
{
public Person(){}
}
(3)构造方法和字段初始化顺序
字段初始化按声名的先后顺序,在构造方法之前执行!!!!!!!!!
首先,在声名字段的时候赋予初始值:
class Person
{
int a=10;//第一个被初始化
int b =20;//第二个被初始化
}
(4)非公有构造方法
通常定义非公有构造方法的原因是为了在一个静态方法中控制类实例的创建(单例????).
静态方法可以用于从池中返回类对象,而不必创建一个新对象实例,或者根据不同的输入属性返回不同的子类.
public class Person
{
Person() { }//私有构造方法
public static Person Creat(...)
{
//定义逻辑,返回Person的实例
.......
}
}
this引用指的是引用实例自身,下面,方法Marry将Person的name字段设定为this.