上篇中说到了面临的问题(传送门:DDD设计中的Unitwork与DomainEvent如何相容?),和当时实现的一个解决方案。在实际使用了几天后,有了新的思路,和@trunks 兄提出的观点类似。 2.其中橙色标识出来的代码的副作用很大,导致所有调用此方法发布的领域事件都得通过一致性队列进行批量发布。 有了这个可以做2件事: ①根据当前是否处于工作单元的环境中来处理领域事件的发布方式。这样可以隐藏起直接发布还是通过DomainEventConsistentQueue来发布的逻辑。 private static void RollBackEventHandle() { _unitWork.Value = null; } } 2. isSuccess) DomainEventConsistentQueue.Current().PublishEvents(); } 这里有一点要说明一下,因为这里的2个注册
四、说干就干 实现类: 1 public class DomainEventConsistentQueue : IDisposable 2 { 3 private Clear(); 52 } 53 } 使用方式: 1 var aggregateA = new AggregateRootA(); 2 像这2行表达起来如“AggregateRootA Event DomainEventConsistentQueue”这个 DomainEventConsistentQueue其实并不是领域对象,所以其并不是领域的一部分 六、说改就改 实现类: 1 public class DomainEventConsistentQueue : IDisposable 2 { 3 private static Clear(); 74 } 75 } 使用方式: 1 var aggregateA = new AggregateRootA(); 2
创建数组创建数组时,必须确定数组长度和类型。但如果储存的是基本类型,允许不赋初值(使用默认值)。 arr[] = new Integer[]{1, 2, 3, 4}; // 数组必须是包装数据类型List list = Arrays.asList(arr); ,按指定类型编码Copy to clipboardErrorCopiedString 对象创建后一经赋值不再改变。 去除字符串左右空格 String str2 = str.substring(0,3); // 截取指定位置(0-2)的子字符串String str2 = str.replace("a (); // data 必须为包装数据类型String s2 = Integer.toString(data); // data 可以为基础数据类型,包括字符数组
ToString: 默认情况下返回类型的完全限定名。 一般自定义类型中要重写该方法,返回有意义的字符串; GetType: 返回一个类型为继承自Type的对象实例,返回的Type对象和反射类一起来获得元数据信息,本方法是一个非虚方法,防止一个类通过重写隐瞒真实类型 ,从而破坏类型安全。 两个受保护方法: MemberwiseClone:非虚方法,它创建一个新的类型实例【浅拷贝(共享引用成员)】; Finalize:虚方法,执行垃圾回收之前会调用该方法; 引用类型new的过程: 从托管堆中分配指定类型所需数量的字节来作为其存储对象的内存空间 2.类型转换 强制类型转换,需要程序员自己负责,如果转换不成功抛出Sysem.InvalidCastException【无效的转换】异常; 隐式类型转换,C#不需要特殊的语法就可以将对象转换为其任何一个基类型
在python3中有6中标准的数据类型: Number(数字) String(字符串) List(列表) Tuple(元组) Sets(集合) Dictionary(字典) Number 整型 int 在python3中, 整型没限制大小, 可以当做long类型使用. 所以python3中没有python2的long类型 >>>type(1) <class 'int'> 浮点型 float 浮点型由整数部分与小数部分组成. >>>type(1+2j) <class 'complex'> 字典 字典格式 d={key1:value1,key2:value2} 字典由多个键值对组成,其中键必须是唯一的,且必须是不可变类型的 ,如字符串、数字或元组;而值可以取任何数据类型。
编译器根据=右边的语句推断出变量实际的类型。 所以使用var的要求就是右边的语句必须可以让编译器推断出实际的类型。所以=号右边是必须要有值的,即是必须要初始化,不能只是声明。 于此同时,C#3.0的出现另一个新特性[匿名类型]给了var用武之地。 var并不是表示弱类型了,如下IL代码: 1 .method private hidebysig static void Main() cil managed 2 { 3 .entrypoint 4E 1E 82 25 66 CB 79 ) 13 IL_0008: stloc.1 14 IL_0009: ldc.r8 9.25 15 IL_0012: stloc.2 2.总结 var为编译器技巧,语法糖。匿名类型须此关键字搭配使用
上一遍留下来一个题目:1.ToString() 有没有装箱,答案是没有 从以下几点来解释: 首先确认什么是值类型和引用类型:所有书和你说 值类型:放置在栈上 引用类型:放置在堆上 但是想下 List<int 如果遇到对象类型,则先在堆上分配内存,将引用加载到栈上操作,用完还在堆上,等GC回收 2. 1 其他2个开销才是最大的开销,而不是 栈 和 堆 上速度不同导致的 结果 PS: 针对类型对象信息 和 同步块索引 也有优化 1. 同步块索引已经优化到 只有在使用的时候 (如lock)才去创造,而不是每次都去 2. 类型对象信息 只要加载就不会GC,全局持有 总结下来就是: 1. 如果是基本类型在使用的时候栈上直接分配,引用类型在堆上分配 2. 如果List 在堆上使用基本类型 只需要分配地址即可,但是引用类型不仅需要分配地址,还得分配同步块索引,类型对象信息。
题目分析: 题目地址:8-medium-readonly-2 如上图所示,这道题目涉及的内容较多,难度对于刚学类型编程不就的伙伴来说挺难的,我们先参考社区的答案来解析,后续巩固。 Expect<Alike<MyReadonly2<Todo2, 'title' | 'description'>, Expected>>, ] interface Todo1 { title: string 再借用内置的Readonly工具将这个对象类型直接处理。 那么为指定到K的属性不就丢了吗?我们可以使用Omit来排除掉已传入K的两个后得到剩余的一个K。 在通过&将两个对象类型链接起来得到一个完整的满足2,3用例的答案。 右边的说完了,再看下左边,我们通常的K就直接通过extends keyof T来约束必须在T中存在了。 ; Readonly<Pick<T, K>>; 接下来的一题是:【类型挑战】深度 Readonly,难度⭐️⭐️
>>> st=[1,2,'dflx']; >>> len(st); 3 >>> df=[6,8,"great"]; >>> st+df [1, 2, 'dflx', 6, 8, 'great'] >>> df*2; [6, 8, 'great', 6, 8, 'great'] >>> 6 in df; True >>> 2 in df False >>> num=[1,2,99,-8]; >>> max L.count(value) -> integer -- return number of occurrences of value >>> num=[1,6,3,8,5,6,2,1,3,5,1,1,2 >>> ch.sort(); >>> ch; ['a', 'b', 'c'] 列表和字符串二中类型的对象有许多相似之处,但是也有很大区别。 相同点二者都属于序列类型,不管组成列表的元素,还是组成字符串的元素都可以从左到右,依次建立索引访问。
一.装箱和拆箱 将值类型转换为引用类型的过程称为装箱,反之称为拆箱 实际开发尽量避免 装/拆 箱 原因: 装/拆 箱都会降低程序性能 示例代码: static } 二.不同类型的参数传递 1.值方式参数传递 1)使用值类型作为参数 以值类型作为参数进行值方式传递参数时,不能改变值类型参数的值 int num1 = temp = num1; num1 = num2; num2 = temp; } 2)使用引用类型作为参数 引用方式参数传递(ref) 1.使用引用类型作为参数 以值类型作为参数进行引用方式传递参数时,能改变值类型参数的值 int num1 = 3; int num2 ; num1 = num2; num2 = temp; } 2.使用引用类型作为参数 以值引用型作为参数进行引用方式传递参数时
name = 'derek' print(name.capitalize()) #首字母大写 Derek print(name.count("e")) #统计字符串出现某个字符的个数 2 k')) #判断字符串是否以"k"结尾 True print('244'.isdigit()) #判断字符是否为整数 True print('+'.join(['1','2' ,'3'])) #把join后的内容加入到前面字符串中,以+为分割符 1+2+3 print('\n123'.strip()) #strip去掉换行符 print("1+2+3+4" fruit.items(): print(k,v) 1 apple 2 orange 3 grape for k in fruit.keys(): print(k) 1 2 3 (num2)) #{11, 22} # 交集 print(num1.intersection(num2)) #{33, 44}
BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StandardError | +-- BufferError | +-- ArithmeticError | | +-- FloatingPointError | | +-- Over
Java笔记2-变量类型 前言 在Java语言中,所有的变量在使用前必须声明,Java语言支持的变量类型有:类变量,实例变量,局部变量,下面列出了一些变量的声明实例。 Java语言支持的变量类型 类变量:独立于方法之外的变量,用 static 修饰。 实例变量:独立于方法之外的变量,不过没有 static 修饰。 局部变量:类的方法中的变量。 但为了对类的使用者可见,大多数静态变量声明为 public 类型。 默认值和实例变量相似。数值型变量默认值是 0,布尔型默认值是 false,引用类型默认值是 null。 类变量被声明为 public static final 类型时,类变量名称一般建议使用大写字母。如果静态变量不是 public 和 final 类型,其命名方式与实例变量以及局部变量的命名方式一致。 String[] args){ Test test = new Test(); test.pupAge(); } } 以上实例编译运行结果如下: 小狗的年龄是: 7 实例 2
通讯录中可以存放100个人的信息 增加联系人 删除指定联系人 修改指定联系人 查找指定联系人 显示所有联系人的信息 排序功能 首先,我们需要三个文件: test.c - 测试通讯录 contact.h - 函数和类型的声明 contact.c - 函数的实现 设计保存人的信息的这个结构体: //contact.h //类型的声明 typedef struct PeoInfo { char name[20]; int break; } } while (input); } int main() { test(); return 0; } 我们要实现通讯录的各项功能,首先要有通讯录:一个 PeoInfo 类型的数组 void* p2) { return ((PeoInfo*)p1)->age - ((PeoInfo*)p2)->age; } void SortContact(Contact* pc) { assert void* p2) { return ((PeoInfo*)p1)->age - ((PeoInfo*)p2)->age; } void SortContact(Contact* pc) { assert
上一节的内容在这里1 python基础知识 1 python数据类型思维导图2 数字类型2.1 数字类型2.2 支持的运算类型以及优先级3 字符串3.1 字符类型3.2 字符串表示方式3.3 字符串的系列操作 4 总结 1 python数据类型思维导图 2 数字类型 2.1 数字类型 python3中支持四种类型的数字,分别为int(整数类型),float(浮点类型),bool(布尔类型),complex(复数类型 那么我们怎么知道数的类型是什么呢,我们可以使用type()函数查看数字的类型。 str1=“abc” str2="edf" str=str1+str2 print(str)#abcedf 求字符串的长度 我们来求下上面str的长度。 >>>str6="i am a student" >>> print(str6.count('t')) 2 >>> print(str6.find('t')) 8 字符串大小写转换 >>> str7="
org.springframework.beans.BeanUtils; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * List类型转换工具类 log.error("【数据转换出错】", target.getName(), e); return null; } } //List类型转换 Exception e) { log.error("【数据转换出错】", target.getName(), e); return null; } } //Set类型转换
2.数据类型与变量 2.字面常量 在HelloWorld程序中, System.out.println("HelloWorld"); 上述语句,不论程序何时运行,输出的都是HelloWorld,其实"HelloWorld 2.数据类型 Java的数据类型主要分为两类:基本数据类型和引用数据类型 基本数据类型有四类八种: 四类:整型,浮点型,字符型和布尔类型 八种: 注意: 1.不论是在16位系统还是32位系统,int都占用 4个字节,long都占八个字节 2.整型和浮点型都有正负 3.整型默认为int型,浮点型默认为double 4.字符串属于引用类型。 5.如何求数据类型的范围:-2^(n - 1) ~ 2^(n - 1) - 1,其中n为数据对应的比特位(bit)数,1个字节占八个比特位 什么是字节? 字节是计算机中表示空间大小的基本单位。 编译失败,类型不兼容 flag = a;//编译失败,类型不兼容 注意事项: 1.不同数据类型的变量之间赋值,表示范围更小的类型能隐式转换成范围较大的类型 2.如果需要把范围大的类型赋值给范围小的,需要强制类型转换
work(Week.SUN); System.out.println("*****************************"); System.out.println("得到Week枚举类型中每个常量的常量值 ***********Hongten************************* 运行效果: Have a Rest ***************************** 得到Week枚举类型中每个常量的常量值 0 1 2 3 4 5 6 ***************************** 大家辛苦了,请努力工作!
使用补Meta类来给模型赋予属性,Meta类下有很多内建的类属性,可对模型类做一些控制
: number[] = [1, 2, 3]; // 数组 let list: Array<number> = [1, 2, 3]; // 数组 let x: [string, number // 空类型 function neverReturn(): never {throw 'error';} // 绝不存在的类型 需要注意几点: Array类型有2种声明格式(elemType []和 JavaScript为 var Color; (function (Color) { Color[Color["Red"] = 1] = "Red"; Color[Color["Green"] = 2] = "Green"; Color[Color["Blue"] = 3] = "Blue"; })(Color || (Color = {})); // 得到 // {1: "Red", 2: " Green", 3: "Blue", Red: 1, Green: 2, Blue: 3} 因此,一个有意思的技巧是根据枚举值访问key: let colorName: string = Color[2