• c# 结构体和一些基础知识


    c# 里面的结构体:
     
    1. 是值类型的
    struct Books
    {
       public string title;
    };  
     
    2. 使用
    Books Book1;
    Book1.title = "C Programming";
     
    3. 里面可以写 字段 属性 方法
     
    4. 默认自带空构造函数,而且自己不能再写。 但是自己可以写其他的构造函数,必须对每个字段赋初始值。然后字段不能写初始值
     
    5 不支持继承
     
    6 保存在栈上,性能好。
     
     默认(LayoutKind.Sequential)情况下,CLR对struct的Layout的处理方法与C/C++中默认的处理方式相同,即按照结构中占用空间最大的成员进行对齐(Align);
            使用LayoutKind.Explicit的情况下,CLR不对结构体进行任何内存对齐(Align),而且我们要小心就是FieldOffset;
            使用LayoutKind.Auto的情况下,CLR会对结构体中的字段顺序进行调整,使实例占有尽可能少的内存,并进行4byte的内存对齐(Align)。
    2. 内存分配问题。
    如果不显示的设置内存对齐方式(通过StructLayout.Pack属性决定), C#默认是以4个字节(byte)为单位,会出现“多分配”内存的情况。 例如:
    1. Class Example
    2. {
    3. public byte b1;
    4. public char c2;
    5. public int i3;
    6. }
    默认情况下(StructLayout.Pack = 4),Framework编译器会为example对象分配8个字节(字段c2后面会补齐2个byte )。每个成员的索引和大小结果为:
         Size: 8
         b1 Offset: 0, lenght =1, 
         c2 Offset: 1, length = 1,
         i3 offset: 4, length = 4
     
    C++ 编译器的分配方式则为:
      Size: 6
         b1 Offset: 0, lenght =1, 
         c2 Offset: 1, length = 1,
         i3 offset: 2, length = 4
     
    由于内存分配的大小不一致,导致在传递对象marshal的时候回出现问题!!
     
     
    MarshalAs属性指示如何在托管代码和非托管代码之间封送数据。
    当 MarshalAsAttribute.Value 设置为 ByValArray 时,必须设置 SizeConst 以指示数组中的元素数。当需要区分字符串类型时,ArraySubType 字段可以选择包含数组元素的 UnmanagedType。此 UnmanagedType 只可用于作为结构中的字段的数组。而SizeConst则是指数组中的元素个数。
     
    GCHandlegch = GCHandle.Alloc(Mangement_Mem,GCHandleType.Normal);
    自己开一段内存,自己管理,不用了自己回收。GC不会处理了
     
    c# 反射判断是否继承 IList, 并判断T是否是我们想要的类型
    type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>) && type.GetGenericArguments()[0] == typeof(DllInformation)
     
    要特别注意避免以下的错误:
    for (var i = 0; i < list.Count(); i++)
    {
     
    }
     
    var len = list.Count();
    for (var i = 0; i < len; i++)
    {
     
    }
    开发GDI,如果没有缓存count,性能很慢
     
    还有大数据量,10W级别以上的list特别注意循环的次数,1次for循环还好说,搞个三四次,五六次性能就吃不住了
     
    winform 窗体resize的时候,特别注意resize的处理函数消耗的时间,不要太长了
    如果太长,本身不处理,拖拽一下,可能发10次
    时间就,第一次来处理不完,后面第二次,第三次,错过了,接着就到第四次了
     
    对于相同的Assembly
    如果想重定向到另外一个版本号的dll,注意名字还得是一样,仅仅是版本号不一样

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
    <assemblyIdentity name="MyFirstMath"
    publicKeyToken="057d97a5945de510"
    culture="neutral" />
    </dependentAssembly>
    </assemblyBinding>
    </runtime>
    </configuration>
    在assemblyIdentity下面加上这句话:
    <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>

    如果想更换加载这个dll的位置,加这句话
    <codeBase version="2.0.0.0" href="../../resources/MyFirstMath.dll"/>

     
     
  • 相关阅读:
    html5---音频视频基础一
    SQL--数据库性能优化详解
    微信--入门开发
    MVC----基础
    jquery -----简单分页
    sql优化
    集合的总结
    java并发编程与高并发解决方案
    java中boolean类型占几个字节
    正则表达式小结
  • 原文地址:https://www.cnblogs.com/chenyingzuo/p/16461163.html
Copyright © 2020-2023  润新知