C#3.0教程:自动属性和扩展方法

C#3.0教程:自动属性(Automatic Properties)和扩展方法(Extension Methods).

步骤/方法

  • 01

    使用自动属性后,你可以不用手工声明一个私有成员变量以及编写get/set逻辑,取而代之的是,编译器会自动为你生成一个私有变量和默认的get/set 操作。系统为你产生的私有变量在IDE中,你是看不到的,如下图: 当然如果你希望属性中有些赋值或者取值逻辑校验,自动属性可是不适合你的。 上面的代码我们编译后,再用 Reflector 反编译后,我们可以看到上述代码中的属性变成了如下代码:这个编译器给我们产生的私有变量,显然不是那么容易重名的。 [CompilerGenerated] private string <>k__AutomaticallyGeneratedPropertyField0; public string Name { [CompilerGenerated] get { return this.<>k__AutomaticallyGeneratedPropertyField0; } [CompilerGenerated] set { this.<>k__AutomaticallyGeneratedPropertyField0 = value; } } 注意:如果你只希望属性有 get 或者 set 方法,这些情况都是无法使用 自动属性的,需要你自己来书写。否则就会报如下的错误: 'ConsoleApplication1.MyClass.Name.set' must declare a body because it is not marked abstract or extern. Automatically implemented properties must define both get and set accessors. 但是 get 和 set 访问级别不一样,比如一个是 public,一个是 internal,则可以书写成下述方式,而不会报错误。 public int ID { get; internal set; }

  • 02

    今天早上在MSDN站点看到这样一篇文章: C# 3.0 LINQ 的演变及其对 C# 设计的影响 。 从这篇文章我们就可以明显的看到,C# 3.0 所新增的这些特性,可以认为都是为了LINQ 的发展,为了LINQ更易用,所创建的一些新特性,当然这些新特性也可以被非LINQ相关功能所使用。LINQ的发展,带动了C#3.0 这一系列新特性的产生。 回来说我们的话题,扩展方法,首先看一个最简单的代码例子: 扩展方法的定义,需要注意三个部分:1、静态类(私有公共都可以);2、静态方法(私有公共都可以);3、第一个函数参数前带 this(必须是第一参数前) namespace Hongjun.Guo { static class MyExtensionMethods { internal static void Print(this object s) { Console.WriteLine(s); } } } 扩展方法的使用,需要注意点: using 你定义所在的命名空间。 using Hongjun.Guo; static void Main(string[] args) { object o = "dsdgs"; o.Print(); } 这样一个简简单单的代码后,我们就可以很方便的对一些不开源的第三方控件增加很多我们自己额外需要的功能。 扩展方法的使用,有时候并不是这么简简单单,我们来看一些特殊情况,通过这些特殊情况的分析,我们可以更深入的了解扩展方法:

  • 03

    情况一 : 扩展方法跟原来类的方法重名时候的处理逻辑。 场景:我们是对一个第三方的没有开放源代码组件的一个类扩展了一个方法,比如方法: Print 。过了一段时间后,这个第三方的组件发布了新版本,该类的增加了 Print 方法。这时候会出何种效果?? 问题演示代码: namespace Hongjun.Guo { public class MyClass { public void Print() { Console.WriteLine("****"); } } static class MyExtensionMethods { internal static void Print(this MyClass s) { Console.WriteLine("haha " + s.ToString()); } } } 调用范例: using Hongjun.Guo; static void Main(string[] args) { MyClass o = new MyClass(); o.Print(); Console.ReadLine(); } 这时候我们会看到何种结果呢?? 答案:看到的是 **** 也就是,扩展方法跟类的方法冲突时候,编译使用不会报任何错误,这时候以类的方法优先级最高,这时我们使用类的方法,而不是扩展方法。 分析: 我们把上述两组代码编译后,再反编译成IL,我们就可以看到,实际上,扩展方法在IL层上是不存在的。 扩展方法实际是编译器调用某个类的某个方法的时候,先去这个类找,如果有这个方法,则就调用;如果找不到,根据引用的命名空间,再去找扩展方法(静态类的静态方法)。找到,就使用,找不到当然就编译错误了。 根据这个分析结果,我们就可以理解上述问题处理的结果了。

  • 04

    情况二: 扩展方法的嵌套 比如我们有如下扩展方法。 namespace Hongjun.Guo { static class MyExtensionMethods { public static int Test01(this int i) { return i * 3; } public static int Test02(this int i) { return i + 5; } } }

  • 05

    下面是调用范例: static void Main(string[] args) { int mm = 7; Console.WriteLine(mm.Test01().Test02()); Console.WriteLine("*****"); Console.WriteLine(mm.Test02().Test01()); Console.WriteLine("*****"); Console.WriteLine(MyExtensionMethods.Test02(MyExtensionMethods.Test01(mm))); Console.ReadLine(); } 问,调用的显示结果是何值? 答案: 依次显示: 26,36,26 分析: mm.Test01().Test02() 这行代码编译后相当于如下代码: MyExtensionMethods.Test02(MyExtensionMethods.Test01(mm)) 这两行代码在编译后的IL中是完全一样的。

(0)

相关推荐

  • UG10.0教程:[41]注塑模具设计之项目初始化

    注塑模具设计是UG10.0软件自带的自动分模工具,其项目初始化的定义是:新建模具设计项目或打开先前的项目: 项目初始化是使用UG10.0进行自动分模的第一步,本节教程就为大家讲解:项目初始化的设置及其 ...

  • UG10.0教程:[64]注塑模向导之方块体创建技巧

    方块体是一个实体命令,通过此命令,可以快速地创建一个实体,其命令不是在建模下,而是在注塑模向导中,本节UG10.0教程讲解:关于方块体的调用及创建技巧,欢迎学习: 操作方法 01 先打开一个已经绘制好 ...

  • amos21.0教程:[24]有注册码如何安装

    操作方法 01 很多电脑小白愁死我了,手里有注册码还不会安装,这里就跟大家演示一下amos是如何安装的. 02 下载下来压缩包,解压得到一个文件夹 03 打开该文件夹,你就看到一个名为setup的文件 ...

  • UG10.0教程:[75]UG10.0曲线网格创建技巧

    通过一组封闭的曲线,使用曲线网格可以创建一张曲面,本节UG10.0教程讲解关于曲线网格曲面的创建技巧,欢迎学习: 操作方法 01 在下图中,红色指示的线为一组封闭的曲线,然后就用这组线来创建曲面: 0 ...

  • UG10.0教程:[35]GC工具箱压缩弹簧设计教程

    本节UG10.0教程教大家使用GC工具箱绘制压缩弹簧的方法,欢迎学习,GC工具箱是标准件工具,用其可以设计弹簧.齿轮等标准件: 操作方法 01 GC工具箱在靠右的菜单栏上,点开就可以看到画压缩弹簧了: ...

  • UG10.0教程:[71]UG10.0绘图背景的设置技巧

    绘图背景就像我们平面写字用的纸,这个背景可以根据自己的需要设置不同的颜色,本节UG10.0教程讲解:关于绘图背景的设置技巧,欢迎阅读:下图为设置好的绘图背景. 操作方法 01 UG10.0默认情况下, ...

  • UG10.0教程:[74]UG10.0桥接曲线使用技巧

    桥接曲线主要应用在曲面设计中,其可以把一条直线断开的部分,给连接起来,然后创建出一整条曲线,本节UG10.0教程讲解桥接曲线的使用技巧,欢迎学习: 操作方法 01 本节经验要进行桥接曲线的图形如下图: ...

  • UG10.0教程:[73]UG10.0抽取曲线的技巧

    抽取曲线是抽取零件上的边线,以来满足特殊设计的需要,线是组建曲面.实体的载体,本节UG10.0教程讲解:关于曲线的抽取技巧,欢迎学习: 操作方法 01 为了结省绘图的时候,就不在重新绘制图形了,直接打 ...

  • UG10.0教程:[61]螺栓设计技巧

    本节UG10.0教程讲解:机械零件中螺栓的设计技巧,在本节教程中,用到的指令有:圆柱.倒斜角.螺纹.拉伸切剪等: 操作方法 01 新建一个以螺栓命令的图档后,然后在特征中找到圆柱命令: 02 单击圆柱 ...