当前位置:   article > 正文

C#基础知识_net codr api dllimport charset.ansi)

net codr api dllimport charset.ansi)

界面假死

1、Application.DoEvents(),这种方法当你拖动窗体时,界面不会假死。但在你拖动时代码不再执行,也就是阻塞了,当你不再控制窗体时会继续执行,其实这还是一个单线程
2、多线程

引用传递、输出传递

ref 的实参必须先经过初始化,然后才能传递
out 形参不同,在传递之前,不需要显式初始化该形参的实参。

C#中调用libtorch

C++的dll、libtorch、C#

.Net Core 和 .Net Framework的不同

历史
.Net Framework 历史要比 .Net Core 久一些。.Net Framework 的第一个版本大约在2002年前后推出的,而.Net Core的第一个版本,大约在2016年前后推出的,相差了将近14年的时间。Net Core 的出现就是为了适应软件开发的趋势,因为各种不同的设备还有云计算的出现,其他的操作系统使用量也有所增加,如果Net 不发生改变也就意味着市场将会越来越小。

协议
.Net Framework,即便它里面的一些东西开源了,但是微软是使用商业协议发布的.Net Framwork,不言而喻,它是一个私有的商业软件,发布基于.Net Framwork的产品时,就要按照微软的规则来了。
.Net Core 是一个完全开源的东西,无论是类库,运行时,编译器,因此任何个人或企业发布基于.Net Core的产品时,无需向微软付费,只需要按照开源协议的规则来。

跨平台特性
.Net Framework,只针对Windows平台,包含了Windows平台的所有特性。
.Net Core 可以针对多个平台发布,但是.Net Core 无法包含.Net Framework的所有特性。但是.Net Core的跨平台特性可以方便的在多个平台上共享业务逻辑。

发布
.Net Framework 是通过将运行时安装到Windows的方式,让所有应用可以共享这个运行时。
.Net Core 是跨平台的,因此它需要针对不同平台打包运行时

C#与C++之间实现参数传递

参数传递主要涉及C#调用dll文件时传入dll参数和调用结束dll文件传出参数。通常传入dll的参数类型为整数类型,整数数组类型和字符串类型。

1、在C#和C++中整数类型通常都为int类型,在参数传入时直接传入即可。
2、C#传入字符串参数
对于字符串类型,C#中为string类型,而C++接收参数类型为char*类型。C++中也有std::string类型来存储字符串,但在实际使用过程中发现当C++中接收参数类型是该类型时会报出错误。C++ DLL导出的接口中不要存在STL类对象,所以在封装DLL时,不要尝试提供std::string这种字符串的参数,应该提供C风格字符串的接口char *,约定以\0结尾

[DllImport(“EncryptString.dll”, CharSet = CharSet.Ansi)]指定编码方式为ansi(win32 C++中char对应的编码方式是ansi)。C++中char与C#中的string对应,但在使用时,有这么一条原则:如果char参数在函数内部不发生变化,比如声明为const char,那么可以对应为string,如果char参数本身作为返回字符串使用,也就是说参数在函数内部会发生变化,那么可以对应StringBuilder。
3、当函数输入参数为字符串char
时,调用函数将其“退化”为一个指针,读取内容直到\0为止,那么C#封装时,可以考虑通过IntPtr来封装。这种方式比利用string和StringBuilder更加灵活,在我们不知道DLL内部实现过程时,也显得更加安全。所以在实际封装过程中,推荐使用IntPtr。

在这里插入图片描述

参数传递

WinForm

业务逻辑以及事件方法等被编写在.cs文件中,而界面设计规则被封装在.Designer.cs文件里。

Application.Exit()关闭整个程序,Form.Close()关闭当前窗口。

C#可空类型

C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值。

例如,Nullable< Int32 >,读作"可空的 Int32",可以被赋值为 -2,147,483,648 到 2,147,483,647 之间的任意值,也可以被赋值为 null 值。类似的,Nullable< bool > 变量可以被赋值为 true 或 false 或 null。

在处理数据库和其他包含可能未赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型的功能特别有用。例如,数据库中的布尔型字段可以存储值 true 或 false,或者,该字段也可以未定义。

声明一个 nullable 类型(可空类型)的语法如下:< data_type> ? <variable_name> = null;
int i; //默认值0
int? ii; //默认值null

C#类的字段、方法、属性

1、在C#中,最基本的类的成员有两个——字段和方法,其本质是数据和算法,也就是说字段是类的变量,表示这个类储存了什么数据;方法是类所具有的函数,也就是这个类可以做什么事情。打开一个封装好的程序的对象浏览器,图中的方块图标后面的即为方法,扳手图标后面的是属性,字段对应的图标是一个盒子。

2、字段:一般把类或结构中定义的变量和常量叫字段;
属性:属性不是字段,本质上是定义修改字段的方法。这样属性更加充分的体现了数据的封装性:不直接操作类的数据内容,而是通过访问器进行访问,借助于get和set方法对属性的值进行读写。

3、字段的划分:
(1)静态字段:用修饰符static声明的字段。不管包含该静态字段的类生成多少个对象或根本无对象,该字段都只有一个实例,静态字段不能被撤销。引用方法:类名.静态字段名
(2)实例字段:类中定义的字段不使用修饰符static。每创建该类的一个对象,在对象内创建一个该字段实例,创建它的对象被撤销,该字段对象也被撤销。引用方法:实例名.实例字段名
(3)常量:用修饰符const声明的字段。常量只能在声明中初始化,以后不能再修改。类名.静态字段名
(4)只读字段:用修饰符readonly声明的字段。只读字段是特殊的实例字段,它只能在字段声明中或构造函数中重新赋值,在其他地方都不能改变只读字段的值。实例名.实例字段名3.

4、调用定义好的方法,首先需要将方法所在的类实例化为对象,然后通过对象.方法名() 的形式即可。
若调用同一个类中静态方法(使用 static 修饰的方法),则可以省略实例化对象的过程,直接使用方法名()的形式调用。

C#部分类(partial class)

使用partial关键字可以声明部分类, 部分类的作用是可以在多个文件中声明同一个类, 主要用于类比较大的时候进行拆分。不要把部分类以为是定义了多个类,其实还是一个类,只是把这个类拆分了。 在程序运行的时候编译器会把这个类合并在一起的, 这样做的好处是,当你有一个类很大的时候你可以按实现功能拆分在不同的文件中,这样就方便阅读和修改了

.Net框架

  • .NET是微软的托管代码模型,所谓的托管代码(IL)其实和JAVA的虚拟机很类似的,将C#语言“编译”成中间代码(IL)然后通过 .NET Framework 的虚拟机——被称之为通用语言运行时(Common Language Runtime, CLR)——执行。
    C#和.NET框架
    在这里插入图片描述

  • 公共语言运行时(CLR) 是 .NET Framework 的基础。在组件运行时,CLR除了负责满足此组件在其他组件上可能具有的依赖项外,还负责管理内存分配、启动和停止线程和进程,以及强制执行安全策略。
    在这里插入图片描述

  • C# 的版本及发布时间
    在这里插入图片描述

托管与非托管

受托管的代码不能直接写内存,是安全的,而非托管代码是非安全代码,可以使用指针操作内存。
一般的项目使用托管代码就行了,对于一些对速度要求高的部分功能可以考虑使用非安全代码,使用指针等读写内存,而对于整个项目来说还是受托管的安全代码。
托管和非托管的区别

C#调用C++的dll可以有两种方法

1、非托管C++创建的dll库,需要用静态方法调用;
2、直接使用CLR,生成托管C++dll库。
很多时候在项目中需要通过C++调用C#的dll,或者反过来调用。首先明白一个前提:C#是托管型代码。C++是非托管型代码
托管型代码的对象在托管堆上分配内存,创建的对象由虚拟机托管。(C# )
非托管型代码对象有实际的内存地址,创建的对象必须自己来管理和释放。(C++)

C#不同之处

  • C#内存管理:由底层.NET框架进行自动内存垃圾回收

  • C#的语法格式和JAVA十分类似,可以用于开发Windows程序,也就是我们熟悉的exe程序。C#的源程序并不是被编译成二进制可执行形式,而是一种中间语言(IL),类似于JAVA字节码。

  • 对象不能被显式释放,代替为当不存在被引用时通过垃圾回收器回收

  • 只允许单重继承,但是一个类可以实现多个接口

  • C#比C++更加类型安全。默认的安全转换是隐式转换,例如加宽整型和从派生类转换为基类。而布尔型同整型,及枚举型同整型不允许隐式转换,非空指针(通过引用相似对象)同用户定义类型的隐式转换必段被显式的确定,不同于C++的复制构造函数

  • 数组声明语法不同(“int[] a = new int[5]” 而不是 “int a[5]”)

  • C#中没有模版,但是在C# 2.0中引入了泛型,并且支持一些C++模版不支持的特性。比如泛型参数中的类型约束。另一方面,表达式不能像C++模版中被用于类型参数

  • 属性支持,使用类似访问成员的方式调用

  • 在C# 2.0中的新特性有:
    局部类型(将类实现分在多个文件中)
    泛型或参数化类型
    一种新形式的迭代器,类似于Python使用函数式编程风格的yield关键字
    匿名方法提供了closure功能

  • C# 3.0 新特性
    Lamda 表达法(Lambda expressions)
    匿名变量
    扩展方法(Extension methods)
    匿名型别(Anonymous types)
    Linq 查询
    表达式树(Expression Trees)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/191359
推荐阅读
相关标签
  

闽ICP备14008679号