【C#】学习笔记

一.C#语言的简介及背景


1.C#语言是面向对象的语言。使用它可以构建.NET Framework上运行的各种应用程序,包括创建Windows客户端应用程序、XML Web Service、分布式组件、客户端、服务器应用程序、数据库应用程序等。C#的开发环境是基于.NET Framework,通过公共的跨语言API集,进行程序处理。

2.C是面向过程的语言,C++支持面向过程和对象,C#是纯粹面向对象的。从应用来说,C在底层用的最多,如开发操作系统、基本的网络协议;C++在中间层用的比较多,如开发应用程序;C#在上层用得比较多,如创建ASP。

3.平台体系结构.NET Framework是微软提供的一个支持微软和第三方开发语言在内的公共的开发环境,简称.NET架构,如Cobel、Perl、Python、Visual Basic、Visual C++等开发语言。

4..NET框架定义了.NET应用程序的开发和运行环境,包括可在.NET应用程序中使用的类库,它类似于Java的虚拟机(JVM)。开发人员可以在此平台或环境下开发各种引用程序。用C#编写的程序必须在.NET Framework上运行,所以首先要安装.NET Framework。

5..NET Framework是支持生成和运行下一代应用程序和XML Web Services的内部Windows组件。.NET Framework有两个主要的组件:公共语言执行库(CLR)和.NET Framework类库。执行C#程序时,程序将加载到CLR中,然后由CLR执行即时编译程序生成中间语言(IL)代码并转换为机器指令。公共语言类型库是.NET Framework的基础,提供内存管理、线程管理和远程处理等核心服务,并强制实施严格的类型安全检查来提高安全性和可靠性。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码则称为非托管代码。.NET Framework的另一个主要组件是类库,它是一个综合性的、面向对象的、可重用的类型集合,可开发各种类型的应用程序。

6.使用.NET Framework编写应用程序,就是使用.NET代码库编写代码。.NET所支持语言编写的代码先编译成微软中间语言代码,再由即时编译器转换成机器代码。这种编译方式实现了代码托管,提高了程序的运行效率。

7.C#程序编译运行的简单步骤是:
(1)C#程序编译为中间语言代码。
(2)C#编译器生成程序集(.exe或者.dll文件)
(3)CLR执行程序集,生成本地代码。
 

 二.C#基本语法

1.变量定义啥的和c语言差不多

2.数组的定义

(1)一维数组:

int []a=new int[100];        
int []b;b=new int[10];

 (2)二维数组:

int [,]a=new int[2,3];    //2行3列
int [,]b; b=new int[2,3];

(3)输入输出:

1.
char a =char.Parse( Console.ReadLine());    
//Parse(string s)方法是将String转换成int,char等
string s = Console.ReadLine();
Console.WriteLine("{0},{1}", a,s);
2.
char  a = Convert.ToChar(Console.ReadLine());
Console.WriteLine(a);

 (4)补充

int a=10;
textBox1.Text=a.ToString();    //填充文本框

三.C#面向对象编程 

1.类的继承和成员访问控制 

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            A f = new A();    //其他类(包括父类和子类的对象)只允许访问public修饰的变量
            f.a = 100;
        }
    }
 
    class A
    {
        public int a;
        protected int b;
        private int c;
        void fun()
        {
            a = 1;
            b = 2;
            c = 3;
        }
    }
    //A是基类,B是A的派生类
    class B : A    //B继承A,B可以访问A中的public和protected修饰的变量
    {
        void fun1()
        {
            base.a = 10;
            base.b = 20;
            a= 10;    //从父类中继承的变量也可以使用,这个相当与B的变量
            b = 20;
        }
    }
 
}

  2.类的构造函数

(1)说明:构造函数可以由多个,但是必须与类名同名,不允许有返回类型,要用public修饰 

using System;
 
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            A a1 = new A();        //调用无参数构造函数
            A a2 = new A("as");    //调用一个参数构造函数
            A a3 = new A("asd", 12);//调用2个参数构造函数
        }
    }
 
    class A
    {
        string name;
        int age;
        public A() { }    //3个A的构造函数形成了重载,普通函数也可以重载,返回值类型也可以不同
        public A(string name)
        {
            this.name = name;
        }
        public A(string name,int age)
        {
            this.name = name;
            this.age = age;
        }
    }
  
 
}

  3.类的属性

(1)属性的主要作用是对字段的读和写,因此又把属性叫做字段访问器。get为读访问器,set为写访问器

using System;
 
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            A a1 = new A();
            a1.Name = "牛";
            Console.WriteLine(a1.Name);
        }
    }
    class A
    {
        private string name;    //私有成员变量
        public string Name     //定义属性
        {
            get             //可读
            {
                return name;
            }
            set         //可写,value是一种特殊的变量,用于接收对属性赋的值
            {
                //if(value=null) name="";这里可以自己写判断语句
                name = value;
            }
        }
        public string shuchu()
        {
            return name;
        }
        //后面简化为下面那种格式
         public long Id { get; set; }
    }
  
 
}

4.类的静态成员

(1)静态成员属于类所有,非静态成员属于类的实例所有,又称实例成员。

(2)静态成员可以通过类名来访问,非静态成员需要通过对象名访问。

5.类的多态

(1)编译时的多态:通过方法重载实现的,特点:方法名必须相同,参数列表必须不同,返回值类型可以不同。

(2)运行时的多态:基于虚方法重写的多态,虚方法是在基类中定义的,用virtual修饰,在派生类中重写此虚方法,用override修饰,如果不加修饰符,则只执行父类的方法。

using System;
 
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            A[] a = new A[3];
            a[0] = new A();
            a[1] = new B();
            a[0].Eat();
            a[1].Eat();
        }
    }
 
    class A
    {
        public virtual  void Eat()
        {
            Console.WriteLine("as");
        }
    }
    class B : A   
    {
        public override void Eat()
        {
            Console.WriteLine("asd");
        }
    }
 
}

6.运算符的重载

(1)运算符重载的本质就是方法重载,只是借用了运算符的名称,通过重载技术扩展运算符的功能,使得对象或相关的结构实体都可以作为操作数来参加运算。

(2)一元运算符重载:

using System;
 
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            A a = new A(100);
            Console.WriteLine(++a.data);
        }
    }
 
    class A
    {
        public int data;    //不加修饰符,默认为private
        public A(int data)
        {
            this.data = data;
        }
        public static A operator ++(A para)
        {
            Console.WriteLine("执行重载运算符++");
            return new A(1 + para.data);
        }
    }
   
 
}

(3)二元运算符的重载

using System;
 
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            A a1 = new A(1, 3);
            A a2 = new A(10, 20);
            Console.WriteLine((a1 - a2).shuchu());
        }
    }
 
    class A
    {
        int x, y;
        public A(int x,int y)
        {
            this.x = x;
            this.y = y;
        }
        public string shuchu()
        {
            return string.Format("坐标{0},{1}", x, y);
        }
        public static A operator-(A p1,A p2)
        {
            return new A(p1.x - p2.x, p1.y - p2.y);
        }
    }
   
 
}

7.接口的实现

(1)定义的类必须提供被继承接口中所有成员的实现,接口成员前面不允许有修饰符,都默认为public

using System;
 
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Point p = new Point(5, 30);
            Console.WriteLine("x={0},y={1}", p.x, p.y);
        }
    }
    interface IPoint
    {
        int x { get; set; }     //定义属性成员x,它含有读写抽象访问
        int y { get; set; }
    }
    class Point : IPoint
    {
        int px, py;
        public Point(int x, int y)
        {
            px = x;
            py = y;
        }
        public int x
        {
            get { return px; }
            set { px = value; }
        }
        public int y
        {
            get { return py; }
            set { py = value; }
        }
    }
}

8.委托与事件

(1)委托:方法的委托就是方法的别名,通过委托不但可以执行方法,而且可以将方法传到其他的方法中,实现方法回调。

using System;
 
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Handler my = new Handler(A.M);  //实例一个委托
            int sum = my(2, 9);     //调用委托
            Console.WriteLine(sum);
        }
    }
    delegate int Handler(int a, int b); //声明一个委托
    public class A
    {
        public static int M(int a,int b)    //静态的处理方法
        {
            int c ;
            c = a + b;
            return c;
        }
    }
}

(2)事件: 在操作发生时允许执行特定应用程序的代码机制。

using System;
 
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Heater heater = new Heater();
            Alarm alarm = new Alarm();
            heater.BoilEvent += alarm.MakeAlert;//给alarm的MakeAlert方法订阅事件,当事件发生时通知订户
            heater.BoilEvent += Display.ShowMsg;//订阅Display的静态方法
            heater.BoilWater();                 //会自动调用订阅过的静态方法
        }
    }
    public class Heater //热水器类
    {
        private int temperature;    
        public delegate void BoilHandler(int param);    //声明事件的委托
        public event BoilHandler BoilEvent;     //声明事件
        public void BoilWater()     //编写事件处理方法
        {
            for(int i=0;i<=100;++i)
            {
                temperature = i;
                if(temperature>96)
                {
                    if(BoilEvent!=null)
                    {
                        BoilEvent(temperature); //编写引发事件的方法
                    }
                }
            }
        }
    }
    public class Alarm
    {
        public void MakeAlert(int param)
        {
            Console.WriteLine("Alarm:滴滴滴,水已经{0}度了:", param);
        }
    }
    public class Display
    {
        public static void ShowMsg(int param)
        {
            Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", param);
        }
    }
}

9.异常处理

(1)异常对象e的相关属性:

try
{
    int[] p = new int[20];
    p[30] = 10;
}
catch (Exception e)
{
    Console.WriteLine("产生异常的原因:{0}\n",e.Message);
    Console.WriteLine("异常的方法调用堆栈:{0}\n", e.StackTrace);
    Console.WriteLine("产生异常的对象是:{0}\n", e.TargetSite);
    Console.WriteLine("异常的程序对象来源是:{0}\n", e.Source);
}

四.窗体应用

1.控件的属性、方法和事件

(1)属性

<1>Name属性:由控件类型和序号组成,可以通过该属性的值来引用这个控件。

<2>Text属性:显示的文本

<3>Font字体属性:改变相应文字的字体样式等

<4>Visible可见属性:表示控件是显示还是隐藏

<5>Enabled可用属性:表示控件是否可以使用

(2)方法

<1>Show方法:让窗体显示出来

<2>Hide方法:把窗体隐藏起来

<3>Refresh方法:刷新并重画窗体

<4>Close方法:关闭窗体

<5>ShowDialog方法:将窗体显示为模式对话框

(3)事件

<1>Load事件:在窗体加载到内存时发生,即在第一次显示窗体前发生

<2>Resize事件:改变窗体大小时发生

<3>Paint事件:在重绘窗体时发生

<4>Click事件:用户单击窗体时发生
<5>Closed事件:关闭窗体时发生


2.按钮类控件

(1)Button 按钮控件

<1>DialogResult属性:获取或设置一个值,该值在单击按钮时返回到父窗体

<2>Image属性:获取或设置显示在按钮上的图片

<3>FlatStyle属性:获取或设置按钮的平面样式外观

(2)RadioButton 单选按钮控件

       解释:只能选择一个

(3)CheckBox复选框控件

      解释:可以同时选择多个

(4)RadioButton和CheckBox控件的相同

<1>Checked属性:表示控件是否被选中的状态

<2>Click事件:单击控件时,把按钮的Checked属性值置为true,同时发生Click事件

<3>CheckedChanged事件:当Checked属性值更改时,触发该事件

3.文本类控件

(1)Label标签控件:作用是在窗体上显示文本

(2)TextBox文本框控件

<1>MaxLength属性:设置输入到文本框中的最大字符数

<2>Multiline属性:设置是否可以显示多行文本

<3>ReadOnly属性:表示该文本是否为只读

<4>ScrollBars属性:指示多行文本框是否显示滚动条

<5>SelectedText属性:在文本框中选择的文本

<6>WordWrap属性:在多行文本框中,如果某行文字的宽度超过了控件本身的宽度,其文本是否自动换行

<7>该控件的主要作用是用户涌起进行文本的输入,TextBox控件最常用的是TextChange事件,当文本框中的文本发生变化,该事件将被触发。它也经常用到Focus方法,该方法是为文本框设置焦点。

(3)RichTextBox富文本框控件

该控件继承自TextBox控件,他还增加了让用户

4.列表类控件

(1)ListBox列表框控件

(2)CheckedListBox带复选框的列表框控件

(3)ComoBox组合框控件

(4)ListView列表视图控件

(5)TreeView树形视图控件

<1>ImageList:指定各节点可以使用的图标集合

<2>ImageIndex:控件中各节点的默认图标在指定ImageList中的索引

<3>Nodes:获取控件中根节点的集合

<4>ShowPlusMinus:设置是否在父节点处显示加减号

<5>ShowRootLines:设置是否显示各根节点之间的连接线

<6>SelectedNode:获取或设置控件中被选中的节点

<7>Sorted:设置是否对根节点进行排序


5.常用组件

(1)OpenFileDialog打开文本对话框组件

(2)SaveFileDialog保存文件对话框组件

(3)FontDialog字体和ColorDialog颜色对话框组件

5.FolderBrowserDialog文件夹浏览对话框组件

6.模式对话框和非模式对话框

(1)模式对话框:是指用户只能在当前的窗体中进行操作,在该窗体没有关闭之前不能切换到其他的窗体,采用Form的ShowDialog方法来调用

(2)非模式对话框:当前所操作的窗体间可以切换,采用Show方法调用

7.基于MessageBox类的消息对话框

8.菜单和工具栏的设计

(1)主菜单:C#提供MenuStrip组件来帮助用户设计菜单

(2)弹出式菜单:右键时弹出,使用ContextMenuStrip

五.数据库开发技术

在C#语言中对数据库的访问是通过.NET框架中的ADO.NET实现的,ADO.NET是重要的应用程序级接口,用在Microsoft.NET平台上提供数据访问服务。

1.使用SQL Server数据库

2.ADO.NET类

(1)提供者对象:专用于每一种类型的数据源,专用于提供者的对象完成数据源中实际的读取和写入工作

<1>提供者对象即在每一个.NET数据提供者中定义的对象,其名称前都带有特定的提供者名称。

<2>连接对象:用于任何其他ADO.NET对象之前,它提供了到数据源的基本连接。用于SQL Server.NET提供者的类就是SqlConnection,用于OLE DB的就是OleDbConnection

<3>命令对象:对数据源发生命令,例如,使用select语句查询表中的数据。用于SQL Server的SqlCommand,用于OLE DB的OleDbCommand,

<4>CommandBuilder对象:用于构建SQL命令,在基于单一表查询的对象中进行数据修改。用于SQL Server的SqlCommandBuilder,用于OLE DB的OleDbCommandBuilder

<5>DataReader对象:可以从数据源中读取数据流,用于SQL Server的SqlDataReader,用于OLE DB的OleDbDataReader

<6>DataAdapter对象:针对数据源的各种操作,包括更新变动的数据,填充DateSet对象以及其他操作。用于SQL Server的SqlDataAdapter,用于OLE DB的OleDbDataAdapter

(2)用户对象:将数据读入到内存中后用来访问和操纵数据的对象

<1>用户对象用于定义ADO.NET的断开的、客户端的对象,它们与.NET数据提供者不相关,存在于System.Data命名空间中

<2>DataSet对象:用户对象中首要的对象,此对象表示一组相关表,在应用程序中这些表作为一个单元来引用。有了此对象,可以快速地从每一个表中获取所需要的数据,并且可以在断开数据库的情况下检查并修改数据,然后再在另一个操作中使这些修改的数据更新到数据库当中。

<3>DataTable对象:代表DataSet中的一个表

DataTable对象允许访问其中的行和列;DataColumn对象代表表中的一列;DataRow对象代表表中关联数据的一行


3.用DataReader读取数据

(1)DataReader对象的最大优点就是执行效率高,在体积和开销上比数据集小,占用内存小。DataReader对象从数据源中提供高性能的数据流,但只能检索数据流,不能写入,并且只能从头至尾往下读,而不能只读某行记录。由于DataReader对象与服务器的连接在读取数据时始终打开,所以每次使用DataReader方法对象完成后要及时调用Close方法关闭它。


4.用DataSet读取数据

(1)DataSet是ADO.NET中的核心对象,所有复杂级别的操作都要使用它。每一个DataSet对象通常是一个或多张数据表(DataTable对象)的集合。数据表(DataSet)相当于内存中暂存的数据库,不仅可以包括多张数据表,还可以包括数据表之间的关系和约束。允许将不同类型的数据表复制到同一个数据集中,甚至还允许将数据表与XML文档组合到一起协同操作。数据集从数据源中获取数据以后就断开了与数据源之间的连接。允许在数据集中定义数据约束和表关系,增添、删除和编辑记录,还可以对数据集中的数据进行查询、统计等。党完成各项数据操作后,还可以将数据集中的最新数据更新到数据源。

(2)用数据填充DataSet:DataSet常见的操作是用DataAdapter对象的Fill方法给它填充数据。DataSet是内存中数据的一个抽象表示,而DataAdapter对象是把DataSet和具体数据库联系起来的对象。

(3)访问DataSet中的表、行和列:DataSet对象有一个Tables属性,它是DataSet中所有DataTable对象的集合。Tables的类型是DataTableCollection,它有一个重载的索引符,于是可以用2种方式访问每个DataTable,即按表名访问和按索引访问。

(4)DataSet类似一个离线数据库,所以DataSet对象中的数据是以DataTable对象存储的。DataTable就是一张数据表
 

5.在DataSet中访问多个表

(1)DataSet是ADO.NET框架的主要组件,是数据以XML的形式驻留于内存的表示形式,它将数据源中检索到的数据存放在内存的缓存中。DataSet由表、关系和约束的集合组成,在ADO.NET中,DataTable对象用于表示DataSet中的表。DataSet表示整个数据集,包括对数据进行包含、排序和约束的表以及表间关系。DataSet对象可以记录多个表和它们之间的关系,这表示可以在一个操作的不同程序段之间传递完整的相关数据,体系结构内在地维护数据之间关系的完整性。


6.ADO.NET中的SQL支持

(1)读写数据源的所有ADO.NET命令都被转换为SQL命令,执行初始的数据库操作。DataAdapter对象通过Select命令自动生成insert、delete和update命令。

(2)对于有返回数据的SQL命令需要使用SqlDataAdapter来执行,对于无返回数据的SQL命令使用SqlCommand来执行。

(3)调用SQL存储过程:SQL存储过程是用SQL语言编写的一个过程,是存储在数据库中的。存储过程在一个单元中封装了复杂的SQL查询和数据库过程,可以由多个应用程序或者用户直接调用。只要调用存储过程,数据库管理者就可以确保执行相同的步骤,对数据库的使用也可以保持一致。用户和应用程序开发者都不必记忆复杂的SQL查询语句,只需要知道存储过程的名称和作用就可以。

六.数据绑定

通过数据绑定来实现程序对数据库的访问,创建一个数据库连接。

你可能感兴趣的:(C#,c#,学习,开发语言)