01.C#开发实战1200例笔记-编程基础篇:开发环境、关键字、字符串

C#开发实战1200例笔记-编程基础篇:开发环境、关键字、字符串

  • 1 开发环境
    • 1.1 文本编辑器显示行号
    • 1.2 全屏显示
    • 1.3 添加现有项
    • 1.4 封装字段
  • 2 运算符、关键字
    • 2.1 注释
    • 2.2 位移
    • 2.3 checked检测溢出
    • 2.4 typeof
    • 2.5 using
    • 2.6 is、as
    • 2.7 switch
    • 2.8 goto
    • 2.9 递归***
  • 3 字符串处理
    • 3.1 常用
    • 3.2 Des加解密***
    • 3.3 货币形式转换
    • 3.4 进制转换
    • 3.5 Graphics***
    • 3.6 设置系统时间***
    • 3.7 计算年龄
    • 3.8 生肖
    • 3.9 今天星期几
    • 3.10 月份有几天
    • 3.11 闰年平年
    • 3.12 时间间隔
    • 3.13 字符串转换为时间

C#开发实战1200例第一卷有888页,这篇文章覆盖1-86页。***尾缀的是扩展内容。

1 开发环境

1.1 文本编辑器显示行号

工具-选项-文本编辑器-所有语言-显示 行号。

1.2 全屏显示

视图-全屏显示。(快捷键Shift+Alt+Enter)

1.3 添加现有项

添加现有项,会自动复制文件到当前项目文件夹下。

1.4 封装字段

字段处-右键-重构-封装字段(Ctrl+R Ctrl+E)

2 运算符、关键字

2.1 注释

符号 作用
// 单行注释
/* */ 多行注释
/// 1.在成员变量或函数上一行(要求空行),输入///,会自动补全函数说明。2.生成自动文档(项目属性-生成-输出XML文档),项目描述直观。

2.2 位移

左操作数的类型可以是int、uint、long、ulong、byte、sbyte、short、ushort。不能是double、float等。
byte、sbyte、short、ushort类型的值在位移操作后会转换成int类型。
移位值取自右操作数的低位(int-5、 long-6),移位操作从不导致溢出。

2.3 checked检测溢出

byte temp=255;
try
{
    checked { temp += 10; }
}
catch ( Exception ex){}

2.4 typeof

typeof关键字用于获取类型的System.Type对象。

 System.Type t = typeof(System.String);
 foreach (MethodInfo method in t.GetMethods())
   {
       foreach (ParameterInfo para in method.GetParameters())
       {
           //...
       }
   }

2.5 using

1.using关键字用来引用命名空间。
2.回收对象资源。
包括文件资源、网络资源、数据库资源等。要求小括号内产生的对象必须实现IDisposable接口。在using关键字下面的代码块执行完毕后,会自动将using小括号中创建的对下隐式转换为IDisposable接口类型,并调用接口方法Dispose释放对象资源。

2.6 is、as

两者都不会抛出异常。
is关键字用于检查对象是否与指定类型兼容。as关键字会直接进行类型转换,如果转换失败,返回NULL。

string temp1 = null;
object a = "something...";
if (a is string)
{
    temp1 = (string)a;
}

string temp2 = a as string;
if (temp2 != null)
{ 
//....
}

2.7 switch

switch表达式的值只可以是整型、字符串、枚举和布尔类型。
多个case可以使用一个break关键字,但只有最后一个case标签中可以带有语句块,前面的case标签中不可以带有语句块。

2.8 goto

goto语句可以跳转到定义标签的位置。包括switch语句中的case标签、default标签和语句声明的标签,也可以使用goto语句跳出多层嵌套循环。
标签的作用域为声明它的整个语句块,包括其中的嵌套块。
goto语句的3种格式:
goto 【标签】;
goto case【参数表达式】;
goto default;

int i = 0; 
switch (i)
{
    case 0:
        i = 2;
        goto case 1;
    case 1:
        i = i + 1;
        goto default;
    default:
        i = i + 1;
        break;
}

2.9 递归***

递归是方法在运行中直接或间接调用自身而产生的重入现象。

   static int Get(int i)
    { 
        if (i <= 0)
        {
            return 0;
        }
        if (i <= 2)
        {
            return 1;
        } 
        return Get(i - 1) + Get(i - 2);
    }

3 字符串处理

3.1 常用

  1. ToUpper() 转换字母为大写,ToLower() 转换字母为小写
  2. ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是基于拉丁字母的编码系统,是现今最通用的单字节编码系统。字符Char是值类型,表示成16位Unicode代码值,低8位为0。
  3. 正则汉字 unicode编码 [\u4e00-\u9f05]
  4. 字符串类型是不可改变的,字符串方法返回新字符串,原字符串不会改变。
  5. 频繁操作字符串时产生大量未被引用的字符串对象,会增加垃圾收集的压力,可以使用StringBuilder操作,需引入命名空间System.Text。
  6. 字符串反转
char[] chr = "123456".ToCharArray();
Array.Reverse(chr, 0, chr.Length);
string reversed_str = new StringBuilder().Append(chr).ToString();//reversed_str为"654321"

3.2 Des加解密***

加密:
字符串加密的过程是首先创建内存流对象,将内存流作为参数创建加密流对象,通过Write()方法向加密流写入数据以实现加密目的,最后从内存流中取出加密后的数据。

byte[] data=Encoding.Unicode.GetBytes("data");
byte[] key=Encoding.Unicode.GetBytes("1234");//注意:des加密秘钥长度64bit
byte[] keyIV=Encoding.Unicode.GetBytes("12345");
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms,  //内存流
    new DESCryptoServiceProvider().CreateEncryptor(key, keyIV), //加密器对象
	CryptoStreamMode.Write);    //对加密流写访问
cs.Write(data, 0, data.Length);//向加密流中写入数据
cs.FlushFinalBlock();//数据压入基础流
byte[] encrypted_data_byte = ms.ToArray();//加密信息的字节数组
string encrypted_data = Convert.ToBase64String(encrypted_data_byte);//加密字符串

解密:
字符串解密的过程是将加密信息写入内存流,根据内存流作为参数创建加密流对象,最后通过加密流读取解密数据。

string encrypted_data = "WISEgAXPdAab4Rt9lBVceg=="; //将加密后的字符串转换为字节序列
byte[] key1 = Encoding.Unicode.GetBytes("1234");//注意:des加密秘钥长度64bit
byte[] keyIV1 = Encoding.Unicode.GetBytes("12345");
byte[] en_data_byte = Convert.FromBase64String(encrypted_data);
MemoryStream ms1 = new MemoryStream(en_data_byte);
CryptoStream cs1 = new CryptoStream(ms1,//内存流对象
    new DESCryptoServiceProvider().CreateDecryptor(key1, keyIV1),//解密器对象
    CryptoStreamMode.Read);//对加密流访问
byte[] temp_buffer = new byte[1024];
MemoryStream ms_data=new MemoryStream();//创建数据内存流对象
int readcount=0;//读取字节数
while ((readcount= cs1.Read(temp_buffer, 0, temp_buffer.Length)) > 0)//得到解密数据
{
    ms_data.Write(temp_buffer, 0, readcount);
} 
string data1 = Encoding.Unicode.GetString(ms_data.ToArray());//解密后的字符串

3.3 货币形式转换

System.Globalization.NumberFormatInfo gn = 
    new System.Globalization.CultureInfo("zh-CN", false).NumberFormat;
gn.CurrencyDecimalDigits = 3;
gn.CurrencyGroupSeparator = ",";//设置在货币值中对小数点左边数字进行分组的字符串。
string money = 1222.2245.ToString("C", gn);//money为 "¥1,222.225"

3.4 进制转换

 int num = Convert.ToInt32("1f", 16);//num=31
 string strnum = Convert.ToString(num, 16);//strnum为"1f"

3.5 Graphics***

Thread th = new Thread(() => {//lambda
 while (true)
 {
     this.Invoke( new MethodInvoker(delegate{
      this.Refresh();//重绘。屏蔽这句的话,文字发生重叠
         Graphics g =this.CreateGraphics();
         g.DrawString("time:"+DateTime.Now.ToString(),new Font(new FontFamily("宋体"),15),Brushes.Blue,new Point(10,10));
         g.Dispose();
     }));
     Thread.Sleep(1000);
 }
});

3.6 设置系统时间***

调用GetLocalTime和SetLocalTime需要引用非托管程序集,所以需要引用System.Runtime.InteropServices。

public class SetSystemDateTime//设置系统日期类
{
    [DllImportAttribute("Kernel32.dll")]
    public static extern void GetLocalTime(SystemTime st);
    [DllImportAttribute("Kernel32.dll")]
    public static extern void SetLocalTime(SystemTime st);
}

[StructLayoutAttribute(LayoutKind.Sequential)]
public class SystemTime//系统时间类
{
    public ushort vYear;//年
    public ushort vMonth;//月
    public ushort vDayOfWeek;//星期
    public ushort vDay;//日
    public ushort vHour;//小时
    public ushort vMinute;//分
    public ushort vSecond;//秒
}

3.7 计算年龄

调用VB程序集中DataAndTime类的DataDiff静态方法来计算两个日期的差,得到人员年龄。需要添加Microsoft.VisualBasic程序集引用。
C#中的TimerSpan对象只有Days、Hours、Minutes、Seconds、MilliSeconds。

long P_BirthDay = DateAndTime.DateDiff(DateInterval.Year,//计算年龄
	new DateTime(1995,7,1),DateTime.Now, 
	FirstDayOfWeek.Sunday, FirstWeekOfYear.Jan1);

3.8 生肖

十天干:甲、乙、丙、丁、戊、己、庚、辛、壬、癸。
十二地支:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。
十天干和十二地支进行循环组合:甲子、乙丑、丙寅…一直到癸亥,共得到60个组合,称为六十甲子,如此周而复始,无穷无尽。

 System.Globalization.ChineseLunisolarCalendar chinseCaleander =//创建日历对象
      new System.Globalization.ChineseLunisolarCalendar();
 string TreeYear = "鼠牛虎兔龙蛇马羊猴鸡狗猪";//地支对应生肖 
 int intYear = chinseCaleander.GetSexagenaryYear(DateTime.Now);//计算甲子循环中的年
 string Tree = TreeYear.Substring(chinseCaleander.GetTerrestrialBranch(intYear) - 1, 1);//计算地支,对应生肖 

3.9 今天星期几

string today = DateTime.Now.ToString("dddd");//汉字,如"星期四"
DayOfWeek today_index = DateTime.Now.DayOfWeek;//DayOfWeek是枚举类型,英文,如Thursday

3.10 月份有几天

int days= DateTime.DaysInMonth(2020, 7);

3.11 闰年平年

bool leapYear = DateTime.IsLeapYear(2020);

3.12 时间间隔

DateTime dtnow = DateTime.Now;//2020/7/9 15:56:48 
TimeSpan P_timespan_temp = dtnow - new DateTime(1995, 7, 1);
//间隔时间:9140天15时56分48秒
string msg = string.Format("间隔时间:{0}天{1}时{2}分{3}秒",
      P_timespan_temp.Days, P_timespan_temp.Hours,
      P_timespan_temp.Minutes, P_timespan_temp.Seconds);

3.13 字符串转换为时间

DateTime dt = DateTime.ParseExact("2020/07/09 11:11:11", "yyyy/MM/dd HH:mm:ss", null);
DateTime dt2 = Convert.ToDateTime("2020-07-09 11:11:11");

你可能感兴趣的:(c#)