一、属性的概述
属性是对实体特征的抽象,用于提供对类或对象的访问,C# 中的属性具有访问器,这些访问器指定在它们的值被读取或写入时需要执行的语句,因此属性提供了一种机制,用于把读取和写入对象的某些特征与一些操作关联起来。
属性的声明格式如下:
【访问修饰符】 【类型】 【属性名】
{
get {get 访问器体}
set {set 访问器体}
}
访问修饰符:指定属性的访问级别;类型:指定属性的类型,可以是任何预定义或自定义类型;属性名:一种标识符,而且一般属性名的第一个字母通常大写;
get 访问器:相当于一个具有属性类型返回值的无参数方法,除了作为赋值的目标外,当在表达式中引用属性时,它将调用该属性的 get 访问器获取属性的值,get 访问器体需要用 return 语句来返回,并且所有的 return 语句都必须返回一个可隐式转换为属性类型的表达式;
set 访问器:相当于一个具有单个属性类型值参数和 void 返回类型的方法,set 访问器的隐式参数始终命名为 value,当一个属性作为赋值的目标被引用时,就会调用 set 访问器,所传递的参数将提供新值,由于 set 访问器存在隐式的 value 参数,因此在 set 访问器中不能自定义名称为 value 的局部变量或常量;
属性可以分为以下几种:
- 可读可写属性:包含 get 访问器和 set 访问器
- 只写属性:只包含 set 访问器
- 只读属性:只包含 get 访问器
属性的主要用途时限制外部类对类中成员的访问权限,定义在类级别上,属性不能作为 ref 参数或 out 参数传递。
属性以两种形式存在:一种时在公共语言运行库的基类库中定义的属性,另一种时可以创建,并可以向代码中添加附加信息的自定义属性。
例如有:
public class Date
{
private int Day = 7; //定义字段
public int day //星期属性,该属性为可读可写
{
get { return Day; }
set
{
if ((value > 0) && (value < 8))
{
Day = value;
}
}
}
}
C# 支持自动实现的属性,即在属性的 get 访问器和 set 访问器中没有任何逻辑,而且必须同时拥有get 访问器和 set 访问器,例如有:
public int age
{
get;
set;
}
二、属性的使用
程序中调用属性的语法格式如下:
对象名.属性名
需要注意的是:
- 如果要在其它类中调用自定义属性,必须将自定义属性的访问级别设置为 public;
- 如果属性为只读属性,不能在调用时为其赋值,否则产生异常。
get 访问器是在取值的时候调用的,set 访问器是在赋值的时候调用的,利用属性可以保护字段以及为赋值或者取值添加判断条件(if)。
三、方法
方法在类或结构中声明,声明时需要指定访问级别、返回值、方法名称及方法参数,方法参数放在括号中,并用逗号隔开,括号中没有内容表示声明的方法没有参数。声明方法的基本格式如下:
【访问修饰符】返回值类型 方法名(参数表列)
{
//方法的具体实现;
}
其中,访问修饰符可以是 public、private、protected、internal 中的任何一个,也可以省略,如果省略访问修饰符,则方法的默认访问级别是 private,即只能在该类中访问。
需要注意的是,一个方法的返回类型和它的形参列表中所引用的各个类型必须至少具有与该方法本身相同的可访问性。
(一)方法的分类
方法分为静态方法和非静态方法,静态方法需要有 static 修饰。
静态成员与 C++ 类似,可参考 C++ 的对象和类中的静态成员。但也有所区别,例如有:
namespace ClassName
{
/*
* 静态成员的声明
* 静态函数的声明以及对静态成员和非静态成员的调用
*/
public class Person
{
static int m_A = 10;
int m_B = 20;
public static void func(int a, int b)
{
Person p = new Person();
m_A = a;
p.m_B = b;
Console.WriteLine("a = " + a);
Console.WriteLine("b = " + b);
Console.ReadLine();
}
}
}
(二)方法的重载
方法重载是指调用同一方法名,但各方法中参数的数据类型、个数或顺序不同。
(三)Main 方法
Main 方法的默认访问级别为 private。
(四)方法的参数
1、ref 参数(引用传递参数)
由于 C# 没有对指针的操作,因此它在使用引用传递时,也没有取址符号“&”,但提供了一个 ref 参数。ref 参数使形参按引用传递(即使形参是值类型),其效果是在方法中对形参所在的任何修改都将反映在实参中,如果要使用 ref 参数,则方法声明和方法调用都必须显式使用 ref 关键字。
使用 ref 参数时,需要注意以下几点:
- ref 关键字只对跟在它后面的参数有效,而不是应用于整个参数列表;
- 在调用 ref 参数之前,一定要进行赋值。
- 实参只能是变量,不能是常量或者表达式;
- 在调用方法时,必须使用 ref 修饰实参,而且因为是引用参数,所以实参和形参的数据类型必须完全匹配;
2、out 参数(定义输出函数,引用传递参数)
out 关键字用来定义输出函数,它会使参数通过引用来传递,不同的是 ref 关键要求变量必须在传递之前进行赋值,而使用 out 关键字定义的参数不用进行赋值即可使用,如果要使用 out 参数,则方法声明和方法调用都必须显式使用 out 关键字。
3、params 参数
params 参数可以修饰一个一维数组,用来指定在参数类型相同但数量过多或者不确定时所采用的方法参数。当使用 params 参数时,需要注意以下几点:
- 只能在一维数组中使用 params 参数;
- 一个方法最多只能有一个 params 参数。
- 不允许使用 ref 关键字或者 out 关键字修饰 params 参数;
例如有:
public int AddNum(params int[] x)
{
int res = 0;
for (int i = 0; i < x.Length; i++)
{
res += x[i];
}
return res;
}