C# 部分知识

来源:互联网 发布:织梦gbk和utf 8 编辑:程序博客网 时间:2024/05/21 06:12

1.MessageBox的应用:

MessageBox.Show("断成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

2.字符串转换成字节数组:

声明字节数组 byte[] strbyte = byte[10]

        #region 字符串转换成字节数组

        private byte[] stringTobyte(string s)

        {

            ArrayList al = new ArrayList();

            for (int i = 0; i < s.Length; i++)

            {

                al.Add((byte)s[i]);

            }

            return (byte[])al.ToArray(System.Type.GetType("System.Byte"));

        }

        #endregion

 

3. 字节数组转成字符串:  
  System.Text.Encoding.Default.GetString();  
  字符串转成字节数组:  字节数组未必能转为字符串,除非它里面存放的就是正确的字符串编码,才能使用方法 System.Text.Encoding.Default.GetBytes();

 

4.结构体和字节数组的互换:

 

在写C# TCP通信程序时,发送数据时,只能发送byte数组,处理起来比较麻烦,若和VC写的程序

通信,很多传送结构体,在VC可把一个Char[]数组转换成结构体,二字节数组不能直接转化。

 

下面解决方法:

   (1)定义结构体:

  // 命名空间

  using System.Runtime.InteropServices;

  //注意这个属性不能少

  [StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]

  struct TestStruct

  {

      public int c;

      //字符串,SizeConst为字符串的最大长度

       [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]

      public string str;

      //int数组,SizeConst表示数组的个数,在转换成

      //byte数组前必须先初始化数组,再使用,初始化

      //的数组长度必须和SizeConst一致,例test = new int[6];

       [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]

      public int[] test;

   }

 

   (2)结构体转byte数组:

 

              /**//// <summary>

              /// 结构体转byte数组

              /// </summary>

              /// <param name="structObj">要转换的结构体</param>

              /// <returns>转换后的byte数组</returns>

              public static byte[] StructToBytes(object structObj)

              {

                  //得到结构体的大小

                  int size = Marshal.SizeOf(structObj);

                  //创建byte数组

                  byte[] bytes = new byte[size];

                  //分配结构体大小的内存空间

                      IntPtr structPtr = Marshal.AllocHGlobal(size);

                  //将结构体拷到分配好的内存空间

                      Marshal.StructureToPtr(structObj, structPtr, false);

                  //从内存空间拷到byte数组

                     Marshal.Copy(structPtr, bytes, 0, size);

                  //释放内存空间

                   Marshal.FreeHGlobal(structPtr);

                  //返回byte数组

                  return bytes;

               }

 

    (3)byte数组转结构体:

 

              /**//// <summary>

              /// byte数组转结构体

              /// </summary>

              /// <param name="bytes">byte数组</param>

              /// <param name="type">结构体类型</param>

              /// <returns>转换后的结构体</returns>

              public static object BytesToStuct(byte[] bytes,Type type)

              {

                  //得到结构体的大小

                  int size = Marshal.SizeOf(type);

                  //byte数组长度小于结构体的大小

                  if (size > bytes.Length)

                  {

                      //返回空

                      return null;

                   }

                  //分配结构体大小的内存空间

                   IntPtr structPtr = Marshal.AllocHGlobal(size);

                  //将byte数组拷到分配好的内存空间

                   Marshal.Copy(bytes,0,structPtr,size);

                  //将内存空间转换为目标结构体

                  object obj = Marshal.PtrToStructure(structPtr, type);

                  //释放内存空间

                   Marshal.FreeHGlobal(structPtr);

                  //返回结构体

                  return obj;

               }

5. 声明结构体可序列化

     [Serializable] // 指示可序列化
    [StructLayout(LayoutKind.Sequential, Pack = 1)] // 按1字节对齐

public struct Operator

 

6. C#与C++数据类型的对应关系

C++与C#的数据类型对应关系表
 
API数据类型
 类型描述
 C#类型
 API数据类型
 类型描述
 C#类型
 
WORD
 16位无符号整数
 ushort
 CHAR
 字符
 char
 
LONG
 32位无符号整数
 int
 DWORDLONG
 64位长整数
 long
 
DWORD
 32位无符号整数
 uint
 HDC
 设备描述表句柄
 int
 
HANDLE
 句柄,32位整数
 int
 HGDIOBJ
 GDI对象句柄
 int
 
UINT
 32位无符号整数
 uint
 HINSTANCE
 实例句柄
 int
 
BOOL
 32位布尔型整数
 bool
 HWM
 窗口句柄
 int
 
LPSTR
 指向字符的32位指针
 string
 HPARAM
 32位消息参数
 int
 
LPCSTR
 指向常字符的32位指针
 String
 LPARAM
 32位消息参数
 int
 
BYTE
 字节
 byte
 WPARAM
 32位消息参数
 int
 

 

7. int[] i_maincopy = new int[]{0}; 声明Int数组,并且对数组赋值为0.

8. C#里Math.Round()函数问题

Math.Round(2.5,0)   =   2;

这个函数不是四舍五入,而是四舍六入五凑偶,
如果舍入位为5,则舍入后最后一位为偶数,这是国际惯例。
现在做的项目都要5入,解决方法:
目前做法是:  
  如:(3.45*10+0.5)取整,再除以10

 

9. C#时间处理(DateTime和TimeSpan)

//取得某月的最后一天

    //方法一:使用算出該月多少天,年+月+加上多少天即得,舉例取今天這個月的最后一天

    private void GetLastDateForMonth(DateTime DtStart, out DateTime DtEnd)

    {

        int Dtyear, DtMonth;

        DtStart = DateTime.Now;

        Dtyear = DtStart.Year;

        DtMonth = DtStart.Month;

        int MonthCount = DateTime.DaysInMonth(Dtyear, DtMonth);//計算該月有多少天

        DtEnd = Convert.ToDateTime(Dtyear.ToString() + "-" + DtMonth.ToString() + "-" + MonthCount);

    }

    //方法二:取出下月的第一天減去一天便是這個月的最后一天

    private void GetLastDateForMonth(DateTime DtStart, out DateTime DtEnd)

    {

        int Dtyear, DtMonth;

 

        DtStart = DateTime.Now.AddMonths(1);//月份加1

        Dtyear = DtStart.Year;

        DtMonth = DtStart.Month;

        DtEnd = Convert.ToDateTime(Dtyear.ToString() + "-" + DtMonth.ToString() + "-" + "1").AddDays(-1);//取出下月的第一天減去一天

    }

 

二、时间差的计算

法一、使用TimeSpan ,同时也介绍一下TimeSpan的用法

相关属性和函数

Add:与另一个TimeSpan值相加。

Days:返回用天数计算的TimeSpan值。

Duration:获取TimeSpan的绝对值。

Hours:返回用小时计算的TimeSpan值

Milliseconds:返回用毫秒计算的TimeSpan值。

Minutes:返回用分钟计算的TimeSpan值。

Negate:返回当前实例的相反数。

Seconds:返回用秒计算的TimeSpan值。

Subtract:从中减去另一个TimeSpan值。

Ticks:返回TimeSpan值的tick数。

TotalDays:返回TimeSpan值表示的天数。

TotalHours:返回TimeSpan值表示的小时数。

TotalMilliseconds:返回TimeSpan值表示的毫秒数。

TotalMinutes:返回TimeSpan值表示的分钟数。

TotalSeconds:返回TimeSpan值表示的秒数。

简单示例:

DateTime d1 =new DateTime(2004,1,1,15,36,05);

DateTime d2 =new DateTime(2004,3,1,20,16,35);

TimeSpan d3 = d2.Subtract(d1);

LbTime.Text = "相差:"

+d3.Days.ToString()+"天"

+d3.Hours.ToString()+"小时"

+d3.Minutes.ToString()+"分钟"

+d3.Seconds.ToString()+"秒";

法二、使用Sql中的DATEDIFF函数

使用方法:DATEDIFF ( datepart , startdate , enddate )

它能帮你取出你想要的各种形式的时间差,如相隔多少天,多少小时,多少分钟等,具体格式如下:

 

日期部分缩写

year yy, yyyy

quarter qq, q

Month mm, m

dayofyear dy, y

Day dd, d

Week wk, ww

Hour hh

minute mi, n

second ss, s

millisecond ms

 

 

如:datediff(mi,DtOpTime,DtEnd) 便能取出他们之间时间差的分钟总数,已经帮你换算好了,对于要求规定单位,时、分、秒特别有用

 

三 计算两个日期之间相差的工作日天数(转载:http://wrfwjn.blog.hexun.com/482517_d.html)

/// <summary>

   /// 计算两个日期之间相差的工作日天数

   /// </summary>

   /// <param name="dtStart">开始日期</param>

   /// <param name="dtEnd">结束日期</param>

   /// <returns>Int</returns>

   public int CalculateWorkingDays(DateTime dtStart, DateTime dtEnd)

   {

    int count=0;

    for(DateTime dtTemp=dtStart;dtTemp<dtEnd;dTemp=dtTemp.AddDays(1))

    {

//     if(dtTemp.DayOfWeek!=DayOfWeek.Saturday&&dtTemp.DayOfWeek!=DayOfWeek.Sunday)

//     {

//      count++;

//     }

     count++;

    }

    return count;

   }

DateTime是内置的事件类型,TimeSpan是内置的事件间隔类型

两个类型为DateTime的变量作-运算得到类型为TimeSpan的数据

DateTime.Now是一个只读属性,返回当前的时间,类型为DateTime

TimeSpan :根据输入日期计算两个指定日期之间的时间间隔。

语法:String TimeSpan('转义字符','被比较日期','目标比较日期')

 

传回值:字符

 

参数说明:

 

   转义字符:输入类型为字符,具有不同格式化字符的字符如内容说明中所例。输入字符内的格式化字符被格式化后输出,其他不属于格式化的字符则根据对应位置输出。'被比较日期':输入类型为字符,需要被比较的日期格式的字符内容。'目标比较日期':输入类型为字符,用来比较的目标日期格式的字符内容。

 

内容说明:根据输入日期计算两个指定日期之间的时间间隔。

 

转义字符说明:T:获 取两个日期之间差异刻度表示的差异值。(正数或负数)d:获取两个日期之间差异的整天数。(正数或负数)h:获取两个日期之间差异的整小时数。(正数或负 数)u:获取两个日期之间差异的整毫秒数。(正数或负数)m:获取两个日期之间差异的整分钟数。(正数或负数)s:获取两个日期之间差异的整秒数。(正数或负数)D:获取两个日期之间以整天数和天的小数部分表示的差异值。(正数或负数)H:获取两个日期之间以整小时数和小时的小数部分表示的差异值。(正数 或负数)U:获取两个日期之间整毫秒数和毫秒的小数部分表示的差异值。(正数或负数)M:获取两个日期之间以整分钟数和分钟的小数部分表示的差异值。(正 数或负数)S:获取两个日期之间以整秒数和秒的小数部分表示的差异值。(正数或负数)

 

10. 自动对文本分行的C#函数
相当简单的C#函数实现代码片断,按照最小行长度分行和断行(会超过最小行长度),曾用于自动给太长的Winform Tooltip断行。

private string MultiplineString(string instr, int line_length)
{
    string remain = instr, multi_line="";
    while(remain.Length > line_length)
    {
        int space_pos = remain.IndexOf(' ', line_length);
        if (space_pos == -1)
            break;
        multi_line += remain.Substring(0, space_pos) + "/r/n";
        remain = remain.Substring(space_pos + 1);
    }
    return multi_line + remain;
}

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kaola2599/archive/2009/06/25/4294633.aspx

原创粉丝点击