,如数字、常量字符串、null、const 成员和枚举成员等 参数数组不能为可选参数 用ref或out关键字标识的参数不能被设置为可选参数 命名实参 当调用带有可选参数的方法时,如果我们省略了一个参数,...,这样编译器将判断参数的名称是否正确,然后将指定的值赋给对应的参数,从而达到只省略第二个参数的目的 泛型的可变性 在 C# 2.0 中,泛型并不具备可变形,这种可变形是指协变性和逆变性。...引用类型数组也存在这种从子类引用到父类引用的转化,例如string[]可以转换为object[] string[] strs = new string[3]; object[] objs = strs;...C# 2.0 确实是不支持的,但因为有了这样的需求,微软便适应地做出了改进,在 C# 4.0 中引入了泛型的协变性和逆变性 协变性 协变性指的是泛型类型参数可以从一个派生类隐式地转换为基类 C# 4.0...,反之则失败 逆变性 逆变性是指泛型类型参数可以从一个基类隐式地转换为派生类,C# 4.0 引入in关键字来标记泛型参数,以示其支持逆变性,下面以 .Net 类库中的接口public interface
Red,Green,Blue} let c:Color = Color.Green 复制代码 any 在编程阶段还不清楚类型的变量指定一个类型,值可能是动态输入,但是 Object 类型的变量值允许你给她赋任意的值...;泛型是一种特殊的变量,只用于表示类型而不是值 泛型函数 function identity(arg:T):T { return arg; } let output = identity(arg:T):T} = identity 复制代码 可以使用带有调用签名的对象字面量来定义泛型函数,我们可以将对象字面量拿出来作为一个接口,将一个泛型参数当做整个接口的一个参数...new GeneriNumber() 复制代码 类有两个部分:静态部分和实例部分,泛型类指的实例部分,所以静态属性不能使用这个泛型类型,定义接口来描述约束条件 泛型约束 interface..., 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用 类 ?
覆盖:覆盖是指派生类重写基类的方法,使用基类指向其子类的实例对象,或接口的引用变量指向其实现类的实例对象,在程序调用的运行期根据引用变量所指的具体实例对象调用正在运行的那个对象的方法,即需要到运行期才能确定调用哪个方法...静态内部类不能与外部类有相同的名字,不能访问普通成员变量,只能访问外部类中的静态成员和静态成员方法。 为什么要把 String 设计为不可变?...== 比较的是引用,equals 比较的是内容。 如果变量是基础数据类型,== 用于比较其对应值是否相等。如果变量指向的是对象,== 用于比较两个对象是否指向同一块存储空间。...在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型在类中称为泛型类、接口中称为泛型接口和方法中称为泛型方法。...简述泛型擦除 Java 编译器生成的字节码是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程被称为泛型擦除。 简述注解 Java 注解用于为 Java 代码提供元数据。
覆盖:覆盖是指派生类重写基类的方法,使用基类指向其子类的实例对象,或接口的引用变量指向其实现类的实例对象,在程序调用的运行期根据引用变量所指的具体实例对象调用正在运行的那个对象的方法,即需要到运行期才能确定调用哪个方法...简述泛型 泛型,即“参数化类型”,解决不确定对象具体类型的问题。在编译阶段有效。...在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型在类中称为泛型类、接口中称为泛型接口和方法中称为泛型方法。...简述泛型擦除 Java编译器生成的字节码是不包涵泛型信息的,泛型类型信息将在编译处理时被擦除,这个过程被称为泛型擦除。...拆箱装箱原理 装箱过程是通过调用包装器的valueOf方法实现的,将原值赋给对应类。
struct 不支持继承,不能作为基类。结构体是密封的,不能被继承。装箱和拆箱:class 在进行值类型到引用类型的转换时会发生装箱(Boxing)和拆箱(Unboxing)。...(如果有):如果存在继承关系,首先执行父类的静态构造函数。...重写涉及到基类和派生类之间的关系,基类中的虚方法在派生类中被重新实现。重载是编译时的多态性,根据调用时提供的参数类型来确定调用哪个方法。重写是运行时的多态性,根据对象的实际类型来确定调用哪个方法。...重载和重写分别应用于不同的场景,取决于你解决的问题是在类内提供多个版本的方法(重载)还是在继承体系中提供对基类虚方法的新实现(重写)。17. 静态方法可以访问非静态变量吗?如果不可以为什么?...GetEnumerator 方法返回一个实现 IEnumerator 接口或其泛型版本 IEnumerator 的迭代器对象。
概念1:继承 1.C#语言的继承方式为单继承。继承中的基类代表父类,继承者称为派生类。 2.隐藏方法:如果想在派生类中定义一个和基类中重名的方法,但是实现过程不一样,这中操作叫隐藏方法。...注意:为屏蔽父类中的那个方法,派生类中声明名称和类型、及函数名都要与父类的对应的方法相同,且声明这个方法的时候要用new关键字。 ? ?...多态--通过指向派生类的基类(统一)调用,调用虚函数,会根据引用所指向派生类的实际类型,调用派生类中的同名重写函数,即为多态(个性张扬)。...概念4:泛型 1.泛型类:可理解为一个模子,装入类型的材料,就可以塑造出想要的产品。 2.语法展示: ? ? 3.泛型使用的原因: ? 4.泛型实例化过程 ?...6.泛型方法:泛型方法就是方法的模型,给定具体的类型,就可以实例化出一个操作该类型的具体方法。(泛型方法可存在于泛型类和普通类中) 7.语法展示: ? ? ? 8.约束:约束就是控制泛型的控制器。
继承的类称为子类、派生类,而被继承类称为父类、基类或超类。通过继承,使得子类具有父类的属性和方法,同时子类也可以通过加入新的属性和方法或者修改父类的属性和方法建立新的类层次。...在.NET中,WeakReference 类用于表示弱引用,通过其 Target 属性来表示要追踪的对象,通过其值赋给变量来创建目标对象的强引用. 4.尽可能以 using 来执行资源清理。...5.推荐使用泛型集合来代替非泛型集合。 6.初始化时最好为集合对象指定大小。 7.特定类型的 Array 性能优于 ArrayList。...作为约束,用于在泛型声明中约束可能用作类型参数的参数的类型。 MSDN 中的定义是:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。...当泛型类创建类型的新实例时,将此约束应用于类型参数。
上面说的是怎么区分哪些C#值类型和C#引用类型,而使用上也是有区别的。所有值类型的数据都无法为null的(这里可空类型是可以为空的),声明后必须赋以初值;引用类型才允许 为null。...1.3引用类型中嵌套定义值类型 如果类的字段类型是值类型,它将作为引用类型实例的一部分,被分配到托管堆中。但那些作为局部变量 (例如下列代码中的c变量)的值类型,则仍然会分配到线程堆栈中。...2,两大类型间的转换--装箱与拆箱 类型转换主要分为以下几种方式: 1, 隐式类型转换:由低级别类型向高级别类型的转换过程。例如:派生类可以隐式的转换为它的父类,装箱过程就输入这种隐式类型转换。...拆箱过程也可以具体分为3个步骤: (1)检查实例:首先检查要进行拆箱操作的引用类型变量是否为null,如果为null则抛出空指针异常,如果不为null则继续减产变量是否合拆箱后的类型是同一类型,若不是则会抛出...3、而带有静态构造函数的类的静态字段,只有在引用到的时候才进行初始化。
3.10尽量使用属性而不是字段 3.11 接口中的属性 4 泛型 4.1string.Join方法不能识别泛型 5 集合 5.1 关于集合的标准查询运算符 5.2 提高集合插入性能...3.1 配置文件中使用静态字段或静态属性 静态变量是在静态变量所属类初次使用时被初始化的,当静态字段被初始化后,之后每次调用获得的值都是初始化时赋给静态字段的值,除非在这个过程中显示地给静态字段赋值。...3.2 虚方法中不要含有业务逻辑 使用virtual修饰符修饰类的方法,那么这个方法就可以在派生类中重写,如果原来的方法包含业务逻辑,派生类重写这个方法后,由于派生类将父类中的虚方法完全覆盖,导致虚方法中的业务逻辑永远不会被执行...如果父类有几个重载的构造函数而子类未指定构造函数,那么将调用父类的哪一个构造函数呢? 对于继承中涉及到的构造函数的调用问题是比较复杂的。 首先,父类的构造函数先于子类的构造函数被调用。...4.1string.Join方法不能识别泛型 string JoinStr(T set) { Return string.Join(“,”,set); } 上面这个方法不能正确返回拼接后的字符串
C++强制要求指向const对象的指针也必须具有const特性,可以把非const对象地址赋给const指针。...const指针:int *const cur = &cuss; 指向int型变量的指针,并且本身不能修改。...int() {return data;data是Integer的私有成员}】 virtual函数是基类希望派生类重新定义的函数,希望派生类继承的函数不能为虚函数。...如果知道基类到派生类的转换【这种转换是基类地址赋给派生类指针】是安全的【就是说心里清楚基类指针指向的确实是派生类】,可以使用static_cast强制编译器进行转换。...泛型代码两个原则:1.模板形参是const引用 2.函数体中只用<比较 模板形参数量自由,可以设定返回值为一个形参。
当然可以的,这个问题其实我们之前的文章里讲过。 这里会发生一个隐式类型转换嘛,会产生一个临时变量,临时变量的值就是y转换为int类型的值,然后再把这个临时变量赋给x。...另外临时变量具有常性,如果你赋给引用的话还得加const嘛。 2.1 派生类对象赋值给基类对象 那大家看这样可以吗?...2.2 派生类对象赋值给基类对象的引用 那除此之外呢,还可以这样搞: 还可以赋给Person类对象的引用,即子类对象可以赋值给基类对象的引用。...那对它解引用就相当于拿到一个父类的对象,这个父类对象可以认为是从子类对象中切出来的属于父类的那一部分。 2.4 基类对象不能赋值给派生类对象 我们刚才是把派生类对象赋值给基类,那反过来可以吗?...基类可以赋值给派生类吗? 是不行的,基类对象不能赋值给派生类对象。
多态的分类 多态主要分为以下几种类型: 变量多态:基类型的变量(对于C++是引用或指针)可以被赋值基类型对象,也可以被赋值派生类型的对象。...支持泛型编程: 在一些支持泛型编程的语言中(如C++的模板),多态也是实现泛型编程的重要机制之一。...,如果子类写了个和父类函数原型一样的函数,并且父类中的函数没有声明为虚函数,则子类会直接覆盖掉父类的函数 通过父类指针或引用执行子类对象时,会调用父类的函数 虚函数重写 必须发生于父类和子类之间...并且父类与子类中的函数必须有完全相同的原型 使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义) 多态是在运行期间根据具体对象的类型决定函数调用 虚函数 虚函数是基类中声明并在派生类中可以重写的函数...由于至少含有一个纯虚函数,抽象类不能被实例化(即不能直接创建该类的对象)。抽象类的主要用途是作为一个基类,为派生类提供一个公共的接口。
问题二:从ArrayList的角度说一下为什么要用泛型? 答: 在Java增加泛型机制之前就已经有一个ArrayList类,这个ArrayList类的泛型概念是使用继承来实现的。...问题四:说说泛型方法的定义和使用 答: 泛型方法可以定义在普通类中,也可以定义在泛型类中,类型变量是放在修饰符的后面,返回类型的前面。...这里需要注意泛型和Java数组之间的区别,可以将一个Rapper[]数组赋给一个类型为Singer[]的变量: Rapper[] rappers = ...; Singer[] singer = rappers...通配符限定与类型变量限定非常相似,但是通配符类型还有一个附加的能力,即可以指定一个超类型限定: ? super Rapper 这个通配符限制为Rapper的所有父类,为什么要这么做呢?...总结一下: 带有超类型限定的通配符可以向泛型对象写入,带有子类型限定的通配符可以从泛型对象读取。 问题九:泛型在虚拟机中是什么样呢? 答: 虚拟机没有泛型类型对象,所有的对象都属于普通类。
带有默认构造函数的基类,如果一个没有任务构造函数的派生类派生自一个带有默认构造函数基类,那么该派生类会合成一个构造函数调用上一层基类的默认构造函数; 3) 带有一个虚函数的类 4) 带有一个虚基类的类...如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体的类。 抽象类是不能定义对象的。一个纯虚函数不需要(但是可以)被定义。...1) 向上类型转换 将派生类指针或引用转换为基类的指针或引用被称为向上类型转换,向上类型转换会自动进行,而且向上类型转换是安全的。...类似的,使用未命名的变量的值赋给一个对象时,调用移动赋值操作; 5) Example6 (Example6&& x) : ptr(x.ptr) { x.ptr = nullptr;...举个例子,int a = b+c, a 就是左值,其有变量名为a,通过&a可以获取该变量的地址;表达式b+c、函数int func()的返回值是右值,在其被赋值给某一变量前,我们不能通过变量名找到它,&
使用const修饰的引用表示常引用,即引用的变量是常变量,这样一来,是防止在函数中对常引用的修改,多用于修饰类的常对象。如果将值调用的形参声明为常量,则没有多大的使用价值。...为什么基类类型指针在被子类对象赋值后不能访问子类的成员函数呢?...对象赋给另外一个对象的引用或者指针时,如何传递的 当对象赋给另外一个对象的引用或者对象时候,将调用被赋值的拷贝构造函数。此时就存在深拷贝和浅拷贝。...深拷贝存在的情况就是在类成员中有非基本数据类型的变量时,比如指针,数组或者引用。...当对象赋给另外类的指针时候,指针存放的就是对象的首地址,只不过此时系统会进行类型转换。
T c) { if(b > a) a = b; if(c > a) a = c; } //如果不使用函数模板 实现泛型调用 你需要使用指针和2倍数量的参数再加上一个switch分支判断语句...//静态变量又称类变量 普通变量也称实例变量 //普通变量 是属于对象的 //静态变量不能在构造函数中初始化 只能在全局初始化(类外体) //int Box:: height = 111; //初始化后才算定义完毕...dd = c + d; dd = d + c; //类型转换函数实现的Complex与double类型变量相加 ,返回值为double 19.继承与派生 声明派生类的一般形式为: class 派生类名...//在有父类的构造函数、子对象的情况下,如果创建当前的对象 //则构造函数执行的顺序为:父类的构造函数,子对象的构造函数,当前对象的构造函数。...子类隐藏父类的方法 如果是多态的方法(虚方法):子类覆盖父类的方法 //在父类析构函数之前加virtual //父类的虚析构函数,解决子类对象赋值给父类指针后,当delete父类指针时,无法调用子类析构函数的问题
这里需要注意泛型和Java数组之间的区别,可以将一个 Apple[]数组赋给一个类型为 Fruit[]的变量: Apple[] apples = ......通配符限定与类型变量限定非常相似,但是通配符类型还有一个附加的能力,即可以指定一个超类型限定: ? super Apple 这个通配符限制为 Apple的所有父类,为什么要这么做呢?...带有超类型限定的通配符的行为与子类型限定的通配符行为完全相反,可以为方法提供参数,但是却不能获取具体的值,即访问器是不安全的,而更改器方法是安全的: ?...总结一下,带有超类型限定的通配符可以想泛型对象写入,带有子类型限定的通配符可以从泛型对象读取。 还可以使用无限定的通配符,例如, Pair。...反射与泛型 反射允许我们在运行时分析任意的对象,但是如果对象是泛型类的实例,关于泛型类型参数则得不到太多信息,因为它们会被擦除。
(和override有区别,下面进行讲解) 三、new 约束 new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。 如果要使用 new 约束,则该类型不能为抽象类型。...4.抽象类不能定义为密封类(sealed),抽象方法不能使用virtual、static、private修饰符 5.如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。...情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。...2、如果存在多个静态类,那么初始化的静态成员的顺序会根据引用的顺序,先引用到的先进行初始化,但如果类的静态成员的初始化依赖于其他类的静态成员,则会先初始化被依赖的静态成员。 ...3、而带有静态构造函数的类的静态字段,只有在引用到的时候才进行初始化。
错题解析:内联函数是在编译的时候已经做好将对应的函数代码替换嵌入到对应的位置,适用于代码较少的函数。 宏定义是简单的替换变量,如果定义的是有参数的函数形式,参数不做类型校验。...正确答案: 内联函数是在编译的时候已经做好将对应的函数代码替换嵌入到对应的位置,适用于代码较少的函数。 宏定义是简单的替换变量,如果定义的是有参数的函数形式,参数不做类型校验。...子类继承父类大部分的资源,不能继承的有构造函数,析构函数,拷贝构造函数,operator=函数,友元函数等等 13、 什么是“引用”?申明和使用“引用”要注意哪些问题?...重写:当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。...重写:当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。
受保护的内部变量/方法可在同一程序集中以及从该父类派生的类中访问。 22、System.String和System.Text.StringBuilder类之间有什么区别?...另一方面,Finalize()用于相同的目的,但不能保证对象的垃圾回收。 28、什么是循环引用? 循环引用是指两个或多个资源相互依赖导致锁定条件并使资源无法使用的情况。...29、 C#.NET中的泛型是什么? 泛型用于制作可重用的代码类,以减少代码冗余,提高类型安全性和性能。使用泛型,我们可以创建集合类。...若要创建通用集合,应使用System.Collections.Generic命名空间代替System.Collections命名空间中的诸如ArrayList之类的类。泛型提倡使用参数化类型。...可以使用参数的不同数据类型,参数的不同顺序和参数的数量来重载方法。 38、为什么不能为接口内的方法指定可访问性修饰符? 在接口中,我们有没有方法定义的虚拟方法。所有方法都将在派生类中被覆盖。
领取专属 10元无门槛券
手把手带您无忧上云