C#基础

1、List的Add和AddRange

Add(T item)
将对象添加到集合的结尾处
要添加到集合的结尾处的对象,对于引用类型,可以为null
AddRange(IEnumreable collection)
将一个集合添加到集合的末尾,集合自身不能为null,但它可以包含为null的元素(如果类型T为引用类型)

2、volatile

volatile是一个类型修饰符。volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略。

volatile的特性

  • 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这个新值对其他线程来说是立即可见的。(实现可见性)
  • 禁止进行指令重排序。(实现有序性)
    禁止编译器和CPU更改字段的位置,强制刷新CPU的高速缓存,当读取该关键字的字段时每次都会去内存里重新加载数据然后读到CPU的高速缓存而不适用CPU高速缓存中较老的数据。

volatile关键字可用于以下类型的字段

  • 引用类型
  • 指针类型(在不安全的上下文中)。请注意,虽然指针本身是可变的,但是它指向的对象不能是可变的。换句话说,您无法声明“指向可变对象的指针”。
  • 整型,如sbyte,byte,short,ushort,int.uint,char.float和bool
  • 具有整数基类型的枚举类型
  • 已知为引用类型的泛型类型参数。
  • IntPtr和UIntPtr
    可变关键字仅可应用于类或结构字段。不能将局部变量声明为volatile
class Test
{
  public volatile int i;

  Test(int _i)
  {
     i = _i;
  }
}

3、STAThread

STAThread:Single Thread Apartment Thread(单一线程单元线程)
是一种线程模型,用在程序的入口方法上(在C#和VB.NET里是Main()方法),来指定当前线程的ApartmentState 是STA。用在其他方法上不产生影响。在aspx页面上可以使用AspCompat = “true” 来达到同样的效果。这个属性只在 Com Interop 有用,如果全部是 managed code 则无用。简单的说法:[STAThread]指示应用程序的默认线程模型是单线程单元 (STA)。启动线程模型可设置为单线程单元或多线程单元。如果未对其进行设置,则该线程不被初始化。也就是说如果你用的.NET Framework,并且没有使用COM Interop,一般不需要这个Attribute。其它的还有MTA(多线程套间)、Free Thread(自由线程)。
[STAThread] attribute指示应用程序的 COM 线程模型是单线程单元。
而于此对应的多线程单元则是 [MTAThread] (多线程单元线程)

COM 线程模型只适用于使用 COM interop 的应用程序。如果将此属性应用到不使用 COM interop 的应用程序,将没有任何效果。

COM 线程模型可设置为单线程单元或多线程单元。如果应用程序线程实际调用了 COM 组件,则仅为 COM interop 初始化该线程。如果没有使用 COM interop,则不初始化该线程。
摘自原文链接
sta thread并不表明应用程式的类型,和应用程序不搭界,恰相反,一个应用程序可以有多个线程.每个线程也可以有多个组件或对象.以前win16位系统的组件线程模式才真正是单线程.这是一种被淘汰了的模式.
线程模式用于处理组件在多线程的环境里并行与并互的方式.比如套间线程(STAThread)模式中接口跨线程传递必须被调度(Marshal),不调度直传肯定会失败!而MTA或FreeThread模式中的接口可以不经调度直接传递.
这种调度在特定的环境中非常影响性能(可有几百倍之差).如VB里只支持STAThread模式.FreeThread模式的组件会在里面表现成和跨进程一样慢!
摘自原文链接

4、MarshalAs

作用

MarshalAs属性指示如何在托管代码和非托管代码之间封送数据。
备注:运行在公共语言运行库 (CLR) 的控制之下的代码称为“托管代码”,运行在 CLR 之外的代码称为“非托管代码”。

使用方法

[MarshalAs(UnmanagedType unmanagedType, 命名参数)]

实际上相当于构造一个MarshalAsAttribute类的对象

常用的UnmanagedType枚举值:(详细内容查MSDN)

BStr 长度前缀为双字节的 Unicode 字符串;

LPStr 单字节、空终止的 ANSI 字符串。;

LPWStr 一个 2 字节、空终止的 Unicode 字符串;

ByValArray 用于在结构中出现的内联定长字符数组,应始终使用MarshalAsAttribute的SizeConst字段来指示数组的大小。

注意

在用Marshal.SizeOf(),即获取对象的非托管大小时,获得的是自己定义的大小;

但在实际处理的时候,是按照实际的大小来获取的

示例

定义一个结构体

public struct Info
{
	public int size;
	[MarshalAs(UnmangedType.ByValArray,SizeCount=256)]
	public byte[] Data;
}

int size = Marshal.SizeOf(type);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值