聚合文章列表
4 浏览

没有神话,剖析decimal的“障眼法”

0x00前言在上一篇文章《妥协与取舍,解构C#中的小数运算》的留言区域有很多朋友都不约而同的说道了C#中的decimal类型。事实上之前的那篇文章的立意主要在于聊聊使用二进制的计算机是如何处理小数的,无非我接触最多的是在托管环境下运行的高级语言C#,因此顺带使用了C#作为例子。一方面说明了计算机处理小数的本质,也起到了提醒各位更加关注本质而非高级语言表象的作用。当然,那篇文章中主要提到的是二进制浮点数double和float(即System.Double和System.Single,下文中使用double和float来分别指代这两个类型)。不过既然说到障眼法,我觉得还是有必要写一篇文章专门来聊聊decimal类型,也算是对留言提到decimal的朋友的统一回复。0x01先从0.1和二进制浮点数说起私底下有一些朋友告诉我说在上一篇文章中如果只是单纯的说十进制中的0.1无法使用二进制准确的表示,虽然理论上的确是这样,但毕竟没有通过直接观察获得一个直观的印象,所以在正式引出decimal之前,我们先来看一看一个十进制的小数0.1为何不能被二进

c# 2015-12-08 发布
2 浏览

庖丁解牛迭代器,聊聊那些藏在幕后的秘密

0x00前言在我之前的一篇博客《细说C#:不是“栈类型”的值类型,从生命周期聊存储位置》的最后,我以总结和后记的方式涉及到一部分迭代器的知识。但是觉得还是不够过瘾,很多需要说清楚的内容还是含糊不清,所以本文就专门写一下c#中的迭代器吧。0x01你好,迭代器首先思考一下,在什么情景下我们需要使用到迭代器?假设我们有一个数据容器(可能是Array,List,Tree等等),对我们这些使用者来说,我们显然希望这个数据容器能提供一种无需了解它的内部实现就可以获取其元素的方法,无论它是Array还是List或者别的什么,我们希望可以通过相同的方法达到我们的目的。此时,迭代器模式(iteratorpattern)便应运而生,它通过持有迭代状态,追踪当前元素并且识别下一个需要被迭代的元素,从而可以让使用者透过特定的界面巡访容器中的每一个元素而不用了解底层的实现。那么,在c#中,迭代器到底是以一个怎样的面目出现的呢?如我们所知,它们被封装在IEnumerable和IEnumerator这两个接口中(当然,还有它们的泛型形式,要注意的是泛型形式

c# 2015-12-10 发布
18 浏览

[C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例

本文我们来学习一下在EntityFramework中使用Context删除多对多关系的实体是如何来实现的。我们将以一个具体的控制台小实例来了解和学习整个实现EntityFramework多对多关系的实体删除的操作过程。你将学习到怎样创建一个引用EntityFramework的项目;怎样配置EntityFramework的数据库连接;怎样去掉EntityFrameworkCodeFirst生成的表名的复数;怎样通过EntityTypeConfiguartion<T>配置实体的FluentAPI;怎样配置EntityFramework的实体多对多的关系映射;EntityFramework数据初始化;怎样使用包管理工具控制台来生成和更新数据库;怎么删除EntityFramework中的多对多关系的数据。本示例开发环境操作系统:Windows10开发工具及版本:VisualStudio2015Update1.NETFramework版本:.NETFramework4.

c# 2015-12-16 发布
AD 友情赞助
4 浏览

庖丁解牛聊委托,那些编译器藏的和U3D给的(上)

0x01从观察者模式说起在设计模式中,有一种我们常常会用到的设计模式——观察者模式。那么这种设计模式和我们的主题“如何在Unity3D中使用委托”有什么关系呢?别急,先让我们来聊一聊什么是观察者模式。首先让我们来看看报纸和杂志的订阅是怎么一回事:报社的任务便是出版报纸。向某家报社订阅他们的报纸,只要他们有新的报纸出版便会向你发放。也就是说,只要你是他们的订阅客户,便可以一直收到新的报纸。如果不再需要这份报纸,则可以取消订阅。取消之后,报社便不会再送新的报纸过来。报社和订阅者是两个不同的主体,只要报社还一直存在着,不同的订阅者便可以来订阅或取消订阅。如果各位读者能看明白我上面所说的报纸和杂志是如何订阅的,那么各位也就了解了观察者模式到底是怎么一回事。除了名称不大一样,在观察者模式中,报社或者说出版者被称为“主题”(Subject),而订阅者则被称为“观察者”(Observer)。将上面的报社和订阅者的关系移植到观察者模式中,就变成了如下这样:主题(Subject)对象管理某些数据,当主题内的数据改变时,便会通知已经订阅(注册)的

c# 2015-12-17 发布
1 浏览

庖丁解牛聊委托,那些编译器藏的和U3D给的(下)

接上文:《庖丁解牛聊委托,那些编译器藏的和U3D给的(上)》0x04委托是如何实现的让我们重新定义一个委托并创建它的实例,之后再为该实例绑定一个方法并调用它:internaldelegatevoidMyDelegate(intnumber);MyDelegatemyDelegate=newMyDelegate(myMethod1);myDelegate=myMethod2;myDelegate(10);从表面看,委托似乎十分简单,让我们拆分一下这段代码:用C#中的delegate关键字定义了一个委托类型MyDelegate;使用new操作符来构造一个MyDelegate委托的实例myDelegate,通过构造函数创建的委托实例myDelegate此时所引用的方法是myMethod1,之后我们通过方法组转换为myDelegate绑定另一个对应的方法myMethod2;最后,用调用方法的语法来调用回调函数。看上去一切都十分简单,但实际情况是这样吗?事实上编译器和Mono运行时在幕后做了大量的工作来隐藏委托

c# 2015-12-18 发布
3 浏览

JS or C#?不存在的脚本之争

前言又来到了周末,小匹夫也终于有了喘口气写写博客的时间和精力。话说周五的下午,小匹夫偶然间晃了一眼游戏蛮牛Unity3D的QQ群,又看到了一个Unity3D开发中老生长谈的问题,“我的开发语言究竟是选择JavaScript呢?还是C#呢?”。对这个问题,小匹夫也觉得的确该认真的梳理一下了。那么为何说JavaScript和C#的争论根本就不存在呢?首先,我们要知道Unity3D中的Js脚本究竟是什么?最准确的学名,我想应该叫做UnityScript(因为Unity-Technologies在github上托管的代码就叫这个名字。。。)。那为何UnityScript不是JavaScript呢?我们就继续分析一下UnityScriptvsJavaScript好了。既然小匹夫说UnityScript不是JavaScript,但Unity3D的确有好几种脚本语言啊(C#,UnityScript,Boo),那和C#相比,我们应该如何抉择呢?所以最后小匹夫会分析一下C#vsUnityScript。最熟悉的陌生人-UnityScript小匹

c# 2015-12-21 发布
AD 友情赞助
3 浏览

Windows应用程序快捷方式创建工具

说明在windows中经常用到将程序添加到桌面或者是开始菜单,乘着休息时间就做了这么一个快捷的工具。程序展示:Lastedversion:v1.0Download用法1.命令行(CMD命令窗口)命令:C:\Users\Administrator>[WinCShortcut程序根目录]\WinCShortcut.exe目标程序路径示例:WinCShortcut程序放在桌面,app.exe放在F盘根目录下,C:\Users\Administrator>WinCShortcut.exe"F:\app.exe"2.程序第一,双击程序;第二,选择或者是拖拽目标程序文件;接着,填写相关信息;最后,点击创建按钮。3.发送到命令第一,双击程序;第二,点击“添加到鼠标右键发送到命令”按钮;接着,右键目标程序,选择“发送到->快捷方式创建工具”;接着,填写相关信息;最后,点击创建按钮。项目源码Github:https://github.com/SeayXu/WinCSho

c# 2015-12-31 发布
5 浏览

C#指针问题

花了很长时间的实践,终于搞清楚了。类或者链表等,在指针赋值的时候,会使用新的指针。比如:Fooa=c;Foob=newFoo();Fooa=b;这种情况下,会把b的指针传给a,a不再指向c,a以后的操作都会对b生效。如下情况下:Foob=newFoo();Fooa{get{returnb;}}这种情况下,表示a无法被修改,但是如果你a.bar=5;的话,那么是可以修改的,为什么呢?因为此时任何针对a的属性的修改,本质上都是对b的修改,只有a=c;是不可以的。可以简单理解为a=c;是指针的赋值,而a.bar=5;只是所指对象的属性发生改变。综上所述:如果你希望a是一个仅指向b的替身,那么就可以后后面这个方法了。好处就是,可以随意修改a的属性,也就是b的属性,但是a永远会指向b,不会被篡改。如果希望多次使用a,那么只能用第一种方法。但是如果搞不清楚用错的话,会经常不小心修改到原始值。

c# 2016-01-21 发布
15 浏览

在Unity中实现一个简单的消息管理器

一直偷懒没有开发这个东西,最近要做新手引导系统,必须大范围的解耦,所以不得不用消息系统来管理了。上网查了几篇文章,发现一点也不难,但是可能有的教程比较老,或者格式比较乱,所以我重新来写一个我自己的实现吧,抛砖引玉。功能介绍这个管理器,包含几个部分:事件类型的枚举事件列表监听器的添加和删除事件发送原理简述我假定读者尚不清楚事件管理器的概念。每当一个消息被触发的时候,在触发位置调用一下事件发送的函数。然后这个函数,会去事件列表中定位该事件,找出它对应的回调函数队列,逐个执行。如果没有回调函数,那么这个消息什么也不做。如果某个类需要监听某个事件,就将回调函数注册进去,如果不需要了,就从队列中删除。关于delegate这方面网上文章很多,就不详细介绍了,只说下基本思路。Delegate用来定义一种通用的函数类型,将函数作为参数传递,比如publicdelegatevoidFunc();这里我定义了一个函数形式命名为Func,符合这个结构的,都可以当做这个delegate使用。需要传入函数作为参数的时候,这样用:voidA

c# 2016-01-21 发布
AD 友情赞助
3 浏览

为Unity组件编写扩展

最近遇到一个需求,需要快速获取一个GameObject在Hierarchy面板中的路径。在谷歌上左搜右搜,就是找不到,使用的关键词是Hierarchy、GameObject、Path、Relationship等。后来想起来,前几天在宣雨松的微博上看到一个小Tip,附上链接,再次感谢雨松大大。这几行代码,写到一个Editor文件中,就可以在鼠标选中某个游戏对象时,打印出它的路径,Letmeshowyouthecode!usingUnityEngine;usingUnityEditor;usingSystem.Collections;publicclassToolKit:EditorWindow{//Usethisforinitialization[InitializeOnLoadMethod]staticvoidStart(){Selection.selectionChanged=delegate{Debug.Lo

c# 2016-01-25 发布
3 浏览

Building a LINQ Provider

https://msdn.microsoft.com/zh-CN/vstudio/ee672195.aspx

c# 2016-01-29 发布
2 浏览

微信web协议分析和实现微信机器人

微信web协议分析和实现微信机器人(微信网页版wx2.qq.com)1.打开首页,分配一个随机uuid,2.根据该uuid获取二维码图片。3.微信客户端扫描该图片,在客户端确认登录。4.浏览器不停的调用一个接口,如果返回登录成功,则调用登录接口5.此时可以获取联系人列表,可以发送消息。然后不断调用同步接口。6.如果同步接口有返回,则可以获取新消息,然后继续调用同步接口。源码地址:https://github.com/biezhi/wechat-robot执行流程+--------------++---------------++---------------+|||||||GetUUID||GetContact||StatusNotify||||

c# 2016-02-22 发布
AD 友情赞助
2 浏览

Async Program 基本知识 (Process、Thread、Context Switch)

处理序(Process):作为隔离应用程式的基本单位例如:开启了一个程式,载入记忆体后,运行的instantce就叫Proces。每一个Process占用memorysection。(包含程式以及相关资源)隔绝了作业系统,但是共用了CPU。执行绪(Thread):是作业系统用来虚拟化CPU的概念,切割CPU时间的基本单位一个Process有多个Thread然而现今的电脑可以同时执行的程式己经不会只有一个,而是N个。即便CPU是双核、四核、八核等等(可同时处理二个、四个、八个Thread的工作)但为了要做到很顺畅的运作,用户以为真的是同时间处理,CPU其实是会快速的来回在不同的Thread,这行为称为ContextSwitch。ContextSwitch:在各Thread之间切换,当下Thread拥有CPU处理的时间称为「quantum」其行为如下:(1)把CPU各暂存器的值,保存至目前Threadinterndatastructure。(

c# 2016-02-26 发布
4 浏览

Ubuntu (14.04)下运行 DotNet Core 步骤

Ubuntu(14.04)下运行DotNetCore步骤sudosh-c'echo"deb[arch=amd64]http://apt-mo.trafficmanager.net/repos/dotnet/trustymain">/etc/apt/sources.list.d/dotnetdev.list'sudoapt-keyadv--keyserverapt-mo.trafficmanager.net--recv-keys417A0893sudoapt-getupdatesudoapt-getinstalldotnet=1.0.0.001598-1mkdirhwappcdhwappdotnetnewdotnetrestoredotnetrun

c# 2016-03-15 发布
1 浏览

Kinect 数据录制与回放

本文最初发布于我的个人博客:咀嚼之味最近在实验室用深度相机做一些三维重建的研究,主要的实验场景在宝山区的仓库。学校到仓库的来回车程大概有三四个小时,如果每次都要到实际场景中来测试算法,这真是着实令人头疼。所以我想着,如果能用Kinect把仓库中的场景录制下来,回来直接用录好的数据来测试算法,那不就不用来回跑了吗?接下来就来讲讲如何完成这件事。首先,我的实验环境是:操作系统:Windows10IDE:VisualStudio2013community版本Kinect版本:2.0编程语言:C#录制录制数据相对来说比较简单,我们只需要借助KinectforWindowsSDK自带的KinectStudio就可以达成这一目的。你可以依照下图的三个小步骤来录制你想要的场景数据;等录制完毕以后,你可以在C:\Users\${你的用户名}\Documents\KinectStudio\Repository下找到你录制好的xef文件,比如我刚刚录制的20160317_111153_00.xef

c# 2016-03-21 发布
13 浏览

C# IEnumerable,IEnumerator接口

许久之前学习WinForm的时候开始解除的C#,之后便搁了好长时间。最近在学Unity的时候又重拾了C#。发现以前学过的东西也都忘了差不多了。特别在Unity中会经常用到yield关键字和IEnumerator接口来做一些延时循环的操作。作为重拾C#第一步,先来复习和总结一下C#中的IEnumerable和IEnumerator接口。背景在很多编程场景中,我们需要去遍历(Iterate)一个集合。为了让这个过程简化,很多高级语言都采用遍历语句来进行操作,例如for...in...或者foreach()。例如在C#中,ArrayList的实例可以在foreach()中得到遍历。当然除了语言原生的一些集合类外不是所有的类的实例都可以放在遍历语句中进行操作的。要想让一个类的实例能够在遍历语句中得到遍历,就必须按照语言的规定让类实现某些接口或者属性。原生ArrayList在我们开始正式进入正题前,我们先看一下C#原生的ArrayList是怎么样工作的。usingSystem.IO;usingSystem;usingSystem.Co

c# 2016-04-01 发布
5 浏览

批量文件重命名工具

说明最近在网上下载了一些资料,所有的文件名被加上网站相关信息,导致文件名非常长.再者,我也不喜欢这样的做法.那么,就要重新修改文件名,文件还不少,手动修改确实不便.于是就自己写了个小工具,基本满足需要了.下载github百度云功能批量替换文件名中内容按序号批量重命名源码代码托管在github上,有需要的可以自行下载查看.https://github.com/SeayXu/BFR

c# 2016-04-02 发布
4 浏览

用 CIL 写程序:你好,沃尔德

前言项目紧赶慢赶总算在最近有了一些成绩,所以沉寂了几周之后,我也终于有时间写点东西了。以前我写过一篇文章对CIL做了一个简单地介绍,不过不知道各位看官看的是否过瘾,至少我觉得很不过瘾。所以决定写几篇关于CIL的文章,即和各位看官一起进行个交流,同时也是我自己总结和巩固一下这些知识点。俗话说的好,“万事开头,HelloWorld”,那么作为我总结CIL的第一篇文章,就从HelloWorld开始吧。当然,正式开始写CIL代码之前,我们还有点闲话要说,那就是运行时的选择为何是它?为何是CIL?而CIL为何又是基于堆栈的?内存或者寄存器难道不是更理想的选择吗?为何是CIL?开始正文内容之前,我带领大家先回顾一下《Mono为何能跨平台?聊聊CIL(MSIL)》的简要内容:首先,用C#写的代码被C#的编译器编译成CIL(当然除了C#还有很多其他的语言,比如VB等等),之后再有JIT编译器在程序运行时即时编译或者AOT(或者NGEN)进行提前编译将CIL代码编译成对应平台的机器码,最后运行在平台上的便是机器码。我在那篇文章中提过,首先将各种不同的语言

c# 2016-04-04 发布
6 浏览

设计模式(Design Pattern)系列之.NET专题

最近,不是特别忙,重新翻了下设计模式,特地在此记录一下。会不定期更新本系列专题文章。设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。设计模式分为三种类型,共23种。Ⅰ.创建型模式1.1单例模式(SingletonPattern)保证一个类仅有一个实例,并提供一个访问它的全局访问点。(单例模式是最简单的设计模式之一)1.2 抽象工厂模式(AbstractFactory)提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。1.3建造者模式(BuilderPattern)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。1.4工厂模式(FactoryPattern)定义一个用于创建对象的接口,让子类决定将哪一

c# 2016-04-16 发布
3 浏览

.NET设计模式(1):1.1 单例模式(Singleton Pattern)

概述单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点。单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。意图保证一个类仅有一个实例,并提供一个该实例的全局访问点。场景Windows的TaskManager(任务管理器)就是很典型的单例模式,任何时候只能打开一个窗口。windows的RecycleBin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。网站的计数器,一般也是采用单例模式实现,否则难以同步。应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源

c# 2016-04-16 发布
AD 友情赞助