属性和方法是C#程序中的俩个重要组成部分,其中属性提供灵活的机制来读取、编写或计算私有字段的值,而方法则以一部分代码构成代码块的形式存在,用来实现特定的功能。
1 属性
属性提供功能强大的方法以及声明信息与C#代码(类型、方法、属性等)相关联,一旦属性与程序实体相关联,即可使用名为反射的技术对属性进行查询。
1.1 属性概述
属性是一种用于访问对象或类的特性的成员,它可以表示字体的大小、窗体的标题、客户的名称等内容。
属性有访问器,这些访问器指定在它们的值被读取或写入时需要执行的语句。因此属性提供了一种机制,他把读取和写入对象的某些特性与一些操作相关联起来。可以向使用公共成员一样使用属性看但实际上它们是称为访问器的一种特殊方法,这使得数据在被轻松访问的同时,仍能提供方法的安全性和灵活性。
属性不能作为ref参数或out参数传递
属性具有以下特点:
- 属性可向程序中添加元数据。元数据是嵌入程序中的信息,如编译器指令或数据描述。
- 程序可以使用反射检查自己的元数据。
- 通常使用属性与COM交互
属性以俩种形式存在:
一种是在公共语言运行库的基类库中定义的属性
另一种是自己创建、可以向代码中添加附加信息的自定义属性。
语法:
访问修饰符 数据类型 属性名
{
get
{
return 变量名;
}
set
{
变量名 = value;
}
}
访问修饰符用来确定属性的可用范围:
修饰符 | 修饰范围 |
---|---|
public | 不限制对该属性的访问 |
protected | 只能从其所在类和所在子类进行访问 |
internal | 只有在其所在类才能访问 |
private | 私有访问修饰符,只能在其声明类中使用 |
实例:
public class Date
{
private int Day = 7;
public int day
{
get { return Day; }
set
{
if ((value>0&&(value<8)))
{
Day = value;
}
}
}
}
说明:
get访问器与方法体相似,它必须返回属性类型的值;而set访问器类似于返回类型为void的方法,它使用称为value的隐式参数,此参数的类型是属性的类型。
1.2 属性的使用
程序中调用属性的语法格式如下:
对象名.属性名
注意:
- 如果要在其他类中调用自定义属性,必须将自定义属性的访问级别设置为public
- 如果属性为只读属性,不能再调用时为其赋值,否则产生异常
实例:
static void Main(string[] args)
{
MyClass myClass =new MyClass();
MyClass myClass2 = new MyClass();
myClass.ID = "BH01";
myClass.Name = "TM1";
myClass2.id = "BH02";
myClass2.name = "TM2";
Console.WriteLine(myClass.ID + " " + myClass.Name);
Console.WriteLine(myClass2.id +" "+myClass2.name);
Console.ReadLine();
}
public class MyClass
{
public string id = "";
public string name = "";
public string ID
{
get { return id; }
set { id = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
}
2 方法
方法是一种用于实现可以由对象或类执行的计算或操作的成员。类的方法主要是和类相关联的动作,它是类的外部界面。对那哪些私有的字段来说,外部界面实现它们的操作一般只能是通过方法来实现。
方法就是为达到某种目的而采取的途径、步骤、手段等。
2.1 方法的声明
方法是包含一系列语句的代码块,在C#中,每个执行命令都是在方法的上下文中完成的。
方法在类或结构中声明,声明时需要指定访问级别、返回值、方法名称及方法参数,方法参数放在括号中,并用逗号隔开。括号中没有内容表示声明的方法没有参数。
方法声明可以包含一组特性和private、public、protected、internal4个访问修饰符的任何一个有小组和,还可以包含new、static、virtual、override、sealed、abstract以及extern等修饰符。
如果以下条件都为真,则表明所声明的方法具有一个有效的修饰符组合。
- 该声明包含一个有效的访问修饰符组合
- 该声明中所包含的修饰符彼此各不相同
- 该声明最多包含下列修饰符中的一个:static、virtual、override
- 该声明最多包含下列修饰符中的一个:new、override
- 如果该声明包含abstract修饰符,则该声明不包含下列任何修饰符:static、virtual、sealed、extern
- 如果该声明包含private修饰符,则该声明不包含下列任何修饰符:virtual、override、abstract
- 如果该声明包含sealed修饰符,则该声明还包含override修饰符
一个方法的名称和形参列表定义了该方法的签名,具体的讲,一个方法的签名有他的名称以及他的形参的个数、修饰符、类型组成。返回类型步数方法签名的组成部分,形参的名称也不是方法签名的组成部分。
注意:
一个方法的返回类型和它的形参列表中所医用的各个类型,必须具有至少与该方法本事相同的可访问性。
对于abstract和extern方法,方法主体只包含一个分号。对于所有其他的方法,方法逐日有一个块组成,该快指定了在调用方法时要执行的语句。
方法的名称必须与在同一个类中声明的所有其他非方法成员的名称都不相同。此外,一个方法的签名必须与同在一个类中声明的所有其他方法的签名都不相同,并且在同一类中声明的俩个方法的签名不能只有ref和out不同。
2.2 方法的参数类型
调用方法时可以给该方法传递一个或多个值,传给方法的值叫做实参,在方法内部,接接受实参的变量叫做形参,形参在紧跟着方法名的括号中声明,形参的声明语法与变量的声明语法一样。形参只在括号内有效。声明方法参数时,可以通过关键字params、ref和out实现。
2.2.1 params参数
params参数用来指定在参数数目可变时采用的方法参数,Params参数必须是一维数组。
实例:
static void Main(string[] args)
{
string[] strName = new string[5] { "早上", "好", "啊", "领导", "!!"};
UseParams(strName);
Console.ReadLine();
}
static void UseParams(params string[] list)
{
for (int i = 0; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
}
2.2.2 ref参数
ref参数使方法参数按引用传递,其效果是:当控制权传递回调用方法时,在方法中对参数所做的任何改变都将反映在该变量中。如果使用ref参数,则方法的声明和调用方法都必须显示使用ref关键字
实例:
static void Main(string[] args)
{
int val = 0;
Method(ref val);
Console.WriteLine(val); // 44
Console.ReadLine();
}
static void Method(ref int i)
{
i = 44;
}
2.2.3 out参数
out关键字用来定义输出参数,它会导致参数通过用来传递,这与ref关键字类似,不同之处在于ref要求变量必须在传递之前进行初始化,而使用out关键字定义的参数,不用进行初始化即可使用。如果要使用out参数,则方法声明和调用方法都必须显示使用out关键字。
实例:
static void Main(string[] args)
{
int val ;
Method(out val);
Console.WriteLine(val); // 44
Console.ReadLine();
}
static void Method(out int i)
{
i = 44;
}
2.3 方法的分类
方法分为静态方法和非静态方法,如果一个方法声明中含有static修饰符,则称该方法为静态方法。如果没有static修饰符,则称该方法为非静态方法。
2.3.1 静态方法
静态方法不对特定实例进行操作,调用时,需要直接使用类名进行调用。
实例:
static void Main(string[] args)
{
Console.WriteLine(Add(3,5)); // 8
Console.ReadLine();
}
public static int Add(int x ,int y)
{
return x + y ;
}
2.3.2 非静态方法
非静态方法是对类的某个给定的实例进行操作,调用时需要使用类的实例对象进行调用。
实例:
class Program
{
static void Main(string[] args)
{
Program pr = new Program();
Console.WriteLine(pr.Add(3,5)); // 8
Console.ReadLine();
}
public int Add(int x ,int y)
{
return x + y ;
}
}
2.4 方法的重载
方法的重载是指方法名相同,但参数的数据类型、个数、或顺序不同,调用时,编译器即可判断在哪种情况下调用哪种方法。
实例:
class Program
{
static void Main(string[] args)
{
Program pr = new Program();
int x = 3;
int y = 5;
int z = 7;
double y2 = 5.5;
Console.WriteLine(Add(x, y)); //8
Console.WriteLine(pr.Add(x, y2)); //8.5
Console.WriteLine(pr.Add(x, y, z));//15
Console.ReadLine();
}
public static int Add(int x ,int y)
{
return x + y ;
}
public double Add(int x, double y)
{
return x + y;
}
public int Add(int x, int y, int z)
{
return x + y + z;
}
}
2.5 Main方法
Main方法时程序的入口点,程序将在此处创建对象和调用其他方法,一个C#程序中只能有一个入口点,每创建一个项目,程序都会自动生成一个Main方法,默认的Main方法代码如下:
static void Main (string[] args){}
说明
Main方法默认访问级别为private
Main方法是一个特别重要的方法,使用时需要注意以下几点:
- Main方法时程序的入口点,程序控制在该方法中开始和结束。
- 该方法在类或结构的内部声明,他必须为静态方法,而且不应该为公共方法。
- 它可以具有void或int返回类型。
- 声明Main方法时既可以使用参数,也可以不使用参数。
- 参数可以作为从零开始索引的命令行参数来读取。