7.1 常量 常量 是值从不变化的符号.定义常量符号时,它的值必须能够在编译时确定. 只能定义编译器识别的基元类型的常量,如果是非基元类型,需把值设为null. 常量的值直接嵌入代码,所以不能获取常量地址,不能以传引用的方式传递常量. 不能很好地支持跨程序集的版本控制(修改一个DLL中的常量值,需要重新编译所有引用该DLL的程序才可以). 只有确定一个符号的值从不变化才应定义常量. public sealed class SomeLibraryType { //注意:c#不允许为常量指定 sta…
17.1 初识委托 .net 通过委托来提供回调函数机制. 委托确保回调方法是类型安全的. 委托允许顺序调用多个方法. 17.2 用委托回调静态方法 将方法绑定到委托时,C# 和 CLR 都允许引用类型的 协变性(covariance) 和 逆变性(contravariance). 协变性是指方法能返回从委托的返回类型派生的一个类型. 逆变性是方法获取的参数可以是委托的参数类型的基类. 只有引用类型才支持协变性与逆变性,值类型或 void 不支持 delegate object MyCallba…
6.1 类型的各种成员 6.2 类型的可见性 public 全部可见 internal 程序集内可见(如忽略,默认为internal) 可通过设定友元程序集,允许其它程序集访问该程序集中的所有internal 类型.例如想允许强命名"Microsoft"程序集访问本程序集内的internal类型: using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Microsoft,PublicKey=…
8.1 实例构造器和类(引用类型) 构造引用类型的对象时,在调用类型的实例构造器之前,为对象分配的内存总是先被归零 .没有被构造器显式重写的所有字段都保证获得 0 或 null 值. 构造器不能被继承.不能使用以下修饰符: virtual,new,override,sealed和abstract. 如果基类没有提供无参构造器,那么派生类必须显式调用一个基类构造器,否则编译器会报错. 如果类的修饰符为 static(sealed 和 abstract),编译器不会生成默认构造器.(静态类在元数据中…
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…
//创建一个一维数组 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…
泛型优势: 源代码保护 使用泛型算法的开发人员不需要访问算法的源代码.(使用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操作符或语句中调用方法,不会对该方法造成任何影响,…
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派生的类永远都不应该使用属性. 连续多次调用,属性方法每次都可能返回不同的值,字段则每次都返回…
目录 第七章 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…
一.数据库 二.代码 1. package org.jpwh.model.advanced; import javax.persistence.AttributeOverride; import javax.persistence.AttributeOverrides; import javax.persistence.Column; import javax.persistence.Embeddable; import javax.validation.constraints.NotNull;…
Each @AttributeOverride for a component property is “complete”: any JPA or Hibernate annotation on the overridden property is ignored. This means the @Column annotations on the Address class are ignored—all BILLING_* columns are NULL able!(Bean Valid…
一.数据库 二.代码 1. package org.jpwh.model.simple; import javax.persistence.Column; import javax.persistence.Embeddable; import javax.validation.constraints.NotNull; /** * * Instead of <code>@Entity</code>, this component POJO is marked with <cod…
一.简介 在JPA中,默认所有属性都会persist,属性要属于以下3种情况,Hibernate在启动时会报错 1.java基本类型或包装类 2.有注解 @Embedded 3.有实现java.io.Serializable 二.Overriding basic property defaults 1.@javax.persistence.Transient 如果不想属性被持久化,则注解 @javax.persistence.Transient 2.@Basic(optional = false…
一.自定义映射的表名 1. @Entity @Table(name = "USERS") public class User implements Serializable { // ... } 2.用定界符 //@Table(name = "`USER`")的标准 @Table(name = "`USER`") //JPA的标准 @Table(name = "\"USER\"") 若全部SQL都加定界符,…
一.简介 1.You now have three methods for distinguishing references:  Objects are identical if they occupy the same memory location in the JVM . This can be checked with the a == b operator. This concept is known as object identity. Objects are equal i…