首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【《Effective C#》提炼总结】提高Unity中C#代码质量的21条准则

《Effective C# Second Edition》一书原本有50条原则,但这50条原则是针对C#语言本身以及.NET来写的,我在阅读过程中,发现是有些原则并不适用于Unity中mono版本的C#...原则13 保证0为值类型的有效状态 在创建自定义枚举值时,请确保0是一个有效的选项。若你定义的是标志(flag),那么可以将0定义为没有选中任何状态的标志(比如None)。...原则18 用委托实现回调 在C#中,回调是用委托来实现的,主要要点如下: 1)委托为我们提供了类型安全的回调定义。虽然大多数常见的委托应用都和事件有关,但这并不是C#委托应用的全部场合。...3)由于回调和委托在C#中非常常用,以至于C#特地以lambda表达式的形式为其提供了精简语法。 4)由于一些历史原因,.NET中的委托都是多播委托(multicast delegate)。...3)定义接口。将客户对内部数据成员的访问限制在一部分功能中。 4)包装器(wrapper)。提供一个包装器,仅暴露该包装器,从而限制对其中对象的访问。

1.8K30

C#语法——委托,架构的血液

我们把delegate关键字理解为,是用来专门来定义这种复杂的变量的。而这种复杂的变量可以包含一个返回值和任意数目任意类型的传入参数。 有没有感觉,这个复杂的变量特别像一个函数的定义。...没错,它们的确是一样的。因为委托是用函数来赋值的,所以调用方式一样也并不奇怪,不是吗。 换一种说法,就是委托封装了一个函数。 如果委托是封装的函数,并且它又是引用类型。...匿名委托的应用 匿名委托的官方介绍:在 2.0 之前的 C# 版本中,声明委托的唯一方式是使用命名方法。 ...匿名委托虽然减少了一点代码,但还是要求我们自己去声明委托。所有,还能再简写一点吗? 答案当然是,可以的。 Action与Func Action与Func是微软为我们预先定义好了的,两个委托变量。...所以委托在使用的时候,尽量做到有序传递,即预先做好列车的行驶路线,让委托按照路径运行。尽量不要定义可以被任何单位调用的公共委托。 如果需要公共委托,可以采取反射的方式来调用。

52340
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    苏州同程旅游学长给我的全面的面试知识库

    7、定义构造函数 构造函数是与该类具有相同名称的类中的成员函数。每当创建对象类时,都会自动调用构造函数。它在初始化类时构造数据成员的值。 8、什么是锯齿状阵列? 具有数组类型元素的数组称为锯齿数组。...用户控件不能放置在工具箱中并从中拖放。他们有自己的设计和代码背后。用户控件的文件扩展名为ascx。 17、 C#中的密封类是什么? 当我们想限制继承的类时,我们创建密封的类。...数组列表类似于数组,但是没有固定的大小。 20、可以重写私有虚拟方法吗? 不可以,因为在课外无法访问它们。 21、描述可访问性修饰符“受保护的内部”。...System.StringBuilder设计为具有可变字符串的概念,在其中可以执行各种操作,而无需为修改后的字符串分配单独的内存位置。...委托与C ++中的函数指针相同,但是唯一的区别是它们与类型指针不同,它们是类型安全的。委托是必需的,因为它们可用于编写更多通用的类型安全函数。 34、如何在C#中将一个类继承到其他类?

    3K20

    C#委托+回调详解

    今天写不完,明天会接着写的,,,, 学习C#有一段时间了,不过C#的委托+回调才这两天才会用,以前只是知道怎么用.前面的一篇文章,函数指针,其实是为这个做铺垫的,说白了委托就相当于C语言中的函数指针,具体说用委托有什么好处...,我也不知道,但是因为你只要学C#那么回调就一定要会,回调是委托的一种.回调多用于线程间....还是用代码一点点的说明吧!...因为我们希望把 void c()这个函数用另一个函数代替 这个函数的类型是void 的 无参数的函数 所以就这样定义了 delegate void a();//定义一个委托----再次说明delegate...是关键字,意味着定义了一个委托------你说函数指针也行,,C#啊;;;淡化了指针的概念 然后 a b= new a(c);//实例化2222222222222222222 不知道有没有不知道为何实例化的...是C#整的名词对象 如果不知道对象那么知道类吗?

    3.6K40

    C# 语言中Lambda(拉姆达) 表达式介绍

    Lambda 表达式是一种可用于创建 委托 或 表达式目录树 类型的 匿名函数 。 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数。...使用输入参数 5 调用委托时,它将返回结果 25。 在 is 或 as 运算符的左侧不允许使用 Lambda。 适用于匿名方法的所有限制也适用于 Lambda 表达式。...返回值始终在最后一个类型参数中指定。 Func 定义包含两个输入参数( int 和 string)且返回类型为 bool的委托。...通常不必为输入参数指定类型,因为编译器可以根据 lambda 主体、参数的委托类型以及 C# 语言规范中描述的其他因素来推断类型。...Lambda 表达式中的变量范围 在定义 lambda 函数的方法内或包含 Lambda 表达式的类型内,Lambda 可以引用范围内的外部变量(请参阅匿名方法)。

    8.1K40

    CSharp委托与匿名函数

    更好的语法糖——c#委托 使用委托的角度 诚然,在学习的初期,我十分推荐完全利用面向对象的思想来构建和理解接口与事件处理的代码。但是我们可以发现,这样的代码还不足够的简练。...实际上,在c#中,我们可以利用更加舒服的语法糖来实现:委托。委托的声明类似于函数,但是不带函数体,且要用delegate关键字。...bool Check(int param); } 实际上,委托的语法应该这样理解:第一个是我定义了一个名为EventHandle的委托,它代表了一个函数,这个函数名字我也不知道是什么,只知道他是参数为空...,返回为void的函数;第二个是我定义了一个名为Check的委托,它代表了一个只有一个int类型参数的,返回值为bool的函数。...通过前面的介绍,我们已经能够更为简洁通用的定义自己的委托类型了,比如现在我需要一个定义一个返回值为string,参一个int类型与一个double类型的参数形式的委托类型,可以按照如下定义: namespace

    21720

    C# 基础知识系列- 11 委托和事件

    委托在C#中定义为一种面向对象形式的方法寻址方案。简单来讲,就是定义一个类型,然后表示这个类型代表某一种方法。而委托对象,就是方法参数化。...del ; del();// 会直接报错 上述代码如果运行的话,会很直接的报错,因为你没有告诉编译器变量del 应该是什么,也就是没有为del赋值,同时委托可以赋值为null,所以在使用的时候需要注意不能为...C#建议事件的定义以On开头,表示在什么时触发,示例代码并不符合这个规范。 3....到这里,委托和事件的基本概念就已经介绍完毕了,当然还是那句话,更多的内容在实践中。C#的事件机制让程序员有更多的自由去自定义事件,而不是被局限在某些框架内。...所以大家可以多试试C#的事件,也许能发现更多的我不知道的内容呢。

    1K20

    编程小知识之协变和逆变

    本文简述了 C# 中协变和逆变的一些知识 在 C# 中, 协变 和 逆变 能够实现 数组类型 和 委托类型 的隐式引用转换, .NET Framework 4 (包括)以后, C# 也开始支持在...C# 中协变对应的关键字为 out,我们一起来看个例子: // generics covariance delegate public delegate T CovarianceDelegate可以正确进行隐式引用转换,所以示例中将 d1(CovarianceDelegate) 赋值于 d2(CovarianceDelegate) 是合法的...C# 中逆变对应的关键字为 in, 我们同样先来看个示例: // generics contravariance delegate public delegate void ContravarianceDelegate...小结: 协变和逆变用于隐式引用转换 协变的关键字为 out,被其修饰的参数类型只能用于输出参数 逆变的关键字为 in,被其修饰的参数类型只能用于输入参数 子类总是可以安全的转为父类是保证协变和逆变类型安全的统一前提

    93830

    理解委托类型

    怕大家看了觉得乱七八糟不知道讲什么,先一句话描述下:如标题,在C#中委托是一种类型,如class一样也需要声明,定义,赋值,并与class在同一个层面 再介绍之前先看下相关内容的定义(我不是咬文嚼字,个人以为...yourMessage); 就像这样(不能定义在接口或函数中,但是可以在struct里面定义) 我们看看CLR是怎么处理这句话的 ?...这样) public static delegateLoopChangeEventHandler OnLoopChange; 我是在类里实例化的,所以可以加上修饰符(测试中为了直接给main函数使用,...来分析他说的这句十分精确的话“仅可从声明它们的类或结构(发行者类)中调用”  乍一看不是很简单实现吗,吧这个委托的示例用private 来修饰不就可以了(事实上VS在遇到event的时候也是这么处理的)...IL终究不是C#,不会影响结论:在C#委托 不是 类 委托的一般应用 跨类跨线程的消息通知(委托的执行是定义委托的类或线程,委托的赋值是其他类或线程,在没有invoke的情况下调用线程是执行线程,这种问题一般加事件修饰

    72000

    C#委托与事件学习笔记

    我又浏览了皱华栋老师JamesZou的博文《深入理解C#委托及原理》(地址:http://www.cnblogs.com/jameszou/archive/2011/07/21/2112497.html...委托可以看做是函数的指针。整数可以用整数变量指向它,对象可以用对象变量指向它,函数也可以用委托变量指向它。...和直接调用函数的区别:用委托就可以指向任意的函数,哪怕是之前没定义的都可以,而不使用受限于那几种。   ...:C# 中的委托类似于 C 或 C++ 中的函数指针。...然后调用该委托对象就可以执行委托对象内方法引用指向的方法,而不必在编译时知道将调用哪个方法(如参数为委托类型的方法,也就是提供了为程序回调指定方法的机制)。”

    46130

    C#语法——事件,逐渐边缘化的大哥。

    整体上看,好像就是在定义一个委托,只是在委托的定义之前,加了个event关键字。 没错,事件的定义就是这样,因为要声明一个事件,需要两个元素: 一,标识提供对事件的响应的方法的委托。...二,一个类,用存储事件的数据。即,事件要定义在类中。 下面我们来为这个事件赋值。...其中+=我们将他理解为【添加】。 代码中,我们使用两种赋值模式,但实际上都是为事件testEvent添加一个委。 第二种将函数直接【添加】到事件中,编译时也会把函数转换成委托【添加】到事件中。...sender:代表源,即触发该事件的控件。 e:代表事件参数,即触发该事件后,事件为被触发的委托,传递了一些参数,以方便委托在处理数据时,更便捷。 根据这个原理,我们可以分析出很多东西。...所以,我也不知道如何在C#里讲事件驱动编程。因为使用C#的框架就是使用事件驱动编程。 事件和委托到底是什么关系? 事件是用来多播的,并且用委托来为事件赋值,可以说,事件是基于委托来实现的。

    1.7K30

    C# 发展历史及版本新功能介绍

    IRevolve { } 它们等效于以下声明: C# class Earth : Planet, IRotate, IRevolve { } 限制 处理分部类定义时需遵循下面的几个规则: 要作为同一类型的各个部分的所有分部类型定义都必须使用...可以将 Lambda 表达式转换为该类型的委托,因为该表达式也具有一个输入参数 (x),以及一个编译器可隐式转换为 int 类型的返回值。 (以下几节中将对类型推理进行详细讨论。)...使用输入参数 5 调用委托时,它将返回结果 25。 在 is 或 as 运算符的左侧不允许使用 Lambda。 适用于匿名方法的所有限制也适用于 Lambda 表达式。...C# 3.0 开始为 C# 转变为面向对象/函数式混合语言打下基础。 具体来说,你现在可以编写 SQL 样式的声明性查询对集合以及其他项目执行操作。...例如,通过以函数定义的顺序按位置发送实参,可以采用标准方式调用打印订单详细信息(例如卖家姓名、订单号和产品名称)的函数。

    4.2K20

    30分钟LINQ教程

    在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型     (1)源起       在隐式类型出现之前,       我们在声明一个变量的时候,       ...我可以负责任的告诉你,这样写不会影响性能!       ...      使用起来颇多不便       而且委托本就代表某一类方法       开发人员经常使用的委托基本可以归为三类,       哪三类呢?       ....net为我们定义了一个委托,         这个委托表示的方法需要传入一个T类型的参数,并且需要返回一个bool类型的返回值         有了它,我们就不用再定义moreOrlessDelgate...泛型委托         Action泛型委托限制的就不那么死了,         他代表了一类方法:         可以有0个到16个输入参数,         输入参数的类型是不确定的,

    80520

    .NET面试题系列 - 委托与事件

    委托和事件 委托在C#中具有无比重要的地位。 C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影。...回调函数 回调函数是当一个函数运行完之后立即运行的另一个函数,这个函数需要之前函数的运行结果,所以不能简单的将他放在之前的函数的最后一句。回调函数在C#问世之前就已经存在了。...在C中,可以定义一个指针,指向某个函数的地址。但是这个地址不携带任何额外的信息,比如函数期望的输入输出类型,所以C中的回调函数指针不是类型安全的。...但是实际上,方法本身也可以看成是一种特殊类型的变量。 相同签名的方法具有相同的类型,在C#中,这个特殊的类型有一个名字,就叫做委托。...通过回调函数获得异步委托的执行结果 回调函数的用处是当委托完成时,可以主动通知主线程自己已经完成。我们可以在BeginInvoke中定义回调函数,这将会在委托完成时自动执行。

    1.2K20

    C# 基础知识系列- 12 任务和多线程

    在C#中,基于任务可以很简单的创建一个异步程序或者异步方法;同时任务也是一个简单的多线程模式。不过值得注意的是,C#的异步可以由多线程实现,但多线程更多的是用来实现并行。...根据之前《C# 基础知识系列- 11 委托和事件》那篇的介绍,我们可以很明确的得到 ThreadStart是一个 无返回值也没有参数的委托,而ParameterizedThreadStart表示有一个object...当然,C#的线程其实放宽了这部分的限制,这部分将在《C#异步编程系列》中继续探讨。...所以上一小节的创建的两个线程可以通过以下方式通知已经准备就续: thread1.Start(); 咦?是不是少了一个?注意力集中的小伙伴会发现,我没有演示thread2的调用方法。...在C# 中,创建一个线程需要传递一个委托进去,因为委托的性质,并没有限制是否是静态方法,所以这里也可以传一个对象的方法。当然了,我们十分不提倡这样做,因为会导致一些多线程领域里的一些问题。 2.

    1.4K30

    C#学习笔记二: 委托和事件的用法及不同.

    前言:  C#委托是什么     c#中的委托可以理解为函数的一个包装, 它使得C#中的函数可以作为参数来被传递, 这在作用上相当于C++中的函数指针....C++用函数指针获取函数的入口地址, 然后通过这个指针来实现对函数的操作. 委托的定义和方法的定义类似, 只是在定义的前面多了一个delegate关键字....正文: 委托可以被视为一个更高级的指针,它不仅仅能把地址传指向另一个函数,而且还能传递参数,返回值等多个信息。...,可以理解为一种特殊的委托。...如果使用 公有的delegate则不能做这些限制,也就是说事件对委托做了限制,使委托使用起来更加方便。 也有人说事件是对委托的阉割,大概也是这个意思。

    643150

    .NET基础面试题整理

    今年毕业,本学期找工作期间在面试前做的一些临时的准备 以下的关于老赵分享的面试题解答参考了手头的书籍和视频教程,以及网上的资料,现整理出来希望对大家有所帮助,不对或欠佳的地方望大家指出来我好改正。...但是可以添加构造函数没有析构函数没有 abstract 和 sealed(因为不能继承)不能有protected 修饰符可以不使用new 初始化在结构中初始化实例字段是错误的 类:有默认的构造函数 有析构函数...(2) 接口只能定义行为;抽象类既可以定义行为,还可能提供实现。...委托可以把一个方法作为参数代入另一个方法。 委托可以理解为指向一个函数的指针。 匿名方法:就是没有实际方法声明的委托实例。或者说,它们的定义是直接内嵌在代码中的。...Lambda表达式:是比匿名方法更加简洁的一种匿名函数语法 委托和事件没有可比性,因为委托是类型,事件是对象,下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。

    1.6K21

    C#语法之糖有点甜,语法之美很迷人

    "未知";//左边的变量如果为null则值为右边的变量,否则就是左边的变量值 匿名类型(var) var定义变量有以下四个特点: 1、必须在定义时初始化 2、一旦初始化完成,就不能再给变量赋与初始值不同类型的值了...3、var要求是局部变量 4、使用var定义变量和object不同,它在效率上和使用强类型方式定义变量完全一样 匿名类型的限制: 1、匿名类型不支持事件、自定义方法和自定义重写 2、匿名类型是隐式封闭的...局部函数的主要功能与匿名方法非常相似:在某些情况下,创建一个命名函数在读者的认知负担方面代价太大。...有时,函数本身就是另一个函数的部分逻辑,因此用一个单独的命名实体来污染“外部”范围是毫无意义的。您可能认为此功能是多余的,因为匿名委托或Lambda表达式可以实现相同的行为。...但事实并非如此,匿名函数有一定的限制,其特征可能不适合您的场景。

    1.1K20

    .NET周刊【8月第2期 2024-08-11】

    C#.Net筑基-解密委托与事件 https://www.cnblogs.com/anding/p/18229672 委托与事件是C#中用于将方法作为参数传递的技术,历史悠久。...委托类似函数指针,通过delegate关键字定义,继承自System.MulticastDelegate和System.Delegate。委托可以传递、调用方法,并支持多播。...多播委托允许组合多个方法。委托类实际上是编译器生成的密封类,执行通过Invoke方法。推荐使用?.Invoke操作符判断委托是否为null。...C#自定义快捷操作键的实现 - 开源研究系列文章 https://www.cnblogs.com/lzhdim/p/18342051 文章介绍了如何使用Windows API函数注册窗体热键,并提供了一个...本文给出了一个由于在测试中将同步任务返回为 Fake 而导致无限循环的示例。

    7710

    C# 7.3新特性一览

    泛型约束:枚举、委托和非托管 自C# 2.0引入泛型以来,开发人员就一直在抱怨,无法把一个泛型类型指定为枚举。这个问题终于解决了,你现在可以使用enum关键字作为泛型约束了。...我们移除了在ctor初始化器中不能声明表达式变量(out变量声明和声明方式)的限制。这样声明的变量其作用域是整个构造函数的函数体。...在C# 7.3中,你可以在创建数组时对其初始化,就像你对普通数组所做的那样。该提案没有提供细节,但微软正考虑预初始化一个主数组,当函数被调用时可以快速复制。...我们移除了在ctor初始化器中不能声明表达式变量(out变量声明和声明方式)的限制。这样声明的变量其作用域是整个构造函数的函数体。...在C# 7.3中,你可以在创建数组时对其初始化,就像你对普通数组所做的那样。该提案没有提供细节,但微软正考虑预初始化一个主数组,当函数被调用时可以快速复制。

    1.2K30
    领券