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);

  谢谢。。。 

原文地址:https://www.cnblogs.com/pengfei/p/2628187.html