1.C#中调用C++函数的注意事项
第一步:定义DLL
[DllImport("JZTDevDll.dll", EntryPoint = "FPITemplate")]
public static extern int FPITemplate(int nPort,ref byte _psMB,ref int lpLength);
第二步:调用
byte[] _psMB = new byte[513];
int _lpLength = _psMB.Length - 1;
int i = FPITemplate(FPIDevDetect(),ref _psMB[0],ref _lpLength);
2.领域对象设计(参考CSDN)
又称,概念模型、领域对象模型、分析对象模型。
领域模型是对领域内的概念类或实现世界中对象的可视化表示。
其专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。
什么是领域模型?
其业务一般包括三个部分:
(1)、操作者(角色)
(2)、系统为操作者提供的行为
(3)、操作对象
其中的操作对象就是领域模型的来源。在进行需求分析时,领域模型来自于业务描述中的名词以及对名词的抽象。
当然描述业务的名词不都是模型,有可能是模型的一个属性,也可能是角色、或者是和业务无关紧要的描述。在业务描述中有些关联名词描述的则是模型之间的关系。
一个描述业务的名词成为领域模型,至少必背两点:
要么是业务中确实存在实体、要么是业务实体的提炼(抽象)
3.IOC
IOC, Inversion of Control 是一个重要的面向对象编程法则,用于消减计算机程序的耦合问题。
又被称为依赖注入——Dependency Injection 简称DI。
4.常量
常量分为静态常量、动态常量两种
静态常量:
静态常量是指编译器在编译时对常量进行解析,并将常量的值替换成初始化的那个值。
动态常量:
动态常量的值是在允许时才获取的,编译器编译期间将其标示为只读常量,而不用常量的值代替,这种常量不必再生命时就初始化,可以延迟到构造函数中进行初始化。
5.const和readonly的区别?
Const修饰的常量属于静态常量,必须在声明时初始化;Readonly修饰的常量为动态常量;
const修饰的常量在编译期间就被解析,即常量值被替换成初始化的值。
Const修饰的常量可以声明在类中也可以在函数体内;Readonly修饰的常量只能声明在类本身;
Const修饰的常量默认为静态的;Readonly使用静态就必须显示声明;
6.string.Empty、””、null
string.Empty不分配存储空间
“”分配一个长度为空的存储空间
string.Empty、null都表示空字符串。
例如:
string str1 = string.Empty;
string str2=null;
str1,表示一个空字符串,但在内存中有准确的指向;
string str2=null;只是定义了一个string类的引用,str2没有任何指向(因此在使用前如果不实例化的话,将报错)。
因此一般建议优先使用string.Empty。
SOA
SOA, Service Oriented Architecture,简单的被理解为,面向服务的框架。
但是,更多的被认为,一整套新的分布式软件系统构造方法和环境,其包含:运行环境、编程模型、架构风格和相关方法论等。其涵盖服务的整个生命周期:建模—开发—整合—部署—运行—管理。
简介:
是一个组件模型,其将应用程序不同的功能单元(称为服务)通过这些服务之间定义良好的接口和契约组织联系起来。接口是采用中立的方式进行定义的,其应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种系统中的服务可以使用一种统一和通用的方式进行交互。
SO (Service-Oriented Architecture),面向服务架构,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用。服务层是SOA的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性。
SOA是一种粗粒度、松耦合服务架构,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型。SOA可以看作是B/S模型、XML/Web Service技术之后的自然延伸。
SOA将能够帮助软件工程师们站在一个新的高度理解企业级架构中的各种组件的开发、部署形式,它将帮助企业系统架构者以更迅速、更可靠、更具重用性架构整个业务系统。较之以往,以SOA架构的系统能够更加从容地面对业务的急剧变化。
基本特征:
SOA的实施具有几个鲜明的基本特征。实施SOA的关键目标是实现企业IT资产的最大化作用。要实现这一目标,就要在实施SOA的过程中牢记以下特征:
可从企业外部访问
随时可用
粗粒度的服务接口分级
松散耦合
可重用的服务
服务接口设计管理
标准化的服务接口
支持各种消息模式
精确定义的服务契约
SOA服务具有平台独立的自我描述XML文档。
10.Lambda表达式
Lambda表达式是一个匿名函数,其可以包含表达式和语句,并且可以用于创建
委托或表达式目录树类型。
所有的Lambda表达式都使用Lambda 运算符=>,该运算符读为“goes to”。
该Lambda运算符的左边是输入参数(如果有),右边包含表达式或语句块。
Lambda 表达式 x => x * x 读作“x goes to x times x”。可以将此表
达式分配给委托类型,如下所示:
delegate int del(int i);
del myDelegate = x => x * x;
int j = myDelegate⑸; //j = 25
11.多线程调用带参数的方法
*****************调用一个参数的函数****************
#region 执行带一个参数的多线程
Thread mythread = new Thread(new ParameterizedThreadStart(Calculate));
mythread.IsBackground = true;
mythread.Start(500);
#endregion
//带一个参数的委托函数
private void Calculate(object Max)
{
int max = (int)Max;
Stopwatch stopwatch = Stopwatch.StartNew();
for (int i = 0; i < max; i++)
{
Thread.Sleep(5);
}
stopwatch.Stop();
long lSearchTime = stopwatch.ElapsedMilliseconds;
MessageBox.Show(lSearchTime.ToString() + "毫秒");
}
*****************调用多个参数的函数****************
方式一:类对象法
定义一个类,将要传的参数设置为类的属性,然后将参数值赋值给类的属性
将类作为一个参数进行传达。
EG:
class MyClass
{
public int Max { get; set; }
public int Min { get; set; }
}
#region 第一种方式:执行带多个参数的多线程
MyClass model = new MyClass();
model.Max = 500;
model.Min = 0;
Thread mythread1 = new Thread(new ParameterizedThreadStart(CalculateTwo));
mythread1.IsBackground = true;
mythread1.Start(model);
#endregion
private void CalculateTwo(object Myclass) //带多个参数的委托函数
{
MyClass model = (MyClass)Myclass;
Stopwatch stopwatch = Stopwatch.StartNew();
for (int i = model.Min; i < model.Max; i++)
{
Thread.Sleep(5);
}
stopwatch.Stop();
long lSearchTime = stopwatch.ElapsedMilliseconds;
MessageBox.Show(lSearchTime.ToString() + "毫秒");
}
方式二:lambda表达式的方式,简单方便
EG:
#region 第二种方式:执行带多个参数的多线程
Thread mythread2 = new Thread(() => CalculateThree(500, 0));
mythread2.IsBackground = true; //設置為後臺線程,程式關閉后進程也關閉,如果不設置true,則程式關閉,此線程還在內存,不會關閉
mythread2.Start();
#endregion
private void CalculateThree(int Max,int Min) //带多个参数的委托函数
{
Stopwatch stopwatch = Stopwatch.StartNew();
for (int i = Min; i < Max; i++)
{
Thread.Sleep(5);
}
stopwatch.Stop();
long lSearchTime = stopwatch.ElapsedMilliseconds;
MessageBox.Show(lSearchTime.ToString() + "毫秒");
}
12.引用类型、值类型
NET Framework 中的所有类型不是值类型就是引用类型
值类型是使用对象实际值来表示对象的数据类型。如果向一个变量分配值类型的实例,则该变量将被赋以该值的全新副本。
引用类型是使用对对象实际值的引用(类似于指针)来表示对象的数据类型。如果为某个变量分配一个引用类型,则该变量将引用(或指向)原始值。不创建任何副本