由装饰模式巩固继承

最近学习《大话设计模式》,在学习的过程中又加深了对OO的理解,诸如abstract和virtual的区别之类的问题有了清晰的认识。今天通过装饰模式,重温OO的继承,巩固子类于父类的构造函数调用,子类调用父类方法等问题。

先看一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Person
{
public Person()
{
Console.WriteLine("Person“);
}
}
class Man : Person
{
public Man()
{
Console.WriteLine("Man");
}

}

然后我们在主函数中实例化子类Man

1
Man jack = new Man();
阅读更多

程序集

Assembly即程序集是一个由类型定义、数据文件和资源文件组成的逻辑集合。每个程序集都包含一个程序集清单,该清单通常被附加在某个头文件上,也可以设置单独建立一个文件来包含该清单。

在编译程序集中间代码之前,CLR需要找到合适的程序集中间代码,其加载机制分为主动加载方式与通过名称、版本、文化和公钥来加载程序集。

1. 程序集的主动加载方式:

程序集的加载可以完全忽略任何策略,由程序员在程序中显式的通过位置加载。System.Reflection.Assembly.LoadFrom提供了这个功能。此方法通过接收一个codebase风格的字符串,用以确定所要加载程序集的位置:

1
2
3
4
5
String codebase = @"../../../example/Compile/Compile.dll";

Assembly mycompile = Assembly.LoadForm(codebase);

Object compile = mycompile.CreateInstance("***.Compile");
阅读更多

CTS、CLI、CLS和CLR

CTS、CLS和CLR是.Net框架的基本概念,但往往成为程序员忽视的部分。

CLR即Common Language Runtime, 可以把CLR理解为一个包含运行.Net程序的引擎和一些符合公共语言基础结构的类库的集合。它是一个规范的CLI实现。所谓的.Net框架一般就是指公共语言运行库。

CLI公共语言基础,是微软向ECMA提交的一份语言和数据格式规范(包括了CTS,中间语言CIL、底部文件格式和元数据格式等),它是目前为止,唯一一个公共语言基础的实现版本。

CTS的全称为Common Type System 通用类型系统。定义了一个能够在CLR上运行的语言规范,需要注意的是,尽管很多语言本省不符合CTS规范,但通过加强编译器,改变语言附加规范等手段,使得许多语言能够编写出在CLR上运行的程序,比如C++

CLS公共语言规范是CTS的一个子集,它定义了希望编写在.Net平台上运行的程序的语言所需符合的最小的规范。因为.Net允许由不同语言编写的程序一起运行,所以制定出CLS规范。

阅读更多

Eclipse整合GlassFish编写JSP

学校开了J2EE的选修,老师讲课的起点有点高,对于我们没有什么web认识的学生来说,一开始就讲jsp,实在是听的人雨里雾里。琢磨了一下午的tomcat,还是不能正常启动。没办法,尝试了一下glassfish。

先是在oracle的网站down了最新的java ee sdk,里面就带了glassfish,安装的时候做了一些基本的配置。启动startserv后打开 127.0.0.1:8080,显示如下,证明服务已启动。不过手动启动觉得有点麻烦,eclipse能整合到glassfish就方便多了,于是查找了一些方法。

我使用的eclipse是Eclipse IDE for Java EE Developers,下载地址:http://www.eclipse.org/downloads/

打开eclipse—windows—preferences—server—-runtime environments,然后点add,出现以下界面

阅读更多

WPF中UI及时更新

不管是在winform还是在WPF中,我们要做一个进度条,用在一个大循环或者一个耗时的处理中,首先想到的就是多线程。否则进度条会出现假死现象,进度条不会更新。做多线程是比较麻烦的,如果只是简单的更新UI,可以用Systems.DoEvents。

在winform中,使用PeekMessage处理完消息队列,使UI有机会更新。在WPF中,可以在Dispatch里使用PushFrame达到同样的效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void DoEvents()
{

DispatcherFrame frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
new DispatcherOperationCallback(delegate(object f)
{


((DispatcherFrame)f).Continue = false;

return null;
}
), frame);
Dispatcher.PushFrame(frame);
}

写了这个方法后,我们在循环中或者事件中,在需要更新的UI后面调用一下DoEvents()就可以了。

C#进程控制示例-sqlserver的停止与启动

当我们在对sql server进行复制,重命名,移动,删除操作时,由于系统将sql服务开启,所以无法直接进行操作,需要将服务停止,操作完成之后再重新开启。停止与开启的方法可以利用SQL Server Management Studio,还可以在cmd下使用net start/stop mssqlserver。在C#程序中,为了方便对sql服务的开关,可以用以下两种方法:

方法一:利用C#执行cmd语句net start/stop mssqlserver。此方法就不详细叙述了。

方法二:利用进程控制。

先添加引用

阅读更多

你必须知道的C#的25个基础概念

原作者:reonlyrun

1.静态变量和非静态变量的区别?

静态变量: 静态变量使用 static 修饰符进行声明 在所属类被装载时创建 通过类进行访问 所属类的所有实例的同一静态变量都是同一个值 非静态变量: 不带有 static 修饰符声明的变量称做非静态变量 在类被实例化时创建 通过对象进行访问 同一个类的不同实例的同一非静态变量可以是不同的值

2.const 和 static readonly 区别?

const 用 const 修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序 static readonly 用 static readonly 修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法:通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行期初始化

阅读更多

WPF的bmp和二进制转换

bmp转二进制:

1
2
3
FileStream fs = File.OpenRead(filepath); //filepath文件路径
Byte[] tempBuff = new Byte[fs.Length];
fs.Read(tempBuff, 0, tempBuff.Length);

二进制还原bmp:

1
2
3
4
5
BitmapImage BI = new BitmapImage();
BI.BeginInit();
BI.StreamSource = new MemoryStream(bufPic); //bufPic是图片二进制,byte类型
BI.EndInit();
image_emp.Source = BI;//image_emp是图片控件

BMP格式分析

C#下将BMP转换成二进制是比较容易的,方法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
byte[] bufPic;
string filePath = "";
Stream myStream;
MemoryStream picFile = new MemoryStream();
OpenFileDialog open = new OpenFileDialog();
open.Filter = "bmp files (*.bmp) | *.bmp";
open.RestoreDirectory = true;
if (open.ShowDialog() == DialogResult.OK)
{
if ((myStream = login.OpenFile()) != null)
{
myStream.Close();
}
}

filePath = open.FileName.ToString();
Image image = Image.FromFile(filePath);
image.Save(picFile, ImageFormat.Bmp);
bufPic = picFile.GetBuffer();

其实转换的结果是以8位二进制分割的十进制数(0~255),若是真要得到纯二进制,还需要进一步转换。我曾做过很多实验,目的是测试这些数字和图片本身之间的关系,虽然学习过多媒体技术,但是对于详细的bmp分解,并没有太多认识。当然,在实验前还要把”二进制”还原bmp的方法说明一下:

1
2
3
4
5
6
7
8
using (MemoryStream ms = new MemoryStream(myPic))
{
Image image1 = Image.FromStream(ms);
ms.Close();
pic.Image = image1;
}

//其中mypic是byte类型,存放"二进制"的数组,pic是PictureBox控件

实验1: 人为的变动bufPic数组中的前几个位置,得到的结果都是出错,没能正确的还原回bmp,仔细观察后在发现,几乎所有的bmp转换成的bufPIc的前几个位置都相同,所以得到一个猜测:bmp文件不是单一的由图片的像素组成,还有一些默认的统一的”约定”

阅读更多

玩转IPv6

前段时间小结了一下 IPv6的相关设置和用途,比如免费上网,下载IPv6资源等。经过近一年的使用,对于IPv6有了更进一步的认识,恰逢csdn学习心得活动,所以特意整理一番,针对使用IPv6做一个全面的介绍。不足之处还请大家提出宝贵意见。

一、引导篇

1. 什么是IPv6

互联网协议版本6(IPv6)是被指定为IPv4继任者的下一代互联网协议版本,互联网中最先出现的应用到现在依然占有优势。这是个用于分组交换互联网络的网络层协议。驱使重新设计互联网协议的主要原因是,IPv4地址在可预见的未来中即将被耗尽。IPv6在1998年12月被互联网工程任务小组(Internet Engineering Task Force,简称IETF)通过公布互联网标准规范(RFC 2460)的方式定义出台。

IPv6具有比IPv4大得多的地址空间。这是因为IPv6使用了128比特的地址,而IPv4只用32比特。因此新增的地址空间支持2128(约3.4 ×1038)个地址。这一扩展提供了灵活的地址分配以及路由转发,并消除了对网络地址转换(NAT)的依赖。NAT是获得了广泛部署的减缓IPv4地址耗尽的最有效的方式。

阅读更多