• 那些年我们追过的C#奇葩关键字——忐忑


    说到中国的歌坛,不能光说张学友这种大咖吧,我看那些怪咖更给力,比如我们的龚琳娜童鞋,一首神曲《忐忑》唱的那叫不可收拾,而且听到的改编版本更多,每一次都是心怀忐忑,就像C#里的那些关键字

    说到这些关键字,我不得不说它们高端大气上档次,它们只会偶尔出现,所以你也可以说它们低调奢华有内涵,但绝对是程序猿之必备神器,无论是面试,还是开发、、、

    那就认识认识吧,可是又太多,所以也只能是想到哪里是哪里,我们这就让思绪自由飞翔一会吧!

    1、@

    这个东东看似和邮件有关啊,但是在C#的世界里,可跟邮件没有一毛钱关系,它是string的女朋友(当然了string有N多女友),二者结合就可以发挥作用了。你可以给它起个名字,叫做“逐字字符串”,或者别的什么东东都行,这都不重要,关键你要会泡它~

    在处理字符串时,那些个字符串转义字符我们可伤不起,一个个的记又记不住,用了还要查,麻烦的不行,那@就是为解决这个而诞生的,直接让字符串原样输出有木有?什么sql字符串了,还有路径啥了的,统统搞定

    string sql = @"select * from student where id = '001'";
    //实际sql输出select * from student where id = '001'
    string path = @"C:MDocustudent.xml";
    //实际path输出C:MDocustudent.xml,注意这里可不是\哦

    如果字符串里边包含双引号时,要稍微处理一下,那就是在双引号的外边再加双引号即可

    string s = @"He said,""yes""";
    //s输出He said,"yes"

    2、is

    目的就一个,检查变量是不是给定的类型,是就返回true,不是就false了,比较简单,一笔带过了

    int i = 5;
    bool check = i is int;//check = true

    3、as

    用于在兼容的引用类型之间执行转换。例如

    string s = someObject as string;
    if (s != null)
    {
        // someObject is a string.
    }

    as运算符类似于强制转换操作;但是,如果转换不可行,as会返回null而不是引发异常。更严格地说,这种形式的表达式 等效于

    expression is type ? (type)expression : (type) null

    as 运算符只执行引用转换和装箱转换。as运算符无法执行其他转换,如用户定义的转换,这类转换应使用cast表达式来执行。

    4、sizeof

    用于获取非托管类型的大小(以字节为单位)

    int intSize = sizeofint);//intSize = 4

    5、typeof

    返回Type对象,该对象保存类型信息

    Type myType = typeofint);
    console.writeline("Type:{}",myType);
    //输出Type:System.Int32

    6、checked

    检测操作的溢出情况

    short a =20000,b=20000;
    short myShort = checked((short)(a+b));
    //error

    7、unchecked

    忽略溢出关键字,接受结果而不管溢出情况,默认是不检查溢出的

    short a =20000,b=20000;
    short myShort = checked((short)(a+b));
    //忽略error

    8、Guid

    全局唯一标示符,是一个128位的字符串,在任何要以唯一方式来表示某个事物时就可以用该屌丝。

    uniquecode = Guid.NewGuid ();
    console.WriteLine("myCode:{}",uniquecode.ToString());
    //输出:myCode:cabfe0ba-fa72-4c5c-969f-e76821949ff1

    9、?

    可空类型

    public class student
    {
         private string name;
         private int? age=null;
         public string Name
         {
             get { return name; }
             set { name = value; }
         }
         public int? Age
         {
             get { return age; }
             set { age = value; }
         }
    }
    student s = new student();
    s.Age = null;//是允许的

    10、??

    null接合操作符,也可以说是双问号操作符,意思是取所赋值??左边的,如果左边为null,取所赋值??右边的

    DateTime? createDate = null;
    DateTime? defaultDate= null;
    DateTime secondDate = DateTime.Now;
    createDate = createDate ??defaultDate??secondDate;
    
    // 如果createDate 为空,则对defaultDate求值,如果defaultDate不为空,则将defaultDate赋值给createDate 。否则继续计算secondDate,是不是null都赋值给createDate ,因为是最后一个表达式

    11、::

    这个东东比较少见,你可以叫它双冒号运算符,这个在给命名空间起别名的时候能用到

    在此示例中,命名空间 System 用于包括类 TestClass,因此必须使用 global::System.Console 来引用 System.Console 类,该类被 System 命名空间隐藏。 而且,别名 colAlias 用于引用命名空间 System.Collections;因此,将使用此别名而不是命名空间来创建 System.Collections.Hashtable 的实例。

    using colAlias = System.Collections;
    namespace System
    {
        class TestClass
        {
            static void Main()
            {
                // Searching the alias:
                colAlias::Hashtable test = new colAlias::Hashtable();
    
                // Add items to the table.
                test.Add("A", "1");
                test.Add("B", "2");
                test.Add("C", "3");
    
                foreach (string name in test.Keys)
                {
                    // Searching the global namespace:
                    global::System.Console.WriteLine(name + " " + test[name]);
                }
            }
        }
    }

    12、=>

    Lambda表达式的运算符是=>,运算符左边列举出了需要的参数,右边定义了赋予Lambda变量的方法的实现代码

    List<User> user = new List<User>{ new User{Id=1,Name="LiSi",Age=22},  new User{Id=2,Name="ZhangSan",Age=25} }; 
    //获取特定人时所用的过滤条件,p参数属于User类型  
    var results = user.Where(p => p.Name == "LiSi").ToList();  //用User对象的Age值计算平均年龄  
    var average = user.Average(p => p.Age); 

    13、ref

     ref 关键字使参数按引用传递,也就是说它能够让你直接对原数进行操作,而不是对那个原数的Copy进行操作。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字,而且传递到 ref 参数的参数必须最先初始化,例如:

    class RefExample
    {
    static void Method(ref int i)
    {
    i = 44;
    }
    static void Main()
    {
    int val = 0;
    Method(ref val); // val is now 44    
    }
    }

    14、out

    out是传出参数,与ref有点像,但偏重于输出,而且不用初始化,通过执行使用out参数的方法逻辑,out后面的数接受并返回这个值,比如你写一个方法返回dataset,同时你还想返回页数,怎么办?方法一般不能返回多个值啊,这个时候out就可以返回多个值,是不是很爽,你需要多个值得时候别忘了out这厮啊

    public DataSet getData(out int count) 
    { 
        dataset ds=bll.getdata(10,20); 
    获取第11条到第20条数据,但是不可能只显示共有10条记录吧,那么我们就可以用out了 
        int rcount=bll.GetCount();//比方说这个是取总记录数的
        count=rcount; 
    
        return ds; 
    } 
    
    //显示的时候 
    
    public void showdata() 
    { 
        int count=0; 
    
        gridview1.datasource=getData(out count); 
        gridview1.databind(); 
       label1.text="共有"+count.tostring()+"条记录"; 
    } 

    15、params

    params主要的用处是在给函数传参数的时候用,就是当函数的参数不固定的时候。在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字!

    注意事项:

    (1)若形参表中含一个参数数组,则该参数数组必须位于形参列表的最后;

    (2)参数数组必须是一维数组;

    (3)不允许将params修饰符与ref和out修饰符组合起来使用;

    (4)与参数数组对应的实参可以是同一类型的数组名,也可以是任意多个与该数组的元素属于同一类型的变量;

    (5)若实参是数组则按引用传递,若实参是变量或表达式则按值传递。

    (6)用法:可变的方法参数,也称数组型参数,适合于方法的参数个数不知的情况,用于传递大量的数组集合参数;当使用数组参数时,可通过使用params关键字在形参表中指定多种方法参数,并在方法的参数表中指定一个数组,形式为:方法修饰符 返回类型 方法名(params 类型[] 变量名)

    如带有参数的SQL 语句,不同的表的字段数量也不同,当你更新修改的时候就可以用params

     16、using

    这个再也熟悉不过了,常见三种用法

    (1)引用命名空间,例如:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    (2)创建别名(类或者命名空间的别名)

    using MyControle=System.Console;
    class UsingEx
    {
       public static void Main()
       {
        MyConsole.WriteLine("应用了类的别名");
        }
    }

    (3)自动清理资源

    using (SqlConnection conn = new SqlConnection(_connstr))
    //这样你就不用手工清理连接资源了

    17、this

    (1)表示当前实例

    (2)索引器关键字

    (3)隐藏父类同名方法的关键字

    (4)扩展方法的关键字

    也没什么难的,多用用就会了

    那些年我们追过的奇葩关键字远不止这些,真是浪花一朵朵,我也只是想到了这些,真碰到没见过的,查查也就知道了,没必要纠结,想必看完了这篇大家依然很忐忑,其实也不是坏事,呵呵,说明咱们的求知欲很强烈啊,我也只能说继续忐忑,继续加油,最后依然忐忑,因为你在忐别的忑啊~

    郑重声明:本博客仅用于个人整理和总结学习笔记,如有任何疑问欢迎留言!
  • 相关阅读:
    深度学习模型调参
    人脸神经网络及算法整理
    【转】python pip install指定国内源
    人脸识别数据集整理
    卷积神经网络整理+ResNet50
    【转载】人脸检测通用评价标准
    【转载】InsightFace算法学习
    Linux手动识别4G模块
    openwrt监控程序(守护进程)
    测试流程详解
  • 原文地址:https://www.cnblogs.com/WeiGe/p/3315807.html
Copyright © 2020-2023  润新知