我以为,在所有模式中,最简单、最常用的就是工厂模式了(包括抽象工厂)。
工厂模式和抽象模式的区别在于,工厂模式是通过参数(一般叫型别码)来动态生成对象,而抽象工厂必须了解上下文才能调用相应的对象。实例代码如下:
一、工厂模式
public class Factory
{
public static object Create(int type)
{
//根据type生成对象
}
}
二、抽象工厂
public interface IFactory
{
object Create();
}
public class FactoryA : IFactory
{
public object Create()
{
//生成A工厂的对象
}
}
public class FactoryB : IFactory
{
public object Create()
{
//生成B工厂的对象
}
} ......
通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务。这样是使工作简单了,但是却和提供Web服务的URL、方法名、参数绑定在一起了,这是VS.NET自动为我们生成Web服务代理的限制。如果哪一天发布Web服务的URL改变了,则我们需要重新让VS.NET生成代理,并重新编译。在某些情况下,这可能是不能忍受的,我们需要动态调用WebService的能力。比如我们可以把Web服务的URL保存在配置文件中,这样,当服务URL改变时,只需要修改配置文件就可以了。
说了这么多,实际上我们要实现这样的功能:
public static object InvokeWebService(string url, string methodname, object[] args)
其中,url是Web服务的地址,methodname是要调用服务方法名,args是要调用Web服务所需的参数,返回值就是web服务返回的结果了。
要实现这样的功能,你需要这几个方面的技能:反射、CodeDom、编程使用C#编译器、WebService。在了解这些知识后,就可以容易的实现web服务的动态调用了:
  ......
//TransmitFile实现下载
protected void Button1_Click(object sender, EventArgs e)
{
/*
微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite
下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。
代码如下:
*/
Response.ContentType = "application/x-zip-compressed";
Response.AddHeader("Content-Disposition", "attachment;filename=z.zip");
string filename = Server.MapPath("DownLoad/z.zip");
Response.TransmitFile(filename);
}
&nb ......
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace PortScanner
{
class Program
{
//已扫描端口数目
internal static int scannedCount = 0;
//正在运行的线程数目
internal static int runningThreadCount = 0;
//打开的端口数目
internal static List<int> openedPorts = new List<int>();
//起始扫描端口
static int startPort = 1;
//结束端口号
static int endPort = 500;
//最大工作线程数
static int maxThread = 10;
static void Main(string[] args)
{
//接收传入参数一作为要扫描的主机
string host = "192.168.0.1";
//接收传入参数二作为端口扫描范围,如1-4000
string portRange = "1-400";
startPort = int.Parse(portRange.Split('-')[0].Trim());
endPort = int.Parse(portRange.Split('-')[1].Trim());
for (int port = startPort; port < endPort; port++)
{
//创建扫描类
Scanner scanner = ne ......
转义序列 字符名称 Unicode 编码
\' 单引号 0x0027
\" 双引号 0x0022
\\ 反斜杠 0x005C
\0 Null 0x0000
\a 警报 0x0007
\b 4. BackspaceBackspace 0x0008
\f 换页符 0x000C
\n   ......
引用地址:http://www.cnblogs.com/heyaowen163/articles/1177909.html
C#关键字的用法不单只有一种方法的。现在我总结了一下Using和New的用法,顺便巩固下自己的知识。
Using
(1)引用命名空间
using作为引入命名空间指令的用法规则为:
using Namespace;
在.NET程序中,最常见的代码莫过于在程序文件的开头引入System命名空间,其原因在于System命名空间中封装了很多最基本最常用的操作,下面的代码对我们来说最为熟悉不过:
using System;
这样,我们在程序中就可以直接使用命名空间中的类型,而不必指定详细的类型名称。using指令可以访问嵌套命名空间。
关于:命名空间
命名空间是.NET程序在逻辑上的组织结构,而并非实际的物理结构,是一种避免类名冲突的方法,用于将不同的数据类型组合划分的方式。例如,在.NET中很多的基本类型都位于System命名空间,数据操作类型位于System.Data命名空间,
(2)创建命名空间别名
using为命名空间创建别名的用法规则为:
using alias = names ......