C# 4.0 新特性dynamic、可选参数、命名参数等
1.dynamic ExpandoObject
熟悉js的朋友都知道js可以这么写 :
1 2 3 | var t = new Object(); t.Abc = ‘something’; t.Value = 243; |
现在这个js动态语言的特性,我们也可以在c#中使用了,前提是将一个变量声明为ExpandoObject类型。如下例:
1 2 3 4 5 6 7 8 | static void Main( string [] args) { dynamic t = new ExpandoObject(); t.Abc = "abc" ; t.Value = 10000; Console.WriteLine( "t's abc = {0},t's value = {1}" , t.Abc, t.Value); Console.ReadLine(); } |
C# 4.0中新增了一个命名空间System.Dynamic来实现对此应用的支持,这种用法的意义何在,现在我还不太清楚,也是是c#向动态语言过渡的一种试探吧。
2.泛型自动转换
在C#4.0之前下面的代码是不可以编译通过的
1 2 3 | IEnumerable< object > objs = new List< string > { "I'm 0" , "I'am 1" , "I'am 2" }; |
但是在c#4.0中这种声明是允许的,不过也仅限于泛型接口,泛型类型的类似做法是不允许的,如下代码是有编译错误的
1 2 3 | List< object > objList = new List< string > { "I'am 0" , "I'am 1" , "I'am 2" }; |
3.方法参数之可选参数
如下方法声明的语法
1 2 3 | static void DoSomething( int notOptionalArg, string arg1 = "default Arg1" , string arg2 = "default arg2" ) { Console.WriteLine( "arg1 = {0},arg2 = {1}" ,arg1,arg2); } |
这个方法有三个参数第一个是必选参数,第二个和第三个是可选参数,他们都有一个默认值。这种形式对固定参数的几个方法重载很有用。
如下调用:
1 2 3 4 5 6 7 | static void Main( string [] args) { DoSomething(1); DoSomething(1, "葫芦" ); DoSomething(1, "葫芦" , "黄瓜" ); Console.ReadLine(); } |
也许你会想到,假如我有一个和可选参数方法不选某个参数相同的方法签名的方法时,c#会怎么处理呢,我们看下下面的代码
1 2 3 4 | static void DoSomething( int notOpArg, string arg) { Console.WriteLine( "arg1 = {0}" , arg); } |
我又重载了一个DoSomething这个方法有两个参数,但是没有可选参数,实验证明调用
DoSomething(1,”arg”)时会优先执行没有可选参数的方法。
4.方法参数之命名参数
命名参数让我们可以在调用方法时指定参数名字来给参数赋值,这种情况下可以忽略参数的顺序。如下方法声明:
1 2 3 | static void DoSomething( int height, int width, string openerName, string scroll) { Console.WriteLine( "height = {0},width = {1},openerName = {2}, scroll = {3}" ,height,width,openerName,scroll); } |
我们可以这样来调用上面声明的方法
1 2 3 4 5 | static void Main( string [] args) { DoSomething( scroll : "no" ,height : 10, width : 5, openerName : "windowname" ); Console.ReadLine(); } |
很显然的这是一个语法糖,但是在方法参数很多的情况下很有意义,可以增加代码的可读性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
2007-05-24 如何在项目之间共用UserControl