.net 常用基础

 

1.常用术语


    Microsoft intermediate:(IL) MS 中间语言
    Common language specification:(CLS) 公共语言规范
    CLR:公共语言运行库
    managed code:托管代码
    attribute:特性
    assembly:程序集
    windows presentation foundation:WPF
    windows Communication Foundation:WCF
    Pascal 命名:帕斯卡命名 首字母大写
    camel 命名:骆驼命名 第一个字母小写 其他首字母大写
    public :公共的
    private:私有的
    Protected:受保护的
    internal:内部的
    abstract:抽象的
    sealed:密封的
    new :新的
    partial:部分的
    static:静态的
    callback:回调
    delegate:委托
    event:事件
    where T class:类型T必须是类类型
    where T struct:类型T必须是结构类型
    Lanauage integrated query:LINQ 集成语言查询


2.泛型


    可以创建独立于类型的类,方法,接口,委托等,泛型引入了一种新的编程方式。
    在声明的时候设置泛型,在使用的时候设置实际类型。
    
    2.1.使用泛型创建一个具有多个数据类型的类。
    class Data
    {
        public string Name{ get; set; }
    }

    class Data<T>:Data
    {
        public T Value1 { get; set; }
    }

    class Data<T,T1> : Data<T> 
    {
        public T1 Value2 { get; set; }
    }

    class Data<T,T1,T2> : Data<T,T1>
    {
        public T2 Value3 { get; set; }
    }
    
    
    
    //通过泛型和继承的使用,定义了一个具有多个类型的参数。
    
    Data data;
    Data<string> data1;
    Data<string, string> data2;
    Data<string, int, decimal> data3;
            
    
    
    
    2.2.泛型接口
    
     interface iTest<T> 
    {
        T GetMember();
    }

    class MyTest<T>: iTest<T>
    {
        List<T> lst = new List<T>();

        public MyTest()
        {
            lst.Add(default(T));
        }
        public virtual T GetMember()
        {
            if (lst.Count == 1)
            {
                return lst[0];
            }
            else
            {
                return default(T);
            }
        }
    }
    
    2.3.泛型委托
     Action<string> action = delegate (string name) { };
     Action<string,string> action = delegate (string name,string sex) { };
     
     Action 是c# 系统的泛型委托,这里 委托的参数使用了泛型,结果是我们可以非常灵活的
     定义委托参数的个数和类型。
     
    
    2.4.可空类型的泛型使用,下面的代码意思是一样的。
      Nullable<long> x1 = null;
            long? x2 = null;
    
    2.5.继承中泛型的注意事项
    
        class ParentTest<T>
        {
            public T t { get; set; }

        }

        如果 子类不是泛型,则父类需要指定类型
        class Child:ParentTest<string>
        {

        }
        
        如果子类也是泛型则子类和父类都不指定类型,。
        class Child<T>:ParentTest<T>
        {

        }
    
    2.6.系统的集合类大量使用了泛型
    
        List<T> lst;//列表
        Dictionary<Tkey,TValue> dic;//字典
    
    

3.反射


    
    2.1.类型
    
     System.Type type = typeof(int);
     
     Name:类型名称
     FullName:类型完整名称 ,包括命名空间。
     GetMethods() 获取所有的方法
     GetMembers() 获取所有的成员
    
    3.2.创建类的实例对象
    System.Type type = typeof(FileHelper);
    var tm = System.Activator.CreateInstance(type,true);
    
    
    3.3.发射使用的场景 
        IOC框架使用反射创建对象
        
      
      
     
    
    

4.多线程


    4.1.System.Threading.Thread
    
     System.Threading.Thread thread = new System.Threading.Thread(
                new System.Threading.ThreadStart(delegate() {
                    MessageBox.Show("test");
                }));

            thread.Start();
            
    前台线程和后台线程,区分前台程序和后台线程很有必要。
    一个进程至少有一个前台线程,否则进程会结束运行。
    Thread 默认是前台线程,线程池中的线程总是后台线程。
    
    设置 IsBackground=true 可以设置后台线程。
    
    Start() 启用一个线程
    Abort() 停止一个线程
    
    线程Start() 之后不一定会立刻运行线程的,因为真正运行线程的是操作系统的线程
    调度器进行的。
    
    4.2.同步
        Lock语句:单个进程内部同步
        
        Mutex 类:多个进程的线程同步
            禁止程序启动2次。
        
        使用Mutex类可以创建有名称的互斥,而系统可以识别有名称的互斥,因此可以使用Mutex类禁止应用程序启动两次
        static void Main(string[] args)
        {
            bool createdNew;
            var mutex = new System.Threading.Mutex(false, "SingletonApp", out createdNew);
            if (!createdNew)
            {
                return;
            }
            else
            {
                Console.WriteLine("Good job!");
                Console.ReadLine();
            }
        }
            
        
        
    4.3.System.Threading.Tasks.Task
        
        Task 是线程的包装,使用task比Thread 更加方便,功能也更多。
        
        
        
            Task t = new Task(() =>
            {
                Console.WriteLine("任务开始……");
            });
            t.Start();
            t.ContinueWith((task) =>
            {
                System.Threading.Thread.Sleep(2000);
                Console.WriteLine("执行任务1");
            }).ContinueWith((task) =>
            {
                System.Threading.Thread.Sleep(1000);
                Console.WriteLine("执行任务2");
            }).ContinueWith((task) =>
            {
                System.Threading.Thread.Sleep(300);
                Console.WriteLine("执行任务3");
            }).ContinueWith((task) =>
            {
                Console.WriteLine("任务完成.......");
            });

            Task.WaitAll(t);
            
        Start() 执行任务
        ContinueWith() 创建 下一个要执行的任务,使用ContinueWith可以组合多个要完成的任务。
        WaitAll() 等待所有任务执行完,否则就在这里等待。
        
        
    
    4.4.WPF和winform 的多线程
        
        WPF:Dispatcher
        //1.报错
        Task.Run(() => {
                
                 btn.Content = "新名称";
                
            });
            
        //2.正常
        Task.Run(() => {
                this.Dispatcher.Invoke(()=> {
                    btn.Content = "新名称";
                });
            });
        
        
        
        winform:invoke
        
        //异常
         Task.Run(()=> {
                button1.Text = "测试呢";
            });
        //正常
        Task.Run(() => {
           Invoke(new Action<string>((text)=> {
                button1.Text = text;
            }),"test");
        });
        


5.文件(file),目录(directory)

 

    5.1 System.IO.File
        静态类,提供用于创建、复制、删除、移动和打开单一文件的静态方法。
            
            Exists() 文件是否存在
            AppendAllText() 追加文本,关闭文件
            WriteAllText() 写文本,关闭文件
            ReadAllText() 都文本,关闭文件
            Delete() 删除文件
            Create() 创建文件
            Copy() 拷贝文件
            Move() 移动文件
            Replace() 替换文件
            
            
        
    5.2 System.IO.FileInfo 
        普通类,提供用于创建、复制、删除、移动和打开文件的属性和实例方法。
        FullName 文件名全路径
        Name 文件名
        Length 文件大小
        Exists 是否存在
        Directory 文件所在的目录
        Extension 文件的后缀
        
        Delete() 删除文件
        Create() 创建文件
        MoveTo() 移动文件
        CopyTo() 拷贝文件
        AppendText() 添加文件
        
        
    
    File和FileInfo,功能类似,侧重点不同。一个静态,一个普通类。
    fileinfo 更多提供文件的详细信息,
    
    5.3 System.IO.Directory 
        静态类,公开用于通过目录和子目录进行创建、移动和枚举的静态方法。
    
        CreateDirectory() 创建目录,这个可以直接创建多层目录。
        GetCurrentDirectory() 获取当前应用的根目录,控制台/WPF/Winform/net core(kernal)都可以。
        GetDirectories() 获取子目录列表
        GetDirectoryRoot() 获取根目录
        GetFiles() 获取指定目录的所有文件 不包含子文件
        
    5.4 System.IO.DirectoryInfo
        普通类,公开用于通过目录和子目录进行创建、移动和枚举的实例方法。
        
        FullName 目录全路径
        Name 目录名
        Exists 是否存在
        
        GetFiles() 获取所有文件
        Moveto() 移动
        Parent() 获取父目录
        Root() 获取根目录
        
        
    5.5  System.IO.Path
        静态类,对包含文件或目录路径信息的 System.String 实例执行操作.
        Combine() 组合路径,使用combine比手工组合路径更好一点。
    5.6 System.IO.FileStream 
        普通类,为文件提供 System.IO.Stream,既支持同步读写操作,也支持异步读写操作.
        
        Read() 读数据
        Write() 写数据
        Flush() 刷新数据
        Close() 关闭流数据
        
        其中flush和close非常重要,只有刷新或者关闭,数据才会真的写到目的。
        
    
    5.7 System.IO.StreamReader
        普通类,实现一个 System.IO.TextReader,使其以一种特定的编码从字节流中读取字符
        Read() 读数据 
    
    5.8 System.IO.StreamWriter
        普通类,实现一个 System.IO.TextWriter,使其以一种特定的编码向流中写入字符。
        Write() 写数据
        
    
    流的概念就是传输数据的载体,文件的内容无非是字节和字符。
    
    
    
    
        


6.ADO.NET

 


    
    6.1. System.Data.DataSet 数据集合
        Tables 获取所有表格列表
        DataSetName 数据集合的名称
        Clone() 复制 DataSet的结构,不复制数据。
        Copy() 复制DataSet的结构和数据。
        
    6.2. System.Data.DataTable 数据表
        TableName 名称
        Columns() 列集合
        Rows() 列集合
        NewRow() 返回具有相同架构的行
        
    6.3. System.Data.DataRow 数据行
        System.Data.DataRowCollection 行集合
    6.4. System.Data.DataColumn 数据列
        System.Data.DataColumnCollection 列集合 
            ColumnName (字符串)列名称
            DataType (Type)数据类型   
                
            如何把数据库的long 可空类型转成c#的数据类型 long?
            
             System.Data.DataSet dataSet = new System.Data.DataSet();

            dataSet.DataSetName = "dt";

            System.Data.DataTable dataTable = new System.Data.DataTable();

            dataTable.TableName = "t0";
            dataTable.Columns.Add(new System.Data.DataColumn("TestId",typeof(long)));
            dataTable.Columns.Add(new System.Data.DataColumn("TestCode", typeof(string)));
            dataTable.Columns.Add(new System.Data.DataColumn("TestQty", typeof(int)));
            dataTable.Columns.Add(new System.Data.DataColumn("TestDate", typeof(DateTime)));

            for( int i = 0; i < 10; i++)
            {
                System.Data.DataRow row = dataTable.NewRow();
                
                row["TestId"] = i;
                //row["TestId"] = null; 会报错  System.ArgumentException:“不能将 Column“TestId”设置为 null。请改用 DBNull。”
                //row["TestId"] = nullDBNull.Value;
                row["TestCode"] = "Code";
                row["TestQty"] = 23;
                row["TestDate"] = DateTime.Now;
                dataTable.Rows.Add(row);
            }

            dataSet.Tables.Add(dataTable);

            long? ret = dataTable.Rows[1]["TestId"] == System.DBNull.Value ? null : 
               (long?)long.Parse(dataTable.Rows[1]["TestId"].ToString());
             //这里dataTable.Rows[1]["TestId"]要和DBNull.Value比较,
             //当dataTable.Rows[1]["TestId"]和DBNull.Value相等的时候, long?才是等于null.
             
            总之:sql server 数据库的 null值对应System.Io.DataTable 的 DBNull.Value ,对应 c# 的可空类型。
            
    
    6.5.System.Data.SqlClient.SqlConnection  连接类
    6.6.System.Data.SqlClient.SqlDataAdapter 数据适配器类
    6.7.System.Data.SqlClient.SqlDataReader   数据读取类
    6.8.System.Data.SqlClient.SqlCommand      命令类
    6.9.System.Data.SqlClient.SqlParameter     参数类
    6.10.System.Data.SqlClient.SqlParameterCollection  参数集合类
    6.11.System.Data.SqlClient.SqlTransaction 事务类
    
    
    SqlClient 表示是SQL SERVER 数据库
    使用SqlParameter 可以防止注入。

    


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值