6.1 类型的各种成员 6.2 类型的可见性 public 全部可见 internal 程序集内可见(如忽略,默认为internal) 可通过设定友元程序集,允许其它程序集访问该程序集中的所有internal 类型.例如想允许强命名"Microsoft"程序集访问本程序集内的internal类型: using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Microsoft,PublicKey=…
//创建一个一维数组 int[] myIntegers; //声明一个数组引用 myIntegers = new int[100]; //创建含有100个int的数组 //创建一个二维数组 double[,] myDoubles = new double[10, 20]; //创建一个三维数组 string[,,] myStrings = new string[5, 3, 10]; //创建交错数组 Point[][] myPolygons = new Point[3][]; myPolygon…
13.1 类和接口继承 13.2 定义接口 C#用 interface 关键字定义接口.接口中可定义方法,事件,无参属性和有参属性(C#的索引器),但不能定义任何构造器方法,也不能定义任何实例字段. 13.3 继承接口 C#编译器要求将实现接口的方法(简称为"接口方法")标记为public. CLR要求将接口方法标记为 virtual .不将方法显式标记为 virtual ,编译器会将它们标记为 virtual 和 sealed;这会阻止派生类重写接口方法.将方法显式标记为 virtu…
7.1 常量 常量 是值从不变化的符号.定义常量符号时,它的值必须能够在编译时确定. 只能定义编译器识别的基元类型的常量,如果是非基元类型,需把值设为null. 常量的值直接嵌入代码,所以不能获取常量地址,不能以传引用的方式传递常量. 不能很好地支持跨程序集的版本控制(修改一个DLL中的常量值,需要重新编译所有引用该DLL的程序才可以). 只有确定一个符号的值从不变化才应定义常量. public sealed class SomeLibraryType { //注意:c#不允许为常量指定 sta…
6.1 类型的各种成员 在一个类型中,可以定义0个或者多个以下种类的成员: 常量 常量是在编译时设置其值并且永远不能更改其值的字段.使用常量可以为特殊值提供有意义的名称以代替数字文本,以使代码变得更容易阅读及维护.定义常量请使用关键字const.private const Int32 SomeConstant = 1; 字段 字段存储着类满足其设计所必须拥有的数据.例如,表示日历日期的类可能有三个整数字段:一个表示月份,一个表示日期,还有一个表示年份.强烈建议将字段声明为私有字段,防止类型的状态…
System.Nullable<T> 是结构. 19.1 C# 对可空值类型的支持 C# 允许用问号表示法来声明可空值类型,如: Int32? x = 5; Int32? y = null; System.Nullable<T>应用操作符解析规则: 一元操作符(+, ++, -, --, !, ~) 操作数是 null ,结果就是 null. 二元操作符(+, -, *, /, %, &, |, ^, <<, >>) 两个操作数任何一个是 null…
18.1 使用定制特性 FCL 中的几个常用定制特性. DllImport 特性应用于方法,告诉 CLR 该方法的实现位于指定 DLL 的非托管代码中. Serializable 特性应用于类型,告诉序列化格式化器一个实例的字段可以序列化和反序列化. AssemblyVersion 特性应用于程序集,设置程序集的版本号. Flags特性应用于枚举类型,枚举类型就成了位标志集合. C# 允许用一个前缀明确指定特性要应用于的目标元素.有时可省略,编译器能推断;有时则必须指定前缀. using Sys…
17.1 初识委托 .net 通过委托来提供回调函数机制. 委托确保回调方法是类型安全的. 委托允许顺序调用多个方法. 17.2 用委托回调静态方法 将方法绑定到委托时,C# 和 CLR 都允许引用类型的 协变性(covariance) 和 逆变性(contravariance). 协变性是指方法能返回从委托的返回类型派生的一个类型. 逆变性是方法获取的参数可以是委托的参数类型的基类. 只有引用类型才支持协变性与逆变性,值类型或 void 不支持 delegate object MyCallba…
泛型优势: 源代码保护 使用泛型算法的开发人员不需要访问算法的源代码.(使用c++模板的泛型技术,算法的源代码必须提供给使用算法的用户) 类型安全 向List<DateTime>实例添加一个String对象会报错. 更清晰的代码 减少了源代码中必须进行的强制类型转换次数,使代码更容易编写和维护. 更佳的性能 对于值类型实例,可以减少装箱拆箱次数. 12.1 FCL中的泛型 12.2 泛型基础结构 12.2.1 开放类型和封闭类型 具有泛型类型参数的类型称为开放类型,CLR禁止构造开放类型的任何…
5.1 编程语言的基元类型 c#不管在什么操作系统上运行,int始终映射到System.Int32; long始终映射到System.Int64 可以通过checked/unchecked操作符/语句打开或关闭溢出检查,如: byte b = 100; b = checked((byte)(b + 200)); uint invalid = unchecked((uint)(-1)); checked { b += 200; } 在checked操作符或语句中调用方法,不会对该方法造成任何影响,…
8.1 实例构造器和类(引用类型) 构造引用类型的对象时,在调用类型的实例构造器之前,为对象分配的内存总是先被归零 .没有被构造器显式重写的所有字段都保证获得 0 或 null 值. 构造器不能被继承.不能使用以下修饰符: virtual,new,override,sealed和abstract. 如果基类没有提供无参构造器,那么派生类必须显式调用一个基类构造器,否则编译器会报错. 如果类的修饰符为 static(sealed 和 abstract),编译器不会生成默认构造器.(静态类在元数据中…
9.1 可选参数和命名参数 class Program { private static int s_n = 0; private static void M(int x = 9, string s = "A", DateTime dt = default(DateTime), Guid guid = new Guid()) { Console.WriteLine("x={0},s={1},dt={2},guid={3}", x, s, dt, guid); } p…
15.1 枚举类型 枚举定义的符号是常量值. C#编译器编译时,会用数值替换符号,不再引用定义了符号的枚举类型.可能会出现一些版本问题. Enum.IsDefined(Type enumType, object value)方法被经常用于参数校验: public void SetColor(ConsoleColor c) { if (!Enum.IsDefined(typeof(ConsoleColor), c)) { throw new ArgumentOutOfRangeException(…
14.1 字符 三种数值类型与 Char 实例的相互转换: static void Main() { Char c; Int32 n; //方法一: 通过C#转型(强制类型转换)实现数字与字符的相互转换 //效率最高 c = (char)65; Console.WriteLine(c); //显示"A" n = (int)c; Console.WriteLine(n); //显示"65" c = unchecked((char)(65536 + 65)); Cons…
11.1 设计要公开事件的类型 11.1.1 第一步: 定义类型来容纳所有需要发送给事件通知接收者的附加信息 //第一步:定义一个类型来容纳所有应该发送给事件通知接收者的附加信息 internal class NewMailEventArgs : EventArgs { private readonly string m_from, m_to, m_subject; public NewMailEventArgs(string from, string to, string subject) {…
10.1 无参属性 10.1.1 自动实现的属性 10.1.2 合理定义属性 属性可以只读或只写,而字段访问总是可读和可写的(一个例外是 readonly 字段仅在构造器中可写). 属性方法可能抛出异常;字段访问永远不会. 属性不能作为 out 或 ref 参数传给方法,而字段可以. 属性方法可能花较长时间执行,字段访问则总是立即完成.线程同步不要使用属性,而用方法.从MashalByRefObject派生的类永远都不应该使用属性. 连续多次调用,属性方法每次都可能返回不同的值,字段则每次都返回…
编程语言的基元类型   某些数据类型如此常用,以至于许多编译器允许代码以简化的语法来操纵它们. System.Int32 a = new System.Int32();  // a = 0 a = 1;   等价于: int a = 1; 这种语法不仅增强了代码的可读性,其生成的IL代码与使用System.Int32时生成的IL代码是完全一致的.   编译器直接支持的数据类型称为基元类型(primitive type).基元类型直接映射到Framework类库(FCL)中存在的类型.如C#中,i…
Cp6类型和成员基础 成员 常量:字段(静态字段和实例字段):实例构造器:类型构造器(用于静态字段的构造):方法(静态方法和实例方法):操作符重载(本质是一个方法):转换操作符:属性(本质还是方法):事件(委托):类型(嵌套类): 类型的可见性 public,private,protected,internal,sealed,默认的类是internal. 友元程序集 这部分看看就行了 成员的可访问性 private protected(对应clr是Family),internal(对应clr是a…
原文:[CLR via C#]6. 类型和成员基础 6.1 类型的各种成员 在一个类型中,可以定义0个或多个以下种类的成员: 1)常量    常量就是指出数据值恒定不变的符号.这些符号通常用于使代码更容易阅读和维护.常量通常与类型关联,而不与类型的实例关联.从逻辑上讲,常量始终是静态成员. 2)字段    字段表示一个只读或可读/写的数据值.字段可以是静态的,这时是类型状态的一部分:字段也可以是实例(非静态)的,这时字段是对象状态的一部分.强烈建议将字段声明成为私有字段,防止类型或对象状态被外部…
本章内容: 1 所有类型都从System.Object派生 2 类型转换 3 命名空间和程序集 4 运行时的相互关系   本章讲述使用类型和CLR时需掌握的基础知识.具体地说,要讨论所有类型都具有的一组基本行为. 讨论类型安全性.命名空间.程序集.以及如何将对象从一种类型转换成另一种类型. 本章最后会解释类型.对象.线程栈和托管堆在运行时的相互关系.   4.1 所有类型都从System.Object派生 CLR要求每个类型最终都从System.Object类型派生.从而确保类每个对象都具备一组…
类型的各种成员 类型可以定义以下种类的成员 1 常量 常量是指出数据值恒定不变的符号.这种符号使代码更易阅读和维护.常量总与类型管理,不与类型的实例管理.常量逻辑上总是静态成员. 2 字段 字段表示只读或可读.可写的数据值.字段可以是静态的,这种字段被认为是类型状态的一部分.字段也可以是实例(非静态),这种字段被认为是对象状态的一部分.强烈建议将字段声明为私有,防止类型或对象的状态被类型外部的代码破坏 3 实例构造器 实例构造器是将新对象的实例字段初始化为良好初始状态的特殊方法. 4 类型构造器…
目录 第七章 C控制语句:分支和跳转 第八章 字符输入/输出和输入验证 第九章 函数 第十章 数组和指针 第七章 C控制语句:分支和跳转 if else 用法 if (expression) //expression为真时,运行花括号内语句 { statement1 } else //不为真时,运行else的花括号内语句 { statement2 } ctype.h系列的字符函数 #include <stdio.h> #include <ctype.h> //包含isalpha()…
目录 第四章 字符串和格式化输入/输出 第五章 运算符.表达式和语句 第六章 C控制语句:循环 虽然匆匆忙忙,但还是要做笔记,虽然大概都知道...... 挑一些容易忘记的地方 第四章 字符串和格式化输入/输出 C语言没有专门储存字符串的变量类型,字符串通常被存储在char类型的数组中,字符串在末尾会有一个空字符\0,一种非打印字符,ASCⅡ码是0.C语言中字符串一定以空字符结束,这意味着数组的容量至少比存储字符串的字符数多1.通常可以用'\0'字符来作为遍历字符串的结束条件. strlen()函…
目录 第一章 初识C语言 1 使用C语言的7个步骤 1.1 定义程序目标 1.2 设计程序(功能实现) 1.3 编写代码 1.4 编译 1.5 运行程序 1.6 测试和调试程序 1.7 维护和修改代码 2 windows下集成开发环境 第二章 C语言概述 1 示例程序1 1.1 程序讲解 1.1.1 头文件 1.1.2 main函数 1.1.3 注释 1.1.4 花括号.声明 1.1.5 赋值.printf函数.return语句 2 示例程序2 2.1 程序讲解 2.1.1 多条声明 2.1.2…
一.代码 1. package org.jpwh.model.inheritance.tableperclass; import org.jpwh.model.Constants; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persi…
一.结构 二.代码 1. package org.jpwh.model.inheritance.mappedsuperclass; import javax.persistence.MappedSuperclass; import javax.validation.constraints.NotNull; @MappedSuperclass public abstract class BillingDetails { @NotNull protected String owner; // ...…
There are four different strategies for representing an inheritance hierarchy: Use one table per concrete class and default runtime polymorphic behavior. Use one table per concrete class but discard polymorphism and inheritance relationships comple…
一.结构 二.Hibernate支持的UserTypes接口  UserType —You can transform values by interacting with the plain JDBC PreparedStatement (when storing data) and ResultSet (when loading data).By implementing this interface, you can also control how Hibernate caches a…
一.结构 二.代码 1. package org.jpwh.model.advanced; import java.io.Serializable; import java.math.BigDecimal; import java.util.Currency; /* This value-typed class should be <code>java.io.Serializable</code>: When Hibernate stores entity instance dat…
一.简介 1. 2. 3. 4. to override this default mapping. The JPA specification has a convenient shortcut annotation for this purpose, @Lob @Entity public class Item { @Lob protected byte[] image; @Lob protected String description; // ... } This maps the by…