• c# 入门


    程序集

      对应于vs中的一个项目工程,是一个单独的程序文件。程序文件分为两类,dll类和exe应用程序

    命名空间

      和c++的命名空间差不多是一个作用,定义一个作用域。在c#的命名空间中,只能够声明结构体,类,接口,委托或命名空间等类型,但是不能定义这些类型的变量和对象。因为在c#中只能在类里面定义对象。

    类型

      类型可以分为值类型和引用类型。其中内建的基本类型,枚举和结构体属于值类型,剩余的string,类,接口,委托等都是引用类型。在对象赋值时,只有通过new才是在内存中分配内存空间创建新的对象,否则只是引用的传递。

    与c++主要有以下区别:

    1、关键字class前面可以添加限定符,常用的限定符有下面几个:

    1)、abstract:表示这是一个抽象类

    2)、partical:表示当前定义只是类的部分定义,在其他地方还有这个类的定义

    3)、sealed:表示这个类不能够被继承

    2、只能有一个继承类,并且只有公有继承

    3、在继承类的后面,可以继承一个或多个接口

    4、与c++相比,类的成员更加丰富

    1)、增加了属性的成员,其实就是增加对私有成员的访问,私有成员一般变量一般以下划线开头。属性实现对私有成员的访问和赋值以及有效性检查。形式为

    ///属性没有形参,自动有一个参数value实现对私有变量的赋值,返回值类型就是私有变量的类型

    public long Number

    {

      get{return _num;}///访问值

      set{_num = value;}///赋值,也可以不要set,定义一个只读属性

    }

    2)、类的每个成员前面都有访问权限的关键字,不像c++把具有相同权限的成员写在一起,c#一共有五个访问权限

    1))、public:任何程序集的类型都可以访问

    2))、protected:任何程序集的这个类的派生类可以访问

    3))、internal:同一程序集的类型可以访问

    4))、protected internal:同一程序集的这个类的派生类可以访问

    5))、private:这能在这个类型的内部访问

    定义类的默认权限是internal,类成员的默认类型是private,类实例的默认值是null

    3)、事件

    限定符 event 委托类型名 事件名;

    在这个定义中event与委托类型联系起来,然后委托再与方法联系起来,这样调用事件时,就能这样调用到委托对应的方法。所以要实现一个完整的调用,要完成下列步骤:

    1))、声明委托类型,委托的实质其实就是一个函数指针,因此其定义类似于函数方法的定义,它一般有两个参数,第一个参数一般表示发生事件的类的对象,第二个参数一般是一个事件参数。当然有些委托比较简单,这两个参数都没有,只传递了一个具体的参数类型,;事件对象和委托的声明一般是在一个类里面的,示例如下:

    public delegate void MyButtonEventHandler(string msg);

    internal class KeyInputMonitor
    {
        // 创建一个委托,返回类型为void,两个参数
        public delegate void KeyDownHandler( object sender, KeyEventArgs e );
        // 将创建的委托和特定事件关联,在这里特定的事件为KeyDown
        public event KeyDownHandler KeyDown;
    
        public void Run()
        {
            bool finished = false;
            do
            {
                Console.WriteLine( "Input a char" );
                string response = Console.ReadLine();
    
                char responseChar = ( response == "" ) ? ' ' : char.ToUpper( response[0] );
                switch( responseChar )
                {
                    case 'X':
                        finished = true;
                        break;
                    default:
                        // 得到按键信息的参数
                        KeyEventArgs keyEventArgs = new KeyEventArgs( responseChar );
                        // 触发事件
                        KeyDown( this, keyEventArgs );
                        break;
                }
            }while( !finished );
        }
    }

    2))、如果需要用到事件参数,就需要定义事件参数类,EventArgs是所有事件参数类的基类

    internal class KeyEventArgs : EventArgs
    {
        private char keyChar;
        public KeyEventArgs( char keyChar ) : base()
        {
            this.keyChar = keyChar;
        }
    
        public char KeyChar
        {
            get
            {
                return keyChar;
            }
        }
    }


    3))、创建事件对象处理类

    internal class EventReceiver
    {
        public EventReceiver( KeyInputMonitor monitor )
        {
            // 产生一个委托实例并添加到KeyInputMonitor产生的事件列表中
            monitor.KeyDown += new KeyInputMonitor.KeyDownHandler( this.OnKeyDown );
        }
        private void OnKeyDown(object sender, KeyEventArgs e)
        {
            // 真正的事件处理函数
            Console.WriteLine( "Capture key: {0}", e.KeyChar );
        }
    }

    4))、调用过程

    public class MainEntryPoint
    {
        public static void Start()
        {
            // 实例化一个事件发送器
            KeyInputMonitor monitor = new KeyInputMonitor();
            // 实例化一个事件接收器
            EventReceiver eventReceiver = new EventReceiver( monitor );
            // 运行
            monitor.Run();
        }
    }

    事件和委托的区别
    1、委托在任何地方都可以被调用,比较灵活

    2、事件只能在特定的事件触发函数中被调用,如果控件的事件函数,在其他地方调用会直接报错,它保证了只有在界面上触发消息时,事件才能被调用

    参考:http://blog.csdn.net/lulu_jiang/article/details/6451300#comments

    4)、索引器

    5)、构造函数

    构造函数分为静态构造函数和实例构造函数

    1))、静态构造函数

    静态构造函数与c++的构造函数相比,在函数名的前面多了一个static关键字,虽然可以定义,但是不能显式的调用静态构造函数,它的调用顺序发生在初始化类的静态成员之后,调用类的静态成员函数或实例化类对象之前。

    2))、实例构造函数

    限定符 构造函数名(参数列表):this(参数列表),base(参数列表)

    上面定义跟c++还是有区别的,它可以添加限定符,并且还是调用该类的其他构造函数

    6)、析构函数

    一般情况下是不需要显示的定义析构函数的,因为会自动释放资源,显示定义析构函数可能会造成资源被释放两次

    5、接口

    限定符 interface 接口名:继承接口列表

    说明

    1)、接口不能实例化

    2)、接口里面的类成员没有权限类型,并且也没有这些方法的实现

    6、关键字

    1)、abstract

    修饰类表示这是一个抽象类;修饰成员表示这个成员没有实现,必须在派生类中进行实现

    2)、as

    把一个类型转化为另一个类型,发生错误就返回null,例如

    object obj = GetPhotoObj();

    PhotoGraph pgObj = obj as PhotoGraph;

    3)、base

    表示这个类的基类

     4)、is

    确定一个对象是否可以转化为指定对象,返回值为bool类型

    5)、lock

    把一个作用域内的语句标记为关键段,表示同一时间只能有一个线程可以执行

    lock (this)
                {
                    
                }

    6)、out
    函数参数的修饰符,表示这样的参数会影响实参值,这样的参数不能初始化

    7)ref

    与out类似,只是ref的参数必须被初始化

    ref和out的比较

    1、ref和out都是按地址传递。但是out只会传递引用而不传值,就是说该引用对应的值是无法传递到方法内部的,所以out型参数额不用在外面初始化,必须在方法内部进行初始化。而ref则是引用和值都会传递,这就要求ref参数要在调用之前进行初始化。

    2、上面原理的不同决定了它们的作用有所不同。out无法传进引用值,所以他的作用相当于方法可以有多个返回值。而ref可以传进值,它的作用相当于对传入参数值的处理过程。

    3、ref,out参数方法的定义和使用都要显示的调用其修饰符。

    4、虽然ref和out的运行机制不一样,但是它们在编译时却被认为是完全一样的,因此不能重载类型相同,但是ref和out修饰符不同的方法。但是有修饰符和无修饰符的方法则是可以重载的。

    5、综上,ref在方法中是可进可出,out是只出不进

    8)override

    在派生类中重写基类的虚函数

    8)、sealed

    表示一个类无法被继承,不能修饰抽象类

    7、数组

    数组array类型属于system.Array的命名空间,是引用类型,而ArrayList则属于System.Collections

    8、常见的命名空间

    1)System.Collections

    这个命名空间提供了常用的数据结构,如果列表arraylist,堆栈,散列表,字典等等。另外两个字命名空间Generic和ObjectModel提供了泛型数据结构的支持,就是c++里面的类模板,可以指定具体的数据类型。

  • 相关阅读:
    LFU
    poj 3581 -- 后缀数组
    leetcode 679
    poj 两条线段接雨水
    poj 1696极角排序
    判断平面上是否有一条直线与所有线段相交
    洛谷P3808 【模板】AC自动机(简单版)
    Most Distant Point from the Sea UVA
    P2742 [USACO5.1]圈奶牛Fencing the Cows /【模板】二维凸包
    P2249
  • 原文地址:https://www.cnblogs.com/suntp/p/6753305.html
Copyright © 2020-2023  润新知