C#程序设计经典教程

复习周?

    • 一、CSharp设计基础
    • 二、面向对象程序基本特征
    • 三、 类的数据成员和属性
    • 四、 类的方法
    • 五、 Windows窗体
    • 六、静态成员与静态类
    • 七、类的继承性
    • 八、C#中多态的实现方式
    • 九、抽象类
    • 十、接口
    • 十一、ArrayList
      • ExampleCollectionApp:
    • 十二、程序调试与异常处理
    • throw语句与自定义异常
      • 上机实验7(P184-186)实验报告
    • 十三、 数据库编程技术
      • 使用Connection对象访问数据库
      • 双击‘登录’按钮实现用户验证登录
  • 走了~

Pascal大小写,每个单词的首字母大写,其它小写,用于标识类名、方法名、属性名等,如ProductOrder、Employee和GetEmployeeName等;
Camel大小写,首字母小写,其后每个单词的首字母大写,其它小写,用于标识局部变量、方法的参数名等,如backColor、name等。


一、CSharp设计基础

  • 从数据存储角度数据可分为值类型和引用类型。值类型主要有三种:简单类型、枚举类型、结构类型。引用类型变量只是对数据的引用,数据保存在其他位置。数组、字符串、类、接口等都属于引用类型。

  • 字符串方法

    • Replace,替换
    • Split,转换为字符串数组
    • Substring,求子串
    • Trim,去掉首尾空格
  • switch语句一定要有break,break中止当前循环,continue中止本次循环,继续下一次循环

  • foreach语句用来遍历整个数组;总是从第一个元素遍历到最后一个元素;语句循环变量是个只读变量。


二、面向对象程序基本特征

  • 在一个系统中,任何一个对象都应当有两个要素,即属性和行为。“属性”体现了对象自身的状态,“行为”代表对外提供的服务,也表示在进行某种操作时应具备的方法。

  • 对象是类的特例,或者说是类的具体表现形式。

  • 面向对象的最基本的特征是抽象性、封装性、继承性和多态性。

  • 抽象(abstraction)

    • 处理事物复杂性的方法,只关注与当前目标有关的方面,而 忽略与当前目标无关的那些方面。
  • 封装(Encapsulation)

    • 一是将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相互独立,互不干扰。
    • 二是将对象中某些部分对外部隐藏,即隐藏其内部细节,只留下少量接口,以便于与外界联系,接受外界的消息。(信息隐藏)
  • 继承(派生):B类对象拥有A类对象的全部属性和方法,这种特性在面向对象中称作对象的继承性。继承机制是系统软件易于扩充。

  • 多态性(Polymorphism) 是指在基类中定义的属性或方法被派生类继承后,可以表现出不同的行为特征,对同一消息会做出不同的响应。

    • 覆盖

三、 类的数据成员和属性

class student
{
  private string name; //私有字段:不允许其他类访问
  public string Name  //设置相应公有属性
  {
    get{return name;}
    set{name = value;}
  }
  private int age;
  public int Age
  {get;set;}     //自动属性
}

四、 类的方法

1.设计函数类的方法getFirstRoot()和getSecondRoot()

class Equation
    {
        private double a ;
        public double A
        {
            get
            {
                return a;
            }
            set
            {
                this.a = value;
            }
        }

        private double b ;
        public double B
        {
            get
            {
                return b;
            }
            set
            {
                this .b =value;
            }
        }

        private double c ;
        public double C
        {
            get
            {
                return c ;
            }
            set
            {
                this.c = value;
            }
        }

      
        public double GetFirstValue()
        {
            double x;
            
            x = (-b + Math.Sqrt(b * b - 4 * a * c)) / (2.0 * a);
            return x; 
        }


        public double GetSecondValue()
        {
            double x;
           
            x = (-b - Math.Sqrt(b * b - 4 * a * c)) / (2.0 * a);
            return x;
        }


    }

2.设计一个堆栈类(MyStack),要求: (1)用重载构造方法确定堆栈的大小,其中无参数构造方法构造的堆栈大小为10,有参数构造方法构造的堆栈大小由参数指定; (2)此堆栈只能压入int类型数据; (3)至少实现Push,Pop两个操作; (4)Push,Pop方法都返回一个bool值,用于说明操作是否成功; (5)用一个控制台应用程序测试这个类。
class MyStack
    {
        private int[] a;
        private int length ;
        private int tail = -1;

        public MyStack()   //重载构造方法
        {
            a = new int[10];
            length = 10;
        }


        public MyStack(int len)  
        {
            a = new int[len];
            length = len;

        }


        public Boolean Push(int x)
        {
            if (tail + 1 == length)
            {
                return false;
            }
            
                a[++tail] = x;
                return true;
            
        }

        public Boolean Pop()
        {
            if(tail < 0)
            {
                return false;
            }
            --tail;
            return true;
        }
    }

  • 值变量的作用域与生命周期
    • 局部变量:方法内声明的变量(包括形参)作用域是该方法内部,方法调用结束时自动消亡;
    • 成员变量:作用域是整个类内部,当对象消亡时才消亡。

五、 Windows窗体

  • 控件的常见属性
    C#程序设计经典教程_第1张图片

  • 列表与选择控件

    • RadioButton(单选按钮)
    • CheckBox(复选框)
    • ListBox(列表框)
      • SelectedIndexChanged表示选中项的索引被改变时触发的事件
    • ComboBox(组合框)
  • 对话框

    • 模态对话框
      • .ShowDialog(),该对话框弹出的时候鼠标不能单击该对话框之外的区域;
    • 非模态对话框
      • .Show() ,在使用这个对话框的过程中需要访问其他窗体的情况。
  • 创建MDI应用程序

将一个窗体设置为主窗体
IsMdiContainer属性设置为true
在主窗体内打开子窗体
FormChild fc = new FormChild();
fc.MdiParent = this;
fc.show();


六、静态成员与静态类

  • 静态成员与非静态成员的区别在于:静态属于类,而不属于类的实例,因此必须通过类来访问,而不能通过类的实例来访问;非静态成员总是与特定实例(对象)相联系。
  • 当类的成员所引用或操作信息与类有关但与类的实例无关时,就应该将其设为静态成员。
  • 静态构造函数不允许重载,也就是不允许定义多个静态构造函数。
  • 静态类特点
    • 仅包含静态成员
    • 不能被实例化
    • 密封的,因此不可继承
    • 不能包含实例构造函数,但仍可声明静态构造函数
    • 优点
      • 编译器能自动执行检查,以确保不添加实例成员
      • 静态类能够使程序的实现更简单、迅速,因为不必创建对象就能调用其方法
  • .Net Framework常用静态类:Console和Math

七、类的继承性

  • B类从A类继承
    • A是父类,B是子类
    • A是基类,B是派生类
  • 优点
    • 提高重用性
    • 提高效率
    • 提供可扩展性
  • .Net类库
    • 层次结构(如控件类库)
    • 最上层Object
  • 派生类自然继承基类的成员,但不能继承基类的构造方法
  • protected修饰符
    • 该成员可以在子类中访问
    • 不能在本类和子类外的其它地方访问
  • 无参数构造方法的调用
    • 创建子类的对象时,若无特殊声明,会先调用父类的无参数构造方法,若无则会出错。
  • 有参数构造方法的调用
    • 要显示调用
    • 强迫系统调用基类带参数的构造函数
      public Dog(string name, int age, string type):base(name, age)
  • 密封类sealed ,不能被继承:提高了应用程序的可靠性和性能;保护知识产权。

八、C#中多态的实现方式

  • 方法的重载
    • 一是派生成员隐藏了基成员

      • 使用new关键字重新定义类的成员。会隐藏父类的相同方法,但以父类对象引用时,仍调用父类方法
    • 二是重写虚的基成员

      • virtualoverride关键字定义类成员
        • 基类中的声明格式:
          public virtual 方法名称([参数列表]){…}
        • 派生类的声明格式:
          public override方法名称([参数列表]){…}
      • 对象引用变得更加灵活

九、抽象类

  • 抽象方法
    • 不包含任何实现代码的方法
  • 抽象类
    • 含有一个或以上抽象方法的类
  • 声明abstract
public abstract class 抽象类名
{
   [访问修饰符] abstract 返回值类型 方法名([参数列表]);
}
  • 抽象方法必须在抽象类中声明,但抽象类也可以包含非抽象成员

十、接口

  • 接口是一种契约,一种标准,一个接口定义一个协定
  • 实现某接口的类必须遵守该接口定义的协定,即必须提供接口成员的实现
  • interface接口成员
    • 方法
    • 属性
    • 事件
  • 方法声明
//不能用public修饰接口方法
[访问修饰符] interface IUsb
{
	void Charge();
	void  TransData(string data);
}
  • 接口的实现
    • 实现接口的类必须实现接口中的所有成员
    public class Mp3:IUsb
    {
      public int MaxSpeed
      {
          get{return 480;}  
      }
      public string TransData(string from,string to)
      {
          return string.Format("数据传输:从{0}到{1}",from,to);
      }
    }
    
    • 实现接口方法时不能使用override
  • 接口支持多重接口,即一个接口可以从多个基类接口派生。不同于类的单一继承
  • 访问接口的成员
    • 通过派生类的实例
    • 通过接口的实例,接口不能直接实例化:先创建其派生类的对象,再将该对象强制转换为接口类型并赋给接口型变量从而创建接口的实例
    Mp3 m = new Mp3();
    IUsb iu = (IUsb)m;
    lblShow.Text = iu.TransData("计算机","Mp3设备");
    

十一、ArrayList

  • ArrayList是一个可动态维护长度的集合
  • Array与ArrayList的主要区别
    • Array的大小是固定的(可以Resize),而ArrayList的大小可根据需要自动扩充;
    • 在Array中一次只能获取或设置一个元素的值,而在ArrayList中允许添加、插入或移除某一范围的元素;
    • Array的下限可以自定义,而ArrayList的下限始终为零;
    • Array可以具有多个维度,而 ArrayList始终只是一维的;
    • Array 位于System命名空间中,ArrayList 位于System.Collections 命名空间中。
  • ArrayList中添加元素例:studs.Add(stu);
  • 可以通过索引来访问其中的元素
    例:Student stu = (Student)studs[0];
  • 删除
    • Remove(Object obj)
    • RemoveAt(int index)
    • Clear()
  • 插入Insert( int index, Object value),在插入后,ArrayList会自动调整索引

ExampleCollectionApp:

//类Student
 public class Student
    {
        private int no;
        private string name;

        public Student(int no, string name)
        {
            this.no = no;
            this.name = name;
        }

        public string ShowMsg()
        {
            return string.Format("学号:{0},姓名:{1}", no, name);
        }
    }

ArrayList

       //窗体
       //存放所有学生
        private ArrayList studs = new ArrayList();

        public FormArrayList()
        {
            InitializeComponent();
        }

        //遍历所有学生的信息,并显示
        private void traverse()
        {
            foreach (Student stu in studs)
            {
                
                lblShow.Text += "\n" + stu.ShowMsg();
            }
        }

  private void btnAdd_Click(object sender, EventArgs e)
        {
            int no = Convert.ToInt32(txtNo.Text);
            string name = txtName.Text.Trim();
            
            Student stu = new Student(no, name);
            studs.Add(stu);
            

            lblShow.Text = "";
            traverse();

            txtName.Text = "";
            txtNo.Text = "";
        }

        private void btnInsert_Click(object sender, EventArgs e)
        {
            int no = Convert.ToInt32(txtNo.Text);
            string name = txtName.Text.Trim();
            int index = Convert.ToInt32(txtIndex.Text);

            Student stu = new Student(no, name);
            studs.Insert(index, stu);

            lblShow.Text = "";
            traverse();

            txtName.Text = "";
            txtNo.Text = "";
            txtIndex.Text = "";
        }

        private void btnForeach_Click(object sender, EventArgs e)
        {
            lblShow.Text = "";
            traverse();
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            
            int index;
            if (int.TryParse(txtIndex.Text.Trim(), out index))
            {
                
                if (index >= 0 && index < studs.Count)
                {
                    studs.RemoveAt(index);
                    lblShow.Text = "";
                    txtIndex.Text = "";
                    traverse();
                }
                else
                {
                    MessageBox.Show("索引号不在范围内,请重新输入");
                    txtIndex.SelectAll();
                    txtIndex.Focus();
                }
            }
            else
            {
                MessageBox.Show("索引号必须是整数,请重新输入");
                txtIndex.SelectAll();
                txtIndex.Focus();
            }

            

        }

Hashtable:哈希表又称散列表,是表示键/值对的集合

  • void Add(object key, object value)
  • void Remove(object key)
private Hashtable htStuds = new Hashtable();

       public FormHash()
       {
           InitializeComponent();
       }

       private void traverse()
       {
           foreach (Object o in htStuds.Values)
           {
               Student stu = (Student)o;
               lblShow.Text += "\n" + stu.ShowMsg();
           }
       }

       private void btnAdd_Click(object sender, EventArgs e)
       {
           int no = Convert.ToInt32(txtNo.Text);
           string name = txtName.Text.Trim();

           Student stu = new Student(no, name);
           htStuds.Add(no, stu);

           lblShow.Text = "";
           traverse();

           txtName.Text = "";
           txtNo.Text = "";
       }

       private void btnDelete_Click(object sender, EventArgs e)
       {
           int key;
           if (int.TryParse(txtKey.Text.Trim(), out key))
           {
               htStuds.Remove(key);
               lblShow.Text = "";
               txtKey.Text = "";
               traverse();
           }
           else
           {
               MessageBox.Show("索引号必须是数字,请重新输入");

           }
       }

       private void btnQuery_Click(object sender, EventArgs e)
       {
           int key = Convert.ToInt32(txtKey.Text);
           Student stu = (Student)htStuds[key];
           lblShow.Text = stu.ShowMsg();
       }

  • 栈Stack类实现了先进后出的数据结构

    • void Push(Object obj) //入栈
    • Object Pop() //出栈
  • 队列Queue实现了先进先出的数据结构

    • void Enqueue(Object obj)
    • Object Dequeue()

十二、程序调试与异常处理

  • 程序错误
    • 语法错误
    • 逻辑错误
    • 运行时错误
  • 异常处理
try
{
	语句块1  //可能引发异常的代码
}
cacth (异常对象)   	//捕获异常类对象
{
	语句块2  //实现异常处理
}
finally
{
	语句块3     //无论是否异常,都作最后处理
}

throw语句与自定义异常

//自定义异常类
class NotEquation:Exception                                
    {
        public NotEquation(string str1) : base(str1) {}
       // public NotEquation(string str1,Exception e) : base(str1,e) { }
       
    }
         try
         {
           ......
               if(a==0)
                {
                    throw new NotEquation("这不构成一元二次方程");
                }
               else if( b * b - 4 * a * c < 0 )
                {
                    throw new NotEquation("此方程无实根");
                }
               else
                {
                    AEqution aeq = new AEqution(a, b, c);
                    Console.WriteLine("X1={0}",aeq.getFirstRoot());
                    Console.WriteLine("X2={0}",aeq.getSecondRoot());
                }
                
           }
           
            catch(System.Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                Console.WriteLine("执行完毕!");
            }

上机实验7(P184-186)实验报告

public partial class Form : System.Windows.Forms.Form
    {
        public Form()
        {
            InitializeComponent();
        }

        private void btnSort_Click(object sender, EventArgs e)
        {
            try
            {
                string[] source = txtSource.Text.Split(',');
                int[] a = new int[source.Length];

                for (int i = 0; i < source.Length; i++)
                {
                    a[i] = Convert.ToInt32(source[i]);
                }


                for (int i = 1; i < a.Length; i++)
                {
                    for (int j = i; j <= a.Length - i; j++) //for (int j = 1; j <= a.Length - i; j++) 
                    {
                        if (a[j - 1] > a[j])
                        {
                            int t = a[j - 1]; a[j - 1] = a[j]; a[j] = t;
                        }
                    }
                }


                foreach (int t in a)
                {
                    lblShow.Text += string.Format("{0,-4:D}", t);
                }

            }
            catch(Exception ex)
            {
                lblShow.Text= ex.Message;
            }
           
        }
        

断点下在循环语句开始前,对i,j,a[]添加监视,逐行执行程序,发现造成不完全排序的原因是 for (int j = i; j <= a.Length - i; j++)语句,j递增的起点随i的递增儿增加,从而不能对前面做完比较造成排序不完全准确。


十三、 数据库编程技术

学习重点

  • 使用Connection 和Command 对数据库的操作。
  • 掌握DataSet、DataAdapter、DataReader 对象的作用和使用方法。——难点
  • 使用DataGridView结合ADO.NET对数据库的修改和查询操作。

使用Connection对象访问数据库

  • 定义连接字符串
    string connString ="Data Source=服务器; Initial Catalog =数据库名; Integrated Security=True";
  • 创建Connection对象
    SqlConnection conn = new SqlConnetion(connStrign);

双击‘登录’按钮实现用户验证登录

private void btnLogin_Click(object sender, EventArgs e)
        {
            string ln = txtLoginName.Text.Trim();
            string pwd = txtPassword.Text.Trim();
            string connStr = "Data Source = (localdb)\\MSSQLLocalDB;Initial Catalog = BookTestDb; Integrated Security = True";
            SqlConnection conn = null;
            string sql;
            try
            {
                conn = new SqlConnection(connStr);
                sql = string.Format("SELECT COUNT(*) FROM LoginUser WHERE LoginName = '{0}' AND Password = '{1}'", ln, pwd);

                conn.Open();
                SqlCommand comm = new SqlCommand(sql, conn);
                
                int n = (int)comm.ExecuteScalar();//执行查询语句,返回匹配的行数
               

                if (n > 0)
                {
                    MessageBox.Show("登录成功!", "提示");
                    FormMain fm = new FormMain();
                    fm.Show();
                    this.Hide();

                }
                else
                {
                    MessageBox.Show("登录不成功,退出!", "提示");
                    Application.Exit();
                }
            }
            catch(SqlException se)
            {
                MessageBox.Show(se.Message,"操作数据库出错!",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
            }
            finally
            {
                conn.Close();
            }
            
        }

走了~

你可能感兴趣的:(C#,面向对象编程)