zoukankan      html  css  js  c++  java
  • 7.C#基础之表达式(完成)

         表达式是运算符和操作数的序列。一个表达式可归类为:值、变量、命名空间、类型、方法组、属性访问、事件访问、索引器访问、Nothing,但表达式的最终结果绝不会是一个命名空间、类型、方法组或事件访问,这种表达式是只能在特定上下文中使用的中间构造。

      7.1运算符

         表达式的运算符指示对操作数进行什么样的运算。运算符有三类:一元运算符、二元运算符、三元运算符(只有一个,是"?")。

         表达式中运算符的计算顺序由运算符的优先级和顺序关联性确定;操作数的顺序是从左到右,比如f(i)+g(i++)*h(i),先用i的值调用f方法,然后用新值调用g方法,最后用新值调用h方法,这就与运算符的优先级无关。

       7.1.1 运算符的优先级和顺序关联性

         在第一章已经发过一张图,在这就再发一次。

         当操作数出现具有相同优先级的两个运算符之间时,运算符的顺序关联性控制运算的执行顺序:

              除了赋值运算符外,所有的二元运算符都向左顺序关联,即从左向右执行;

              赋值运算符和条件运算符(?:)向右顺序关联,即从右向左执行运算,比如x=y=z,先计算y=z。

       7.1.2 运算符重载

         所有一元和二元运算符都具有可自动用于任何表达式的预定义实现,除了这个,还可以通过在类或结构中设置operator声明引入用户定义的实现,切用户定义的运算符实现的优先级总是高于预定义运算符实现的优先级,仅当没有适用的用户定义运算符实现时才考虑预定义运算实现符。

            可重载的一元运算符有:+、-、!、~、++、--、true、false

            可重载的二元运算符有:+、-、*、/、%、|、^、《、》、==、!=、<、>、<=、>=

         只有上面的可以重载,当重载一个二元运算符后,也会隐式重载相应的赋值运算符,比如重载了*,也会重载*=。

         用户定义的运算符声明总是要求至少一个参数为包含运算符声明的类类型或结构类型,切用户定义的运算符声明不能修改运算符的语法、优先级或顺序关联性。

      7.2成员查找

         成员查找是确定类型上下文的名称含义的过程;比如查找在T类型中的名称N的成员:

             首先构造一个在T和T基类型中声明名为N的所有可访问成员的集合,包含override修饰符在内的声明;

             其次从该集合移除被其他成员隐藏的成员;

             最后如果结果集合是由一个非方法成员组成,则此成员就是结果;如果集合只包含方法,则此方法就是结果;否则查找失败。

      7.3函数成员

         函数成员是包含可执行语句的成员,且函数成员总是类型的成员,不能是命名空间的成员。C#定义了类别的函数成员有:方法、属性、事件、索引器、用户定义运算符、实例构造函数、静态构造函数、析构函数。

         除了析构函数和静态构造函数(它们不能被显式调用),其他成员中包含的语句是通过函数成员调用执行的。

       7.3.1 参数列表

         每个函数成员调用均包括一个参数列表,如何指定函数成员调用的参数列表的语言取决于函数成员的类型:

              对于实例构造函数、方法、委托,参数被指定为参数列表;

              对于属性,调用get访问器时,参数列表是空的;带用set访问器时,由指定为赋值运算符的左操作数的表达式组成;

              对于事件,参数列表由指定为+=或-=运算符的左操作数的表达式组成;

              对于索引器,参数列表由在索引器访问中的方括号之间指定的表达式组成;

              对于用户定义的运算符,由一元运算符的单个操作数或二元运算符的两个操作数组成

         对于属性、事件、索引器、用户定义的运算符来说,它们的参数总是作为值参数来传递,因为它们类型不支持引用参数和输出参数;而实例构造函数、方法、委托的参数列表是:

       7.3.2重载决策

         重载决策是一种编译时机制,用于在给定了参数列表和一组候选函数成员的情况下,选择一个最佳函数成员来实施调用;在C#内,重载决策在下列不同的上下文中选择一个应调用的函数成员:

              要调用的方法名称出现在调用表达式中; 

              要调用的实例构造函数出现在对象创建表达式中; 

              对索引器访问器的调用出现在元素访问中;

              要调用的预定义运算符或用户定义的运算符出现在表达式中。

         一旦确定了候选函数成员和参数列表,若果给定了适用的候选函数成员集,则在其中选出最佳函数成员。若果该集合只包含一个函数成员,则这个函数成员就是最佳函数成员;否则依据成员对给定的参数列表的匹配程度选择。

      7.4基本表达式

         基本表达式包括最简单的表达式形式:

       7.4.1 文本

         由文本组成的基本表达式属于值类别。

       7.4.2 简单名称

         简单名称由单个标识符组成。

       7.4.3 带括号的表达式

       7.4.4 成员访问

       7.4.5 调用表达式

         调用表达式的基本表达式必须是方法组或委托类型的值。

       7.4.6 元素访问

         如果元素访问的非数组创建基本表达式是数组类型的值,则该元素访问是一个数组访问;否则该非数组创建基本表达式必须是具有一个或多个索引器成员的类、结构或接口类型的变量或值,在这种情况,元素访问为索引器访问。

       7.4.7 this访问

         this访问由保留字this组成。

         this访问只能在实例构造函数、实例方法或实例访问器的"块"中使用。

       7.4.8 base访问

         base访问由保留字base,后跟一个"."和一个标识符,或一个用方括号括起来的表达式组成:

         base访问用于访问被当前类或结构成员隐藏的基类成员。同样,base访问只能在实例构造函数、实例方法或实例访问器的块中使用。

       7.4.9 后缀增量和后缀减量运算符

         它们的操作数必须是属于变量、属性访问或索引器访问类别的表达式;若果它们的操作数是属性或索引器访问,则该属性或索引器访问必须同时具有get和set访问器,否则会发生编译时错误。

         注:x++和x--的结果是运算之前x的值,而++x和--x的结果是运算之后x的值;不管哪种情况,运算后x本身都具有相同的值。

       7.4.10 new运算符

         new运算符用于创建类型的新实例,有三种形式的new表达式:1.对象创建表达式:用于创建类类型和值类型的新实例;

                                                                2.数组创建表达式:用于创建数组类型的新实例; 

                                                                3.委托创建表达式:用于创建委托类型的新实例。

         new运算符表示创建类型的一个实例,但并不表示要为它动态分配内存。

       7.4.11 typeof运算符

         typeof运算符用于获取类型的System.Type对象,比如typeof(int)   显示输出System.Int32

       7.4.12 check和unchecked运算符

         check和unchecked运算符用于控制上下文中是否实施关于整型算术运算和转换的溢出检查。

         对于不用任何check和unchecked运算符或语句括起来的非常数表达式,除非外部因素要求check计算,否则溢出检出默认是unchecked;对于常数表达式,默认的是checked。

      7.5一元运算符

      7.6算术运算符

         

      7.7移位运算符

         当声明重载位移运算符时,第一个操作数的类型必须总是包含运算符声明的类或结构,第二个操作数的类型必须是int。

      7.8关系和类型测试运算符

         所有预定义的比较运算符都返回bool类型的结果:

      7.9逻辑运算符

         在预定义的布尔逻辑运算符中,如果x和y均为true,则x&y为true,否则为false;如果x或y为true,x|y为true,否则为false;如果x为true,y为false,或x为false,y为true,则x^y的结果为true。

      7.10条件逻辑运算符

          &&和||运算符是&和|运算符的条件版本,x&&y:当且仅当x为true时才计算y;x||y:当且仅当x为false才计算y。

      7.11条件运算符

         b?x:y    首先计算b,如果b为true,计算x;如果b为false,计算y。条件运算符是向右关联,表示运算从右到左分组,例如a?b:c?d:e形式的表达式按a?b:(c?d:e)计算。

      7.12赋值运算符     

         赋值运算符是向右关联;除=外的赋值运算符称为复合赋值运算符;以事件访问表达式作为左操作数的+=和-=运算符称为事件赋值运算符,且事件赋值表达式不产生值。

      7.13表达式

      7.14常数表达式

         常数表达式是编译时可以完全计算出结果的表达式。

      7.15布尔表达式

  • 相关阅读:
    keras环境搭建
    通过程序自动设置网卡的“internet共享”选项
    编译pjsip源码
    电商开发必备,淘宝商品和类目体系是如何设计的
    pom.xml成了普通xml文件
    springboot application.properties不生效
    SpringBoot进阶教程(七十二)整合Apollo
    SpringBoot进阶教程(七十一)详解Prometheus+Grafana
    SpringBoot进阶教程(七十)SkyWalking
    Java8 lamda表达式
  • 原文地址:https://www.cnblogs.com/dreamoffire/p/10084181.html
Copyright © 2011-2022 走看看