目录
类(class)是一种数据结构,它可以包含数据成员(变量和常量)、函数成员(方法、属性、事件、索引器、运算符、构造函数和析构函数)和嵌套类型。类支持继承,继承是一种使子类可以对基类进行扩展和专用化的机制。
1.1类
1.1.1类的声明
语法格式如下
修饰符 class 类名{
}
例如创建一个学生类
public class st{
public string name; //姓名
public int age; //年纪
private string gender;//性别
}
1.1.2类的修饰符
NEW:仅允许在嵌套类声明时使用,表明类中隐藏了由基类继承而来的、与基类成员同名的成员
public:不限制对该类的访问,即为公开
protected:只能从其所在类和所在类的子类进行访问
internal:同意程序集的任何代码都可以访问
private:只有所在类才能访问
abstract:抽象类,不允许建立类的实例
sealed:密封类,不允许被继承
1.2属性和方法
1.2.1属性
属性是一种用于访问对象或类的特征的成员;属性有访问器,这些访问器指定在它们的值被读取或写入时需要执行的语句。
1、属性的特点
a、属性可向程序中添加元数据。元数据是嵌入程序中的信息,如编译器指令或数据描述
b、程序可以使用反射检查自己的元数据
c、通常使用属性与COM交互。
元数据就是对数据的描述,是数据的根本,源头。
属性以两种形式存在:一种是在公共语言运行库的基类库中定义的属性;另一种是自己创建、可以向代码中添加附加信息的自定义属性
2、属性的语法格式
语法格式:
访问修饰符 数据类型 属性名
{
get
{
return 变量名;
}
set
{
变量名=value;
}
}
自定义属性在类中是通过以下方式声明的:指定访问的级别,后面是属性的类型,接下来是属性名称,后面是声明get访问器和set访问器的代码模块。
3、get访问器和set访问器
get访问器与方法体相似,它必须返回属性类型的值;而set访问器类似于返回类型为void的方法,它使用称为value的隐式参数,此参数的类型是属性的类型。
通过以下两个代码带大家了解get和set
a、普通书写方式
namespace get和set访问器
{
internal class Program
{
static void Main(string[] args)
{
Myclass myclass = new Myclass(); //实例化对象
myclass.shooiunfo();
int a = myclass.GetAge();
Console.WriteLine("age的年龄是" + a);
int b = myclass.Age;
Console.WriteLine(b);
}
}
class Myclass
{
public string Name = "小王";
int age = 18; //前面不加访问修饰符默认为private
public int GetAge() //此处类似与get访问器
{
return age;
}
public void setAge(int ag) //此处类似于set访问器
{
if (ag > 120)
ag = 120;
else if (ag < 1)
ag = 1;
age = ag;
}
public int Age
{
get { return age; }
set
{
if (value > 120)
value = 120;
else if (value < 1)
value = 1;
age = value;
}
}
public void shooiunfo() //展示字段name和age
{
Console.WriteLine(Name);
Console.WriteLine(age);
}
}
}
b、访问器写法
public int Age
{
get { return age; }
set
{
if (value > 120)
value = 120;
else if (value < 1)
value = 1;
age = value;
}
}
1.3方法
方法是一种用于实现可以由对象或类执行的计算或操作的成员。类的方法主要是和类相关联的动作,它是类的外部界面。
1.3.1方法的声明
一个方法的名称和形参列表定义了该方法的签名。具体讲,一个方法的签名由它的名称以及它的形参个数、修饰符和类型组成。
注:一个方法的返回类型和他的形参列表中所引用的各个类型必须至少具有与该方法本身相同的可访问性。
例如以下就是一个简单的输出方法
class myclass
{
public void Name() //方法的声明
{
Console.Write("这个类的名字叫做myclass")
}
}
1.3.2方法的参数类型
1、params参数
是用来指定在参数数目可变时采用的方法参数,params参数必须是一维数组。
class Program
{
static void UseParams(params string[] list)//声明一个静态方法UseParams(),接收一个string[]类型的参数!
///此处使用了params参数:用来指定在参数数目可变是采用的方法参数,但必须是一维数组!
{
for (int i = 0; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
}
static void Main()
{
string[] strName = new string[5] { "我", "是", "中", "国", "人" };
UseParams(strName);//将数组strName数组赋值给UseParams中list数组中!
Console.Read();
}
}
2、ref参数
ref参数使方法参数按引用传递,其效果是:当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
如果要使用ref参数,则方法声明和调用方法都必须显式使用ref关键字
namespace ref参数
{
class Program
{
public static void Method(ref int i)//声明一个静态方法Method,并接收一个INT类型的ref参数
///方法声明和调用都必须显示使用ref关键字
///ref参数:使方法参数按引用传递
{
i = 44;
}
public static void Main()
{
int val = 0;
Method(ref val);
Console.WriteLine(val);
Console.WriteLine(10);
Console.Read();
}
}
}
3、out参数
out参数用来定义输出参数,它会导致参数通过引用来传递,这与ref关键字类似,不同之处在于ref要求变量必须在传递之前进行初始化,而OUT关键字定义的参数,不用进行初始化即可使用。
class Program
{
static void Method(out int i)
///于ref相似,不同点于ref要提前初始化而out不需要!
{
i = 0;
}
public static void Main()
{
int value;
Method(out value);
Console.WriteLine("输出数:"+value);
Console.Read();
}
}
1.3.3方法的分类
方法分为静态方法和非静态方法,如果一个方法声明含有static修饰符,则称该方法为静态方法;如果没有则为非静态方法
1、静态方法
静态方法不对特定实例进行操作,调用时,需要直接使用类名进行调用。
static void Main(string[] args)
{
Console.WriteLine(Program.Add(3,5)); //通过类名Program调用
}
public static int Add(int x,int y) //定义静态方法
{
return x+y;
}
2、非静态方法
非静态方法时对类的某个给定的实例进行操作,调用时,需要使用类的实例(对象)进行调用。
static void Main(string[] args)
{
Add add=new Add();
Console.WriteLine(add.Add(3,5)); //通过实例化名add调用
}
public int Add(int x,int y) //定义非静态方法
{
return x+y;
}
3、方法的重载
指方法名相同,但参数的数据类型、个数和顺序不同的方法
/// <summary>
/// 方法的重载是指方法名相同,但参数的数据额类型、个数和顺序不同的方法
/// 只要类中有两个以上的同名方法,但是使用的参数类型、个数和顺序不同,调用时编译器即可判断在那种情况下调用哪种方法。
/// </summary>
class Program
{
static void Main(string[] args)
{
Program program = new Program();
int a = 1;
int b = 2;
int c = 3;
Console.WriteLine(program.Add(a,b));
}
//以下为重载方法
public double Add(int x, double y)
{
return x + y;
}
public int Add(int x, int y,int z)
{
return x + y+z;
}
public static int Add(int x, int y)
{
return x + y;
}
}
1.4字段
字段是在类或结构中直接声明的任意类型的变量。
声明一个字段,可以用访问修饰符+类型+变量名称来声明
public myclass
{
//以下在类中或结构中的变量都为字段
public string name;
int age;
}
1.4.1字段的特性
1.字段通常不使用public关键字,仅在private和protected时才建议使用。如果您要使用public时,建议转为属性。这是为了符合面向对象设计的原因。简单一句话理解就是字段对内,属性对外。
2.可以对字段使用static关键字,这可使字段让调用方在任何时候进行调用,即使不存在任何类的实例。
3.也可以对字段使用static readonly关键字,这样很像const关键字。它们之间的区别是static readonly需要在运行时才可以访问,而const则编译的时候就已经可以访问了。
4.字段是在对象实例的构造函数被调用之前便初始化。 如果构造函数分配了该字段的新值,则它将覆盖在字段声明期间给定的任何值。
5.字段可以使用ref、out关键字传递。
1.5属性和方法的区别
从概念上可以区分字段和属性的区别,字段是一个用于存储数据的变量,属性是一个方法或者说是一个函数成员。那么既然属性是一个方法,那么它和方法的区别是什么呢?
从定义就可以看出来,属性其实本身就是方法。但既然把属性和方法定义成为两个概念,那么它们之间肯定有不同的地方。个人感觉,他们最大的区别首先是属性没有参数列表,而方法必须要有参数列表,哪怕没有参数,也要放一个空括号在那。其次,属性定义里要有set和get两个访问器,用于获得属性的值和设定属性的值。其余的地方没有发现不同之处,属性里也可以判定数据的合法性,和方法没有什么两样。