今天简单介绍一下C#语言中类的两个重要成员:方法和属性。
在C#语言中,最基本的类的成员有两个——字段和方法,其本质是数据和算法,也就是说字段是类的变量,表示这个类储存了什么数据;方法是类所具有的函数,也就是这个类可以做什么事情。如果我们打开一个封装好的程序的对象浏览器,下面拿CAD类库中application类为例,图中的方块图标后面的即为方法,扳手图标后面的是属性。
字段对应的图标是一个盒子,在这里很难看到,以下面的场景为例,这是一个窗口当中的空间,这个图标代表字段,而在已经封装好的类库中,很难看到字段这个成员。
事实上,属性可以理解为私有的字段与方法的组合,在声明上有完全体和较为简单的形式,两者均可以使用代码提示来声明,快捷键分别为propfull+双tab和prop+双tab:
所以,默认的属性有一个字段和一个方法对(get方法和set方法)构成,get方法在访问属性的时候调用,返回值为属性的值,set方法在为属性赋值是调用,实际使用中可以将set方法去掉,变为只读属性(是能访问,不能赋值)。
以上便解释了为什么在对象浏览器中看到的属性比较多而几乎见不到字段:因为属性对属性值有所控制,这样对于程序来说更为安全,一般的,向外暴露数据的时候使用属性而非字段(封装是面向对象编程三大特性之一,这是封装思想的一种体现)。
下面就来简单讲几个有关方法的点:
1方法的定义及调用
方法的定义:修饰符+返回值类型+方法名+(形式参数)
方法的调用:方法名+(实际参数)
2构造器
也称构造函数,是一种特殊的函数,与方法一样,本质都是函数。构造器在类型被创建的时候调用,其函数名与类型的名字完全一致,如果类型中没有构造器,则默认,构造器的声明可以用快捷键ctor+双tab
3方法的重载
多个方法的名字完全一样,但是方法的签名不能相同。其实控制台程序当中最典型的例子就是Console.WriteLine这个方法,我们F12一下:
这些方法都是Console.WriteLine的重载,但是每个重载的参数各不相同,感性的说法就是我们可以打印字符串、数字、多个字符串等等不同类型的信息。
下面有一个控制台程序的例子来简单感受一下构造器以及方法重载,同时也用到了属性:
class Program { static void Main(string[] args) { //声明变量 Book book1 = new Book(); Book book2 = new Book(); Book book3 = new Book(); //分别为属性赋值 book1.PageNumber = 10; book2.PageNumber = 20; book3.PageNumber = 30; //调用方法,使用两种函数签名 int a=Book.AddPageNum(book1,book2); int b = Book.AddPageNum(book2.PageNumber,book3.PageNumber); //由于创建了3个实例,所以sum值为3 Console.WriteLine($"共计调用{Book.Sum}次构造函数"); //方法的返回值 Console.WriteLine($"{a} {b}"); Console.ReadKey(); } } //定义数据类 public class Book { //构造器,静态变量自加,所以构造器每调用一次,sum就加1 public Book() { Sum++; } public static int Sum { get; set; } //静态的属性,表示书的数量 public int PageNumber { get; set; } //属性,表示书的页数 //方法,将两本书的页数相加 public static int AddPageNum(Book book1,Book book2) { return book1.PageNumber + book2.PageNumber; } //方法重载,返回两个整数的和 public static int AddPageNum(int a,int b) { return a + b; } }
输出结果:
这个程序定义了一个book类,有两个属性,分别为静态属性和实例属性,静态属性表示书籍的数量,实例属性表示每本书的页数,这样定义符合带static修饰符的静态成员属于类型,不带static的实例成员属于类型的实例的逻辑关系。构造器中使静态变量自加,这样每创建一个实例构造器被调用的时候,总数加一,这样就可以通过这个属性表达总共创建了多少个变量,这个例子中一共创建了3个实例,接下来两个调用方法的语句给了方法不同的参数,但是分别与两个重载的参数形式相对应,所以两个方法都可以成功调用。
这一篇先讲到这里,主要是通过例子感性的认识一下方法和属性两个常见的类成员,一个负责做事情,一个负责存数据,同时也介绍了字段与方法的区别,特殊的函数——构造器,方法的重载以及静态成员和实例成员的区别。