本文为原创,如需转载,请注明作者和出处,谢谢!
一、用var定义变量
在C#3.0中提供了一种新的声明变量的方式,这就是var。通过这个关键字,在声明变量时就无需指定类型了,变量类型是在初始化时由编译器确定的。代码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->varss="abcd";
MessageBox.Show(ss.GetType().ToString());
上面的代码将显示System.String,从而证明C#编译器已经将ss编译成了String变量了。而在输出ss后,再输入“.”后,会看到将String类型变量的相应方法和属性也列出来了,因此可以断定,C#将ss看成了String类型,而不是Object。所以使用var定义变量同时可以拥有Object和强类型的优点。
不过大家不要将var看成是javascript的var,它们的区别是,javascript是弱类型的语言,而且javascript中的变量(也包括用var声明的变量)可以变换类型,如下面的javascript所示:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->vars="abcd";
s=3;
alert(s);
上面的代码第一次给s赋了一个字符串,而第二行代码又给赋了一个整数。这样的代码在javascript中没有任何问题。但在C#3.0中,var变量一但被初始化,确定类型后,就无法改变类型了。如下面的代码是无法编译通过的:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->varss="abcd";
ss=44;
综上所述,在使用var定义变量时有以下四个特点:
1.
必须在定义时初始化。也就是必须是var s = “abcd”形式,而不能是如下形式:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->vars;
s=“abcd”;
2.
一但初始化完成,就不能再给变量赋与初始化值类型不同的值了。
3. var要求是局部变量。
4.
使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样。但笔者建议如果事先知道变量的类型,尽量使用强类型方式来声明变量。否则,就会造成由于大量使用var,而使得开发人员很难断定某个变量是什么类型。这样不利于程序的维护和升级。
虽然var有利有弊,但笔者个人认为,如果将动态语言转换成C#语言,可以考虑使用var来定义变量。这是因为动态语言没有类型,而要将其转换成强类型的C#语言,就必须给变量指定个类型,但事先确定类型是很费劲的,不如将其指定成var,再由C#编译器去确定变量的具体类型。那么如果在转换的过程中,发现动态语言的变量改变了类型,该怎么办呢?这个可以使用第三部分要讲的“匿名类”来解决这个问题。
二、初始化
如果一个类有public字段,在建立类的对象实例时可以使用下面的代码来初始化这些字段;
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->publicclassMyClass
{
publicStringfield1;
publicintfield2;
publicboolfield3;
}
MyClassmy=newMyClass();
my.field1=“abcd”;
my.field2=44;
my.field3=true;
在C#3.0中提供了一种更简便的方法来初始化这些public变量,代码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->MyClassmy=newMyClass
{
field1=“abcd”,
field2=44;
field3=true;
};
上面的代码的写法有些象带参数的构造方法,但这将不是调用了MyClass的构造方法(因为MyClass并没有带三个参数的构造方法),而只是C#编译器玩的一个魔术。实际上,上面的代码在编译后,仍然和使用传统的初始化字段的方法一样。只是在语法上看起来更简单(至少不用写那么多个my)。要注意的的,使用这种方法初始化,必须是public的字段(不能是protected、private或默认修饰符的字段)。
在C#3.0中还改进了对集合类的初始化方式(使其初始化的方式类似于数组)。但遗憾的是,这种初始化方式只支持用泛型的集合类,也就是说,只有实现了System.Collections.Generic.ICollection<T>的集合类才可以使用这种初始化方法。代码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->List<string>myList=newList<string>{"data1","data2","data3"};
foreach(stringdatainmyList)
{
textBox1.AppendText(data);
}
三、匿名类
在C#3.0中提供了一种新的建立类的方法,代码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->varmy=new
{
field1="abcd",
field2=12
};
MessageBox.Show(my.field1);
C#编译器会自动推断my是一个有两个public字段的类的对象实例。也就是说相当于下面的代码:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->publicclassMyClass
{
publicStringfield1;
publicintfield2;
}
varmy=newMyClass();
my.field1="abcd";
my.field2=25;
MessageBox.Show(my.field1);
在第一部分讲到如果动态语言在给变量赋值的过程中改变了变量类型,如果将其转换为强类型语言。当然,一种方法是将变量声明成object类型,或是使用匿名类来解决这个问题。代码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->varmyVar=new
{
field_string=“abcd”
field_int=12;
};
然后根据当前这个变量所使用的类型来决定该使用哪个类字段。
四、扩展方法
这个世界上总是存在着很多奇妙的东西。然而,在这部分所介绍的扩展方法就是其中之一。从字面上看可能读者很难猜透“扩展方法”是什么意思。然而,看了下面的例子,就会感觉到非常的奇妙。
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->
namespaceExtMethod
{
publicclassClass1
{
publicStrings="bill";
}
publicclassClass2:Class1
{
}
publicstaticclassAnyClassName
{
publicstaticStringgetName(thisClass1class1)
{
returnclass1.s+class1.s;
}
}
publicpartialclassForm1:Form
{
privatevoidbutton1_Click(objectsender,EventArgse)
{
Class1c=newClass1();
MessageBox.Show(c.getName());
Class2c=newClass2();
MessageBox.Show(c.getName());
}
}
}
看到上面的代码,也许很多人会感到奇怪,在Class1和Class2中并没有getName方法,怎么在调用时出来个getName方法呢?实际上,这就是扩展方法的用法,从本质上说,扩展方法就是将静态方法(必须声明成static)插入到某个类和其子类中(也就是说,在这些类中可以使用在外部定义的静态方法)。那么要往哪个类中插入呢?这就要在定义静态方法时指定了。大家可以看看getName方法的第一个参数,使用了this关键字,这就表明这个方法是一个扩展方法,后面的类型就是要插入该方法的类,在本例中是Class1,也就是说在Class1及其子类中都可以使用getName方法。上面的调用代码也相当于下面的代码:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->Class2c=newClass2();
MessageBox.Show(AnyClassName.getName(c));
但使用c.getName可能会更好一些,而且也降低了对静态方法所在的类(AnyClassName)的依赖性。
在使用扩展方法时应注意以下几点:
1.
扩展方法所在的类名可以是任意合法的类名。
2.
扩展方法所在的类必须和使用扩展方法的代码在同一个命名空间里,否则无法编译通过。
3.
在本例中,Class1和Class2只能声明成public,因为AnyClassName被声明为public。如果AnyClassName不加修饰符,Class1和Class2也可以不加修饰符,当然,也可以被声明为public。也就是说,Class1和Class2必须有比AnyClassName具有更强的访问性。如下面代码所示:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->classClass1
{
publicStrings="bill";
}
classClass2:Class1
{
}
staticclassAnyClassName//这时如果前面加public是无法编译通过的。
{
publicstaticStringgetName(thisClass1class1)
{
returnclass1.s+class1.s;
}
}
4.
如果在Class1或Class2中已经有getName方法了,那么Class1或Class2中的getName优先级更高。也就是说,扩展方法是无法覆盖原类中的同名(参数名和类型也相同)的方法的。
扩展方法尤其在很多类需要同样的方法,而这些类又无法继承其它类时特别有用。当然,在要对某个类进行扩展,但我们并没有源代码时,扩展方法也可以派上用场。
分享到:
相关推荐
win8系统下安装 .NET Framework 3.5出现错误代码:0x800F0906.docxwin8系统下安装 .NET Framework 3.5出现错误代码:0x800F0906.docxwin8系统下安装 .NET Framework 3.5出现错误代码:0x800F0906.docxwin8系统下安装...
使用很多软件或者游戏,需要.NET Framework 3.5,解决win10系统下安装 .NET Framework 3.5出现错误代码:0x800F0906
Microsoft .NET Framework 3.5 Sp1离线安装 (中文清晰版) .NET Framework 3.5 Sp1安装必须联网,本文介绍了怎么样离线安装
.net Framework3.5,安装c#.net的软件需要用到5
.NET Framework 3.5 SP1完整离线安装包下载地址与制作,包含.net3.5sp1下载地址(231.5MB)和语言包下载地址,制作离线安装包。
dotnetfx35(.net framework 3.5 )不联网离线安装方法.pdfdotnetfx35(.net framework 3.5 )不联网离线安装方法.pdfdotnetfx35(.net framework 3.5 )不联网离线安装方法.pdfdotnetfx35(.net framework 3.5 )不联网离线...
注:Microsoft .NET Framework 3.5安装程序,因为安装程序不包含语言包, ..."Microsoft .NET Framework 3.5 SP1-xp离线安装包",已经包含了安装包和语言包,运行dotNetFx35setup.exe,无需联网便可安装。
在windows server上安装.net framework 3.5方法
MICROSOFT .NET Framework 3.5 离线安装包 win7 win8 win10 (亲自测试安装成功)
Win10 .Net framework 3.5离线安装包安装方法.txt
win 2012 R2 默认没有.net framework 3.5,并且安装只有在线安装和使用完整系统镜像安装两种方式。内网环境很难安装。但是安装SQL server 2008数据库必须以这个为基础环境,所以还是很麻烦的。这个资源是专业做...
双击装载(或解压缩)下载文件后,以管理员身份运行Windows PowerShell或命令提示符,复制粘贴以下命令: dism.exe /online /enable-feature /...再进入“打开或关闭Windows功能”,可看到net3.5已安装(有小方块)。
window server2012 .NET Framework 3.5镜像文件,从原window server2012 上提取出来的
Windows Server2012 R2 安装.NET Framework 3.5,所需SXS文件
此压缩包中包含.net Framework 3.5部署文件,以及使用方法,解决win10以及其他系统安装.net Framework 3.5安装失败的问题,如果问题欢迎给我留言哦!
Microsoft .NET Framework 3.5 Service Pack 1 是一个累积更新,包含很多基于 .NET Framework 2.0、3.0 和 3.5 不断生成的新功能,此外还包括 .NET Framework 2.0 Service Pack 2 和 .NET Framework 3.0 Service ...
dotnetfx35(.net framework 3.5 )不联网离线安装方法.docxdotnetfx35(.net framework 3.5 )不联网离线安装方法.docxdotnetfx35(.net framework 3.5 )不联网离线安装方法.docxdotnetfx35(.net framework 3.5 )不联网...
【dotnetfx】Microsoft .NET Framework 3.5 sp1离线安装解决方案.docx【dotnetfx】Microsoft .NET Framework 3.5 sp1离线安装解决方案.docx【dotnetfx】Microsoft .NET Framework 3.5 sp1离线安装解决方案.docx...
win10安装.net framework3.5,解压后将sxs文件夹放置任意不带中文的目录下,修改“win10安装.net framework3.5.txt”中的c:\sxs为你放置的目录,然后cmd打开dos窗口执行即可。亲测完全通过
方便的检测.NET Framework 3.5版本是否正确的工具,用IE等浏览器打开即可。 (本资源非原创,如有问题请联系。)