c#知识积累

1.encodeURI转码

例子 1
编码:encodeURI(encodeURI(传值))
解码:decodeURI(接收值);

传参数
var _t = encodeURI(encodeURI(title));
window.location.href = “b.html?title=”+_t;

接收
var title = decodeURI(_t);
只需要转一次码

方法二:
escape(string) 转码
unescape(解码) 解码


2.正则表达式,检查是否包含数字,字母,特殊字符,密码的长度是否大于8位

1.正则表达式,检查是否包含数字,字母,特殊字符,密码的长度是否大于8位

    验证是否为弱密码 --Biny 添加于 2016-5-23--
    function CheckPwd(inword) {
        var num = 0;
        var reg = /\d/; //如果有数字
        if (reg.test(inword)) {
            num++;
        }
        reg = /[a-zA-Z]/; //如果有字母
        if (reg.test(inword)) {
            num++;
        }
        reg = /[^0-9a-zA-Z]/; //如果有特殊字符
        if (reg.test(inword)) {
            num++;
        }
        if (inword.length < 8) { //如果密码小于8
            num = 0;
        }
        return num;
    }

3.多线程

https://www.cnblogs.com/dotnet261010/p/6159984.html
http://www.cnblogs.com/yunfeifei/p/4106318.html

  • 一个进程可有多个线程

    • 一个运行的应用程序就是一个进程,进程之间是相互独立的,进程之间不会相互影响。
    • 线程是操作系统分配处理器的基本单位。
    • 进程和线程的关系类似于分子和原子的关系。
    • .net都是已main()方法作为入口的,会主动创建一个主线程。
  • 多线程优点

    • 可以随时停止启用任务,可以设置每个任务的优先级
    • 可以更高效率的处理任务
  • 缺点

    • 开的线程越多,内存资源消耗越多。
    • 线程之间不是独立的,对公共的资源会影响
    • 多线程会导致控制复杂,造成程序缺陷。
多线程Thread的用法
创建不带参数方法的线程
class Program
{
    static void Main(string[] args)
    {
        //四种多线程执行不带参数的方法
        test1 t1 = new test1();  //实例化类
        Thread thread = new Thread(new ThreadStart(test));   //静态方法可以直接使用
        Thread th1 = new Thread(new ThreadStart(t1.test1));  //非静态的方法,需要实例化才能使用。
        Thread th2 = new Thread(delegate() { Console.Write("这是一个委托方法!"); }); //或者用委托方法
        Thread th3 = new Thread(()=>Console.WriteLine("lamda表达式方法"));  //lamda表达式方法
        thread.Start();
        th1.Start();
        Console.Read();
    }

    public static void test() 
    {
        Console.Write("这是一个静态方法");
    }
    class test1
    {
        public void test1()
        {
            Console.Write("这是一个非静态方法");
        }
    }
}

4. 测试性能测试工具和抓包工具

  1. 用loadrunner压的呀

  2. Fiddler抓包

5. 数据库优化链接

大数据量数据库优化

https://www.cnblogs.com/achen0502/p/5120352.html

  1. 查询优化有以下几点
    1. 数据行的长度不要超过8020字节,在物理查询时会占用两行,消耗资源,同时这个标准也可以限定表字段的个数,如果每个字段是varchar(200),那么最大不超过40个字段
    2. 字段长度在满足最大的前提下,尽量设置的短一些,提高查询效率,建立索引时,减少资源消耗。
    3. where 后面条件 因为sql server自带”查询分析优化器“,能自动判断哪个条件在前哪个在后。
    4. 尽量不要进行null值判断
      select id from t where num is null
      可以在num设置为0,或者设置为空字符串。
    5. 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描,!=是 SQL92标准 <>是现行标准,尽量用<>比较好
    6. 尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。
      SELECT * FROM T1 WHERE NAME LIKE ‘%L%’
    7. 尽量不要在索引字段上进行表达式或函数操作,这样会导致索引无效。
    8. 很多时候用 exists是比in一个好的选择
    9. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定
    10. 充分利用连接条件,在某种情况下,两个表之间可能不只一个的连接条件,这时在 WHERE 子句中将连接条件相等的都写上,有可能大大提高查询速度。
    11. 大数据表尽量不使用Select Into,SELECT INOT 语句会导致表锁定,阻止其他用户访问该表

6. nvarchar,varchar,nchar,char的区别

字段类型存储方式存储最大长度备注
nvarchar(8)按字符数存储可变长度 最大8个汉字 8个字母 最大 nvarchar(4000)n表示字符数,一个汉字或一个字母都是一个字符,但在空间上都占双字节,
varchar(8)按字节数存储可变长度 4个汉字 8个字母 最大 varchar(8000)n表示字节数,存储大小就是实际字节长度,一个汉字两个字节,一个字母或数字一个字节,
nchar(8)按字符数存储固定长度 固定8个汉字 8个字母 最大 nchar(4000)不足8个长度,会用补空格
char(8)按字节数存储固定长度 固定4个汉字 8个字母 最大 char(8000)不足长度,同样会补空格

7.数据库并发控制

https://blog.csdn.net/bcbobo21cn/article/details/51013467

  1. 锁的类型
    基本的封锁类型有两种:排它锁( Exclusive Locks ,简称 x 锁)和共享锁 ( Share Locks,简称 S 锁)。排它锁又称为写锁。若事务 T 对数据对象 A 加上 X 锁,则只允许 T 读取和修改 A ,其他任何事务都不能再对 A 加任何类型的锁,直到 T 释放 A 上的锁。这就保证了其他事务在 T 释放 A 上的锁之前不能再读取和修改 A 。共享锁又称为读锁。若事务 T 对数据对象 A 加上 S 锁,则事务 T 可以读 A但不能修改 A ,其他事务只能再对 A 加 S 锁,而不能加 X 锁,直到 T 释放 A 上的 S 锁。这就保证了其他事务可以读 A ,但在 T 释放 A 上的 S 锁之前不能对 A 做任何修改。

    1. 排他锁锁住对象后,该事务操作可以操作和读取,其他操作不能修改和也不能读该对象。

    2. 共享锁:锁住对象后,锁住的操作只能读,不能修改,其他的才对锁住的对象也只能读,不能修改,直到释放共享锁。

  2. 事务中的表都进行了排他锁控制。

  3. 死锁情况。
    跟着做:打开两个查询窗口,把下面的语句,分别放入2个查询窗口,在5秒内运行2个事务模块。

事务一
begin tran
update lives set play=‘羽毛球’
waitfor delay ‘0:0:5’
update dbo.Earth set Animal=‘老虎’
commit tran

十三五
begin tran
update Earth set Animal=‘老虎’
waitfor delay ‘0:0:5’ --等待5秒执行下面的语句
update lives set play=‘羽毛球’
commit tran
select * from lives
select * from Earth

8.索引

索引是从数据库中获取数据的最高效方式之一。95% 的数据库性能问题都可以采用索引技术得到解决
  1. 聚集索引和非聚集索引区别

    1. 聚集索引(CLUSTERED):聚集索引就相当于使用字典的拼音查找,因为聚集索引存储记录是物理上连续存在的,即拼音 a 过了后面肯定是 b 一样。
    2. 非聚集索引(NONCLUSTERED):非聚集索引就相当于使用字典的部首查找,非聚集索引是逻辑上的连续,物理存储并不连续
    3. 聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。
  2. 索引的语法

create uniqe/ clustered/nonclustertd index index_name 表(字段)

查询索引
sp_helpindex ‘表名’

删除索引
Dop index on ‘表名’

  1. 在非主键字段上建聚集索引

–删除主键约束,包括索引
ALTER TABLE tb_main DROP CONSTRAINT PK__tb_main__3213E83FF2BE0193

–修改其他字段为聚集索引
CREATE CLUSTERED INDEX idx_clusteredq ON tb_main(name)

ALTER TABLE dbo.tb_main ADD PRIMARY KEY (id)

9. C#获取中文字中提取手机号和固定电话号码

class Program
{
    static void Main(string[] args)
    {
        string n = "水电费就上岛咖啡021-565622245打撒所多";

      string r=  IsLegalMobilePhone(n);
      if (string.IsNullOrEmpty(r)) 
      {
          r = IsTelephone(n);
      }
      Console.Write(r);
      Console.Read();
    }


    public static string IsLegalMobilePhone(String MobilePhone)
    {
      
        //Regex myReg = new Regex(@"[1,9][3,4,5,8,6,7,9]\d{9}");
        Regex myReg = new Regex(@"[1][3,4,5,6,7,8,9]\d{9}");
        if (MobilePhone.ToString() == "" || MobilePhone.ToString() == null)
        {
            return string.Empty;
        }
        else
        {
            if (myReg.IsMatch(MobilePhone))
            {
                string ps = "";
                var match = myReg.Matches(MobilePhone);
                foreach (Match item in match)
                {
                    if (string.IsNullOrEmpty(ps))
                        ps += item.Value;
                    else
                        ps += "," + item.Value;
                }
                return ps;
            }
            else
                return string.Empty;
        }
    }

    public static string IsTelephone(String MobilePhone)
    {
        Regex myReg = new Regex(@"(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}");
        if (MobilePhone.ToString() == "" || MobilePhone.ToString() == null)
        {
            return string.Empty;
        }
        else
        {
            if (myReg.IsMatch(MobilePhone))
            {
                string ps = "";
                var match = myReg.Matches(MobilePhone);
                foreach (Match item in match)
                {
                    if (string.IsNullOrEmpty(ps))
                        ps += item.Value;
                    else
                        ps += "," + item.Value;
                }
                return ps;
            }
            else
                return string.Empty;
        }
    }
}
10. 创建主外键复习

–主表

CREATE TABLE tb_main
(

id INT **PRIMARY KEY **,

name VARCHAR(20)
)

–外键表

CREATE TABLE tb_foreign(

id INT IDENTITY(1,1),

foreign_id INT FOREIGN KEY REFERENCES tb_main(id)
)

11.设计模式

单例模式
public class ChatServiceTask
{
    // 定义一个静态变量来保存类的实例
    private static ChatServiceTask uniqueInstance;
    // 定义私有构造函数,使外界不能创建该类实例
    private ChatServiceTask()
    {
    }
    /// <summary>
    /// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
    /// </summary>
    /// <returns></returns>
    public static ChatServiceTask GetInstance()
    {
        // 如果类的实例不存在则创建,否则直接返回
        if (uniqueInstance == null)
        {
            uniqueInstance = new ChatServiceTask();
        }
        return uniqueInstance;
    }
}


调用:全局调用,通一的入口,且ChatServiceTask只会被实例化一次。
ChatServiceTask ChatServiceTask=ChatServiceTask.GetInstance();

12.ROW_NUMBER(),DENS_RANK()和Rank()的区别。

  1. ROW_NUMBER() 排名不重复,序号一次递增
排名成绩
190
290
380
470

2.DENS_RANK() 排名重复,序号一次递增

排名成绩
190
190
280
370
  1. Rank() 排名不重复,会跳过行号
排名成绩
190
190
380
470

13. 微信图片禁止外链 此图片来自微信公众平台未经允许不可引用 处理办法

在head中加上//亲测该发法有效

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值