您的位置:首页 > 编程语言 > C#

C#觉得好玩的笔记(---将不断更新哦---)

2017-10-18 00:18 190 查看
使用Console.Read( )方法读输入并不立即响应,而是要等到用户按下enter键。如果要即时做出响 应,可以改用Console的ReadKey方法,这时的比较输出代码可换成:ConsolKeyInfok =Console.ReadKey();

C#规定,一个类只能有一个基类

IndexOfAny()和LastIndexOfAny()查找对象是指定字符串数组中的任意字符

数值转换有一个原则:从低精度类型到高精度类型可进行隐式转换,而

从高精度类型到低精度类型 必须进行显式转换;从精度相同的无符号

数值类型向有符号数值类型的转换也只能显式转换。

C#支持两个预定义的引用类型object和string。

在应用程序执行的过程中,引用类型使用new关键字创建对象实例,并存储在堆中。堆是一种由系统 弹性配置的内存空间,没有特定大小及存活时间,因此可以被弹性地运用于对象的访问。

所有被称为“类”的都是引用类型,例如

Student student1= new Student();

Student student2= student1;

装箱是将值类型转换为引用类型;拆箱是将引用类型转换为值类型

利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类 型链接起来

计算器的动态编译器:博客:http://www.cnblogs.com/youring2/archive/2012/12/17/2822104.html

DateTime是C#的一种表示日期和时间的类型,如获取当前的时间: DateTime.Now.ToString(“YYYY-MM-DD-HH-mm-ss”);

还有一种类型是:System.TimeSpan,可用于两个DateTime类型的数运算,如: System.TimeSpan s = DateTimed1-DateTime d2;

9.  数组的类型转换

public static int StrToInt(string str)
{
return int.Parse(str);
}

string[] arrs = new string[] { "100", "300", "200" };
int[] arri = Array.ConvertAll(arrs, new Converter<string, int>(StrToInt));


抽象类可以有抽象方法和实体方法,但接口都public,只能抽象方法,所有所有方法都不用加作用域public 必须要有class实现

结构体是值类型,class是引用类型

实例方法,能调用静态方法,也能调用实例方法;但是静态方法之只能调用静态方法,不能调用实例方法,必须要new一个实例对象

Array.Sort([] d):对各类型数组进行升序排序,Array.Reverse([] d)对各类型数组进行倒序

int?:表示可空类型,就是一种特殊的值类型,它的值可以为null.

int a=null;(错)

int? a=null(正确)

ArrayList.Capacity容量不断改变,根据动态数组的个数进行分配容量。

输出当前时间和主机名字

Console.WriteLine(DateTime.Now.ToString()+’\t’+Environment.MachineName);

17. C#委托对象是真正的对象,C/C++函数指针只是函数入口地址: http://www.cnblogs.com/weidagang2046/archive/2009/08/09/1542248.html http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html0
18. 当子类继承有参构造函数的父类时候,必须用base关键字进行构造函数的派生。
19. MySql里面 char是一种固定长度的类型,varchar则是一种可变长度的类型


CRC算法实现

public static string CRCCalc(string data)

{

string[] datas = data.Split(’ ‘);

List bytedata = new List();

foreach (string str in datas)
{
b
10b0c
ytedata.Add(byte.Parse(str, System.Globalization.NumberStyles.AllowHexSpecifier));
}
byte[] crcbuf = bytedata.ToArray();
//计算并填写CRC校验码
int crc = 0xffff;
int len = crcbuf.Length;
for (int n = 0; n < len; n++)
{
byte i;
crc = crc ^ crcbuf
;
for (i = 0; i < 8; i++)
{
int TT;
TT = crc & 1;
crc = crc >> 1;
crc = crc & 0x7fff;
if (TT == 1)
{
crc = crc ^ 0xa001;
}
crc = crc & 0xffff;
}
}
string[] redata = new string[2];
redata[1] = Convert.ToString((byte)((crc >> 8) & 0xff), 16);
redata[0] = Convert.ToString((byte)((crc & 0xff)), 16);


if (redata[1].Length < 2)

redata[1] = “0” + redata[1];

if (redata[0].Length < 2)

redata[0] = “0” + redata[0];

return redata[0] + " " + redata[1];
}


```
21、C#中的ComboBox实现只能选择不能输入,且下拉框中有默认值。
// 在Designer.cs添加并修改顺序
this.comboBox1.Items.AddRange(new object[] {
"4800",
"9600",
"19200",
"38400",
"57600",
"115200"});
this.comboBox1.Text = this.comboBox1.Items[1].ToString();  //这个必须在Items定义下面才行,否则报错
this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;


21、 另一种更方法



22、 當SerialPort已經開啟以後就使用SerialPort.Write 方法 (Byte[], Int32, Int32)將前面的Byte陣列送出去,這個方法的參數1是你所要傳送的資料、參數二是你要從這個陣列的哪個位置開始送,參數三則是你要送的資料有多長。comport.Write(buffer, 0, buffer.Length) 這個寫法就是代表要送的資料存在buffer這個陣列中;從陣列的第一個元素 (它的Index是0);整個buffer我都要送,所以直接用buffer.Length,要多長就多長這樣。

23、控件TextBox内容全选快捷键实现
private void anyTextBox_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
if (e.KeyChar == '\x1')
{
((TextBox)sender).SelectAll();
e.Handled = true;
}
}


24、判断光标焦点在是否在 textbox:textbox.Focused ; 设置光标焦点:textbox.Focus();

25、关于c#注册表的问题,在Microsoft.Win32的命名空间里,主要是Registry类、RegistryKey类。

一般机器上的软件注册表都在Registry.LocaMachine这个主键

注册在当前用户里,如果使用管理员运行该软件才能注册在LocalMachine里,所以本地用户就随便注册在CurrentUser就可以了。

26、密码的加密解密方法:https://www.cnblogs.com/guohu/p/5562759.html

RSA加密算法

在谈RSA加密算法之前,我们需要先了解下两个专业名词,对称加密和非对称加密。

对称加密即:含有一个称为密钥的东西,在消息发送前使用密钥对消息进行加密,在对方收到消息之后,使用相同的密钥进行解密

非对称加密即:加密和解密使用不同的密钥的一类加密算法。这类加密算法通常有两个密钥A和B,使用密钥A加密数据得到的密文,只有密钥B可以进行解密操作(即使密钥A也无法解密),相反,使用了密钥B加密数据得到的密文,只有密钥A可以解密。这两个密钥分别称为私钥和公钥,顾名思义,私钥就是你个人保留,不能公开的密钥,而公钥则是公开给加解密操作的另一方的。根据不同用途,对数据进行加密所使用的密钥也不相同(有时用公钥加密,私钥解密;有时相反用私钥加密,公钥解密)。非对称加密的代表算法是RSA算法。

了解了这两个名词下面来讲,RSA加密算法。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,多用于数据加密和数字签名。虽然有这么大的影响力,但是同时它也有一些弊端,它产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密,分组长度太大等。

下面通过示例演示使用RSA加密、解密,引用名称空间System.Security.Cryptography;

//加密
private string Encryption(string express)
{
CspParameters param = new CspParameters();
param.KeyContainerName = "oa_erp_dowork";//密匙容器的名称,保持加密解密一致才能解密成功
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
{
byte[] plaindata = Encoding.Default.GetBytes(express);//将要加密的字符串转换为字节数组
byte[] encryptdata = rsa.Encrypt(plaindata, false);//将加密后的字节数据转换为新的加密字节数组
return Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为字符串
}
}

//解密
private string Decrypt(string ciphertext)
{
CspParameters param = new CspParameters();
param.KeyContainerName = "oa_erp_dowork";
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
{
byte[] encryptdata = Convert.FromBase64String(ciphertext);
byte[] decryptdata = rsa.Decrypt(encryptdata, false);
return Encoding.Default.GetString(decryptdata);
}
}


//通过使用RSA加密算法产出公匙和私匙
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
using (StreamWriter sw = new StreamWriter(Server.MapPath("PublicKey.xml")))//产生公匙
{
sw.WriteLine(rsa.ToXmlString(false));
}
using (StreamWriter sw = new StreamWriter(Server.MapPath("PrivateKey.xml")))//产生私匙(也包含私匙)
{
sw.WriteLine(rsa.ToXmlString(true));
}


27、关于路径名,最好就是在路径名前面加上@,如果不加@,那么路径名上的 ‘\’ 要换成 ‘\’ 才行 ,原因是 ‘\’ 会被当作字符串的一部分,而 ‘\’ 才被识别为转义字符:路径

28、GDI:关于graphics、brush、bitmap、image的关系

29、关于BitMap,原始需要占用很多字节,经过RLE压缩算法得到了很好的解决办法。

而RLE压缩算法的经历:

1、原始RLE方法(未压缩前:A-A-A-A-A-B-B-C-D,压缩后:5-A-2-B-1-C-1-D)

2、但是第一种方法最坏情况下就是所有的数据都不连续重复,则压缩后的数据量会增大一倍。实现的办法只能是,在数据压缩的时候如果发现数据的高两位是1只能再在该数据字节前面插入数据重数字节,置其值为1(此时由于高两位作为标记位已经置为1,故这里实际存储的是0XC1)。这样这个改进的RLE算法就完成了,其平均压缩率也比原始RLE算法更高,但是相对的压缩速度就稍微慢了。同样的与原始RLE算法一样也有最大长度问题,处理方法与原始RLE一样。(未压缩前:A-A-A-A-A-B-B-C-D,压缩后:5-A-2-B-C-D)

3、原始的RLE算法和改进后的RLE算法对于连续出现的不重复数据的处理方式都是一个一个处理的,没有把不重复数据作为一个整体进行处理。对于连续重复的数据,这个数字表示需要重复的次数,对于连续不重复数据,这个数字表示连续不重复数据块的长度。需要注意的是,只有重复次数超过2的数据才被认为是连续重复数据,因为如果数据的重复次数是2,压缩后加上标志字节后总的长度没有变化,因此没有必要处理。(未压缩前:A-A-A-A-A-B-B-C-D,压缩后:5-A-4-B-B-C-D)

30、  C# 系统应用之窗体最小化至任务栏及常用操作
一.界面操作
1.创建"Windows窗体应用程序"项目,从"工具箱"中添加NotifyIcon(运行时期间在Windows任务栏右侧的通知区域显示图标).鼠标右击notifyIcon1属性,为控件属性Icon添加图标,Text属性为"CSDN".
2.添加ContextMenuStrip(当用户右击关联控件时显示快键菜单).鼠标右键contextMenuStrip1属性,进入Items添加或右键"编辑项".添加3个toolStripMenuItem,设置其Text为"显示窗体"、"隐藏窗体"、"退出".如下图所示:

3.关联系统托盘图标与右键菜单.设置notifyIcon1的ContextMenuStrip属性为contextMenuStrip1关联两个控件.运行程序,右下角任务栏的系统托盘处图标点击右键显示如下图所示:

 
二.窗体设置
窗体设置主要是当窗体点击"退出"按钮时,任务栏仍然显示图标且程序没有退出.设置Form1的MaximizeBox(窗体是否能最大化)属性设置为False,让其不能最大化.并为Form1添加FormClosing(当用户关闭窗体时,在窗体已关闭并制定关闭原因前发生)事件.如下图所示.

添加代码如下,主要实现的功能是当用户点击窗体"关闭"按钮或通过Alt+F4快捷关闭时,取消关闭操作且窗体隐藏,任务栏图标仍然显示:

//窗体关闭前发生事件
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//窗体关闭原因为单击"关闭"按钮或Alt+F4
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;           //取消关闭操作 表现为不关闭窗体
this.Hide();               //隐藏窗体
}
}

其中:FormClosingEventArgs 类为FormClosing事件提供数据,其属性Cancel获取或设置是否应取消事件的值,CloseReason获取一个值,该值指示关闭窗体的原因.(详见MSDN FormClosingEventArgs 类)
注意:添加的事件是Form_Closing-窗体关闭前发生,而不是Form_Closed窗体已关闭发生.它没有e.Cancel属性,会提示错误 "System.Windows.Forms.FormClosedEventArgs"不包含Cancel的定义.

三.系统托盘功能
常见的窗体最小化至任务栏(系统托盘)图标的功能:
1.当鼠标左键点击图标时,显示窗体.
2.当鼠标右键点击图标时,显示"显示窗体"\"隐藏窗体"\"退出"菜单栏,并有相对应的功能.
具体操作是:分别点击"显示窗体"\"隐藏窗体"\"退出"在其属性栏中添加"Click"事件.添加代码如下:

//"显示窗体"单击事件
private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
this.Show();                                //窗体显示
this.WindowState = FormWindowState.Normal;  //窗体状态默认大小
this.Activate();                            //激活窗体给予焦点
}

//"隐藏窗体"单击事件
private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
this.Hide();                      //隐藏窗体
}

//"退出"单击事件
private void toolStripMenuItem3_Click(object sender, EventArgs e)
{
//点击"是(YES)"退出程序
if (MessageBox.Show("确定要退出程序?", "安全提示",
System.Windows.Forms.MessageBoxButtons.YesNo,
System.Windows.Forms.MessageBoxIcon.Warning)
== System.Windows.Forms.DialogResult.Yes)
{
notifyIcon1.Visible = false;   //设置图标不可见
this.Close();                  //关闭窗体
this.Dispose();                //释放资源
Application.Exit();            //关闭应用程序窗体
}
}

其中,窗体的状态FormWindowState有Minimized(最小化)、Maximized(最大化)、Normal(默认大小).有的程序设置sizechanged事件,当用户点击"最小化"按钮窗体尺寸变化时才最小化至任务栏(系统托盘).但我认为打开程序时就有最小化图标更好,同时添加FormClosing事件更符合用户使用.点击"退出"运行结果如下图所示:

最后添加鼠标左键图标显示窗体功能.右键notifyIcon1属性,添加MouseClick(鼠标单击组件时发生)事件.添加代码如下:
//鼠标左键图标事件
private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
//点击鼠标"左键"发生
if (e.Button == MouseButtons.Left)
{
this.Visible = true;                        //窗体可见
this.WindowState = FormWindowState.Normal;  //窗体默认大小
this.notifyIcon1.Visible = true;            //设置图标可见
}
}

四.完整代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WinFormMin
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

//窗体关闭前发生事件
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//窗体关闭原因为单击"关闭"按钮或Alt+F4
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;           //取消关闭操作 表现为不关闭窗体
this.Hide();               //隐藏窗体
}
}

//"显示窗体"单击事件
private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
this.Show();                                //窗体显示
this.WindowState = FormWindowState.Normal;  //窗体状态默认大小
this.Activate();                            //激活窗体给予焦点
}

//"隐藏窗体"单击事件
private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
this.Hide();                      //隐藏窗体
}

//"退出"单击事件
private void toolStripMenuItem3_Click(object sender, EventArgs e)
{
//点击"是(YES)"退出程序
if (MessageBox.Show("确定要退出程序?", "安全提示",
System.Windows.Forms.MessageBoxButtons.YesNo,
System.Windows.Forms.MessageBoxIcon.Warning)
== System.Windows.Forms.DialogResult.Yes)
{
notifyIcon1.Visible = false;   //设置图标不可见
this.Close();                  //关闭窗体
this.Dispose();                //释放资源
Application.Exit();            //关闭应用程序窗体
}
}

//鼠标左键图标事件
private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
//点击鼠标"左键"发生
if (e.Button == MouseButtons.Left)
{
this.Visible = true;                        //窗体可见
this.WindowState = FormWindowState.Normal;  //窗体默认大小
this.notifyIcon1.Visible = true;            //设置图标可见
}
}
}
}


## 鼠标事件:
1、MouseMove:表示在控件的区域内鼠标任意移动都会触发的事件,只要一移动就会触发,所以会触发很多次。
2、MouseEnter:表示鼠标经过该控件就会触发一次,就是鼠标在该控件的区域范围内就会触发一次。
3、与MovseEnter相对的就是MovseLeave:也是只会触发一次,就是当鼠标从控件区域范围离开就会触发一次。
4、MovseHover:和MovseEnter类似,但是Hover的意思是:徘徊,意思就是需要鼠标在控件区域范围内一段时间才会触发。很遗憾,MovseHoverTime字段只能get,不能set,所以只有400ms。
通过System.Windows.Forms.SystemInformation.MouseHoverTime;便可get到。


1、Point类中:X和Y都是int型;PointF类中:X和Y都是float型



2、  画椭圆: Graphics.FillEllipse(Brush, new Rectangle(0, 0, 200, 300));

public Rectangle(int x, int y, int width, int height)
System.Drawing.Rectangle 的成员

摘要:
用指定的位置和大小初始化 System.Drawing.Rectangle 类的新实例。

参数:
x: 矩形左上角的 x 坐标。
y: 矩形左上角的 y 坐标。
width: 矩形的宽度。
height: 矩形的高度。


3、获取鼠标位置

(1)Control.MousePosition:是整个屏幕鼠标的位置,左上角(0,0)

(2)Form.EventArgs e.Location:是控件里面鼠标的位置,控件的左上角(0,0)

4、ArrayList<Integer>如何转换为数组
ArrayList<Integer> intList = new ArrayList<Integer>();//泛型为Integer
intList.add(123);
intList.add(234);
intList.add(345);
Integer[] b = new Integer[intList.size()];//当泛型为Integer时,需要
b = (Integer[])intList.toArray(b);      //以Integer类来作为数组基本元素


5、返回上一层文件夹: ..\

private string pictureRoad = @”……\Tempature.jpg”; //已经返回了三层

6、 DataGirdView单元列内容居中显示:dataGridView.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;


7、GroupBox 去掉边框线重写paint事件:
private   void   groupBox1_Paint(object   sender,   System.Windows.Forms.PaintEventArgs   e)
{
e.Graphics.Clear(this.BackColor);
}


8、子控件在父控件居中,基于groupbox的父子居中
/// <summary>
/// 两个groupBox的居中
/// </summary>
/// <param name="kidBox">子groupBox</param>
/// <param name="FatherBox">父groupBox</param>
public void GroupBoxReSize(GroupBox kidBox, GroupBox FatherBox)
{
kidBox.Left = (FatherBox.Left - kidBox.Left) / 2;
int x = (int)(FatherBox.Width - kidBox.Width) / 2;
int y = kidBox.Location.Y;
kidBox.Location = new Point(x, y);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: