• C# 4.0 新特性



    索引: 


     1、动态查找 —— dynamic

    动态查找允许在编写方法、运算符和索引器调用、属性和字段访问甚至对象访问时,绕过C#静态类型检查,而在运行时进行解析。

    在编译时,会假设动态对象支持任何操作,而如果它不支持某个操作,则只有到运行时才能得到错误。

    C#4.0引入了新的静态类型,称为 dynamic 。当你拥有了一个 dynamic 类型的对象后,你“对它做的事情”只会在运行时进行解析。

    dynamic d = GetDynamicObject(…);  

    d.M(7);

    C#编译器允许你使用任何参数在d上调用一个方法,因为它的类型是 dynamic 。

    运行时会检查d的实际类型,并检测在它上面“用一个int调用M”是什么意思。

    不仅是方法调用,字段和属性访问,索引器和运算符调用甚至委托调用都可以动态的分派。

    dynamic d = GetDynamicObject(…);  

    d.M(7); // 方法调用

    d.f = d.P; // 字段和属性访问

    d[“one”] = d[“two”]; // 通过索引访问

    int i = d + 3; // 运算符调用

    string s = d(5,7); // 委托调用

    dynamic d1 = new Foo();

    dynamic d2 = new Bar();

    string s;

    d1.M(s, d2, 3, null);

    本质等价于:“使用下面的参数执行一个称作M的实例方法”:

    1、一个string

    2、一个dynamic

    3、一个int,值为3

    4、一个object,值为null  

    具体示例代码:

    View Code 
        class Program
        {
            static void Main(string[] args)
            {
                dynamic d = GetInstance();
                d.Show();

                Console.ReadKey();
            }

            static dynamic GetInstance()
            {
                return new Student();
            }
        }

        class Person
        {
            public void Show()
            {
                Console.WriteLine("Person.Show");
            }
        }

        class Student
        {
            public void Show()
            {
                Console.WriteLine("Student.Show");
            }

     2、可选(默认)参数 

    在方法定义的时候为参数指定一个默认值。 

    调用方法的时候既可以像平时那样传入参数,也可以直接跳过不传入,这样的话,就使用默认值传到方法里。

    示例代码:

    View Code 
            static void Main(string[] args)
            {
                TestMethod();
                TestMethod(3);
            }

            static void TestMethod(int i = 10)
            {
                Console.WriteLine(i);

      值得注意一点的是,可选参数必须放在所有参数的最后。这里就有个问题了,假如某个方法有两个参数,两个都是可选参数,

    而我调用的时候只想传入第二个参数,怎么办呢?我们来试试

            static void Main(string[] args)
            {
                TestMethod("hello");
            }
            static void TestMethod(int i = 10, string s = "pengfei")
            {
                Console.WriteLine("i:{0},s:{1}", i, s);

            } 

    但很可惜,编译通不过,这个问题,利用下面的新特性就可以解决了。

    3、命名参数

    在之前版本的C#中,方法定义的参数顺序必须与方法调用时的参数顺序一致, 

    即方法 Method(int i,string s) 调用时就必须第一个传入 int ,第二个传入 string ,而现在,这个规矩可以被打破了。

    你可以自己随便什么顺序传入,这也在一定程度上提高了代码的可读性。

    示例代码:

    View Code 
            static void Main(string[] args)
            {
                TestMethod2(s: "feipeng", i: 26);
            }
            static void TestMethod2(int i, string s)
            {
                Console.WriteLine("i:{0},s:{1}", i, s);

      这样一来,上面的那个问题就可以迎刃而解:

    View Code 
            static void Main(string[] args)
            {
                TestMethod(s: "hello");
            }
            static void TestMethod(int i = 10string s = "feipeng")
            {
                Console.WriteLine("i:{0},s:{1}", i, s);

      谢谢。。。 

  • 相关阅读:
    第二章-2、显示/隐藏/切换
    第二章-1、打开链接
    1、创建自定义原件库
    3、常用小例子
    2、快捷键
    IOS开发中(null)与<null>的处理
    iOS UIPageControl的操作,设置圆点大小,显示图片等
    iOS 支付回调区分支付宝和微信的方法
    iOS 字符串的操作,去掉某一个字符或者替换成其他字符
    iOS 判断当前网络状态
  • 原文地址:https://www.cnblogs.com/pengfei/p/2628187.html
Copyright © 2020-2023  润新知