博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 4.0 新特性
阅读量:5949 次
发布时间:2019-06-19

本文共 2108 字,大约阅读时间需要 7 分钟。


索引: 

  •    
  •  

 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  

具体示例代码:

ExpandedBlockStart.gifView 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、可选(默认)参数 

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

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

示例代码:

ExpandedBlockStart.gifView 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 ,而现在,这个规矩可以被打破了。

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

示例代码:

ExpandedBlockStart.gifView 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);

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

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

  谢谢。。。 

转载于:https://www.cnblogs.com/pengfei/archive/2012/08/08/2628187.html

你可能感兴趣的文章
ajaxFileUpload文件
查看>>
linux下MySQL 5.6源码安装
查看>>
2018,从梦想到事业
查看>>
python中的字典用法大全的代码
查看>>
如何挑选优质光模块?
查看>>
初学telnet
查看>>
C++线程入口函数的几种方式
查看>>
成都课得在线|UI该不该放入网络运营范畴
查看>>
内联元素的padding,margin,border等不起作用的原因
查看>>
事务与并发控制
查看>>
初识shell文本处理工具之gawk-sed
查看>>
也来谈谈RPC
查看>>
Cisco ASA SSL ×××远程访问设置 二
查看>>
构建镜像 - 每天5分钟玩转容器技术(12)
查看>>
平衡二叉树
查看>>
centos7 中 systemd systemctl管理服务的命令
查看>>
企业级办公室iptables防火墙应用案例
查看>>
Ubuntu python 安装使用sqlalchemy
查看>>
HAProxy 之 ACL介绍和使用
查看>>
OEL 6.4中安装Oracle 11g_R2_64bit
查看>>