C#面向对象初级编程

 

对象与类:继承、封装和多态。
1.在C#中定义类
类的声明格式如下:
[类修饰符] class 类名 [:基类名]
{
   类的成员;
}
         类的修饰符可以是以下几种之一或者是它们的组合(在类的声明中同一修饰符不允许出现多次):
◆new新建类,仅允许在嵌套类声明时使用,表明类中隐藏了由基类中继承而来的、与基类中同名的成员。
◆public公有类,表示不限制对该类的访问。
◆protected保护类,表示只能从所在类和所在类派生的子类进行访问。
◆internal内部类,只有对包.Net中的应用程序或库才能访问。
◆private私有类,只有其所在类才能访问。
◆abstract抽象类,不允许建立类的实例。
◆seale—密封类,不允许被继承。
以上类修饰符可以两个或多个。
       类的成员有以下类型:
◆成员常量,代表与类相关的常量值。
◆域,即类中的变量。
◆成员方法,完成类中各种计算或功能的操作。
◆属性,用于定义类中的值,并对它们提供读、写操作。
◆事件,用于说明发生了什么事情。
◆索引指示器,允许编程人员在访问数组时,通过索引指示器访问类的多个实例。
◆操作符,定义类中特有的操作。
◆构造函数,在类被实例化时首先执行的函数,主要是完成对象初始化操作。
◆析构函数,在对象被销毁之前最后执行的函数,主要是完成对象结束时的收尾操作。
       包含有可执行代码的成员被认为是类中的函数成员,这些函数成员有方法、属性、索引指示器、操作符、构造函数和析构函数。
       在编写程序时,我们可以对类的成员使用不同的访问修饰符,从而定义它们的访问级别。
(1)公有成员
C#中的公有成员提供了类的外部界面,允许类的使用者从内部或外部直接进行访问。公有成员的修饰符为public,这是限制最少的一种访问方式。它的优先是使用灵活,缺点是外界可能会破坏对象成员值得合理性。
(2) 私有成员
C#中的私有成员仅限于类中的成员可以访问,从类的外部访问私有成员是不合法的。如果在声明中没有出现成员的访问修饰符,按照默认方式成员为私有的。私有成员的修饰符为private。
(3)保护成员
为了方便派生类的访问,又希望成员对于外界是隐藏的,这时可以使用protected修饰符,声明成员为保护成员。
(4)内部成员
使用internal修饰符的类的成员是一种特殊的成员。这种成员对于同一包中的应用程序或库是透明的,而在包.Net之外是禁止访问的。
(5) this保留字
     保留字this仅限于在构造函数、类的方法和类的实例中使用,它有以下含义:
◆在类的构造函数中出现的this作为一个值类型,它表示对正在构造的对象本身的引用。
◆在类的方法中出现的this作为一个值类型,它表示对调用该方法的对象的引用。
◆在结构的构造函数中出现的this作为一个变量类型,它表示对正在构造的结构的引用。
◆在结构的方法中出现的this作为一个变量类型,它表示对调用该方法的结构的引用。
      除此以外,在其已地方使用this保留字都是不合法的。
2.若将类中的某个成员声明为static该成员称为静态成员。类中的成员要么是静态,要么是非静态的。一般说来,静态成员是属于类所有的,非静态成员则属于类的实例化对象。
       类的非静态成员属于类的实例所有,每创建一个类的实例,都在内存中为非静态成员开辟了一块区域。而类的静态成员属于类所有,为这个类的所有实例所共享。无论这个类创建了多少个副本,一个静态成员在内存中只占有一块区域。
3.如果修饰符为static则表明这个方法只能访问类中的静态成员,没有修饰符static的方法可以访问类中任意成员。
       如果修饰符为virtual,则称这个方法为虚方法,反之称为非虚方法。对于非虚方法,无论是被用此类定义的对象调用,还是被这个类的派生类定义的对象调用,方法的执行方式不变。对于虚方法,它的执行方式可以被派生类改变,这种改变是通过重载实现的。
       如果修饰符为extern,则表示这个方法是外部方法。
4.销毁对象与析构函数
       资源的释放一般是通过“垃圾回收器”自动完成的,但具体来说,仍有些需要注意的地方:
1、值类型和引用类型的引用其实是不需要什么“垃圾回收器”来释放内存的,因为当它们出了作用域后会自动释放所占内存,因为它们都保存在栈(Stack)中;
2、只有引用类型的引用所指向的对象实例才保存在堆(Heap)中,而堆因为是一个自由存储空间,所以它并没有像“栈”那样有生存期(“栈”的元素弹出后就代表生存期结束,也就代表释放了内存),并且要注意的是,“垃圾回收器”只对这块区域起作用。
然而,有些情况下,当需要释放非托管资源时,就必须通过写代码的方式来解决。通常是使用析构函数释放非托管资源,将用户自己编写的释放非托管资源的代码段放在析构函数中即可。需要注意的是,如果一个类中没有使用到非托管资源,那么一定不要定义析构函数,这是因为对象执行了析构函数,那么“垃圾回收器”在释放托管资源之前要先调用析构函数,然后第二次才真正释放托管资源,这样一来,两次删除动作的花销比一次大多的。
C#中方法的参数有四种类型:
◆值参数,不含任何修饰符。
◆引用型参数,以ref修饰符声明。
◆输出参数,以out修饰符声明。
◆数组型参数,以params修饰符声明。
例:
using System;
      namespace SwapTest2
           {
           class Test
              {
            static void Swap(ref int x, ref int y)
           {
   
    int temp=x;
    x=y;
    y=temp;
   }
   static void Main()
   {
    int i=1,j=2;
    Swap(ref i, ref j);
    Console.WriteLine("i={0}, j={1}",i,j);
   }
}
}
函数调用时,如果有修饰符也要加入修饰符,Swap(ref i, ref j)。
5.C#的类定义中可以包含两种方法:静态的和非静态的。使用了static修饰符的方法为静态方法,反之则是非静态的。
          静态方法是一种特殊的成员方法,它不属于类的某一个具体的实例。非静态方法可以访问类中的任何成员,而静态方法只能访问类中的静态成员。
6.C#中的属性更充分地体现了对象的封装性:不直接操作类的数据内容,而是通过访问器进行访问。它借助于get和set对属性的值进行读写,这在C++中是需要程序员手工完成的一项工作。
using System;
namespace FileTest
{   public class File
{      private string s_filename;
   public string Filename
   {
get
    {      return s_filename;
    }
   
set
    {        if(s_filename!=value)
     {
      s_filename=value;
     }
    }
   }
}
public class Test
{        public static void Main()
   {
    File f=new File();
    f.Filename="myfile.txt";
    string s=f.Filename;
   }
}
}
在属性的访问声明中:
◆只有set访问器,表明属性的值只能进行设置而不能读出。
◆只有get访问器,表明属性的值是只读的,不能改写。
◆同时具有set访问器和get访问器,表明属性的值的读写都是允许的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值