C#有感!

1.在想要改变ui时,添加一个检查来保险该操作在主线程内进行

1、InvokeRequired用来检查一个控件的当前线程是否是创建该控件的线程(UI线程),进入if里面就表示不在主线程中。
2、BeginInvoke唤醒UI线程来对控件内容进行更新,以避免跨线程操作异常

public delegate void FunDelegate();
private void funName()
{
	if(控件名.InvokeRequired)//例如 toolStrip2.InvokeRequired
	{//创建委托实例
		FunDelegate d = new FunDelegate(funName);
		this.BeginInvoke(d , new object[] {});//这里是因为这个函数没有传参,所以{}是空的。
		return;
	}
	
	//一下为该函数要实现的内容(比如改变ui控件颜色...)
}

2.创建数组

T[] arrayName = new T[size];

int[] arrName = new int[10]; //创建10个int型数据的数组

也可以分开写,例如:
private Label[] a;
a = new Label[5];

3.1String.format 方法

将对象的值转化为基于制定格式的字符串,并插到另一个字符串中去。

string s = "i'm {0},{1} years old;";
string s1 = string.format(s,"LiHua","8");
或者另一个调用方式
string s1 = s.format("LiHua","8");

或者合着写
string s = "8";
string s1 = string.format("i'm {0},{1} years old;" , "LiHua" , s);

也可以用其他类型
string s1 = string.format("i'm %s, %d years old;" , "LiHua" , 8);

也可以这样(挺灵活的,但不好记啧)
string s = "i'm {name},{age} years old;";
string s1 = s.format({name:"LiHua" , age:8});

3.2 string.Replace

 s1= s1.Replace("-", ":");//用:代替-

3.3 string.Split 将字符串拆分

string str = "you and me = us";
string[] sArry = str.Split('=');//以等于号为分界线
sArry[0] = "you and me ";
sArry[1] = "us";

3.3 ToString(“D4”)

D4就是转化含有4位整数位的字符串

int i = 12string s = i.ToSting("D4");
s为"0012"

3.4 获取当前时间

有很多超级多方式获取当前时间,还可以分开年月日获取
System.DateTime.Now.ToString();

string strRecordID = DateTime.Now.Date.ToString("yyyyMMdd");//获取时间

方法2 更多

System.DateTime currentTime=new System.DateTime();
取当前年月日时分秒  currentTime=System.DateTime.Now;
取当前年     int=currentTime.Year;
取当前月     int=currentTime.Month;
取当前日     int=currentTime.Day;
取当前时     int=currentTime.Hour;
取当前分     int=currentTime.Minute;
取当前秒     int=currentTime.Second;
取当前毫秒    int 毫秒=currentTime.Millisecond; 

3.5 获取本地计算机的主机名

string strComputer = Dns.GetHostName();//获取本地计算机的主机名

3.6 获取当前版本号

var  Version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();

3.6 获取当前路径

string path = System.IO.Directory.GetCurrentDirectory();

3.7 创建目录

详细

  1. 创建目录 Directory.CreateDirectory
string path = "c:\newDirectory";
Directory.CreateDirectory(path);
或者直接写出目录地址
Directory.CreateDirectory(@"c:\newDirectory");
  1. 设置目录属性(只读、隐藏)
在这里插入代码片
  1. 删除目录
//第二个参数决定是否删除非空目录
Directory.Delete(path,true);

3.7 StreamReader 读取文件

添加链接描述

 using (StreamReader sr = new StreamReader(GlobalData.Config_Path))
 { 
 	string line;
    while((line = sr.Readline()) != null)
     {对行进行操作}
 }

StreamWriter

3.8 文件

FileStream (string path, FileMode mode,FileAccess access)
通过路径文件path,打开文件模式mode以及读写模式access来创建一个fileStream实例对象。
详情


mode:

  1. Append:如果文件存在,那么打开文件,并定位到文件结尾;如果文件不存在,那么新建一个文件。
  2. Create:如果文件不存在,则新建文件;如果文件已经存在,那么把原文件覆盖。
  3. CreateNew:创建新的文件。如果文件已存在,则抛出异常。
  4. Open:打开现有文件,如果文件不存在,则抛出异常。
  5. OpenOrCreate:如果文件已存在,那么打开文件;否则,创建新文件。
  6. Truncate:打开现有文件,清除其内容,然后在文件末尾进行写操作。

读写模式access有以下几种:
7. Read:可以从文件中读取数据。
8. ReadWrite:可以从文件中读取数据和往文件中写入数据。
9. Write:可以往文件中写入数据。


创建文件

string filePathAndName = "c:\file\name.txt";
FileStream fs = new FileStream(filePathAndName, FileMode.Create);
fs.Close();//关闭文件

3.6 foreach

foreach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字in隔开的两个项组成。in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素。

该循环的运行过程如下:每一次循环时,从集合中取出一个新的元素值。放到只读变量中去,如果括号中的整个表达式返回值为true,foreach块中的语句就能够执行。一旦集合中的元素都已经被访问到,整个表达式的值为false,控制流程就转入到foreach块后面
的执行语句。

3.7 CopyTo

int[] sourceArray = { 1, 2, 3, 4, 5 };
int[] destinationArray = new int[5];
sourceArray.CopyTo(destinationArray, 0);

4.实例化一个类Class

public class ClassName 
{
	public void fun1(){}
	public int fun2(){return 1;}
	...
}
ClassName c = new ClassName();
在实例化类后,这个c可以调用class里的任意函数
c.fun1();

4.2 ArrayList 动态数组

堪称一个数组就行了
添加链接描述

ArrayList arrName = new ArrayList();

4.3 Controls 属性

表示控件集合

添加链接描述

foreach(Control i in this.control)//遍历this这个窗口的所有的控件
{
	i 指这个控件
	i.Width 控件的水平尺寸
	i.Height 控件的垂直尺寸
}

6. Interlocked类 线程安全操作类

可参考
还没看
Interlocked是为多个线程共享的变量提供原子操作,这个类是一个静态类 它提供了以线程安全的方式递增、递减、交换和读取值的方法。

方法作用
Increment()安全递加1,相当于 i++
Decrement()安全递减1,相当于 i–
Read()安全读取数值,相等于int a=b
Add()安全相加一个数值,相当于 a = a + 3
CompareExchange()安全比较两个值是不是相等。如果相等,将第三个值于其中一个值交换
Exchange()安全交换:把值2赋给值1;返回新值
int i = 0public void fun1 ()
{
	while(Interlocked.Read(ref i) == 1){...}
	Interlocked.Increment(ref i);//i++
}

public void fun2 ()
{
	while(Interlocked.Read(ref i) == 0){...}
	Interlocked.Decrement(ref i);//i--
}

在调用fun1和fun2的时候就不会相互打架

7.窗体

7.1 右上角三个窗体按钮

窗体属性

his.MaximizeBox=false;// 即可禁用最大化按钮,这里的this是指窗体对象。
this.MinimizeBox=false;// 即可禁用最小化按钮。
this.ControlBox=false; 

最小、最大、关闭三个按钮是一组ControlBox,将this.ControlBox=false 即可同时禁用这三个按钮。一旦这三个按钮都被禁用了,那就都不显示了。所以,关闭按钮被禁用了,这个窗口就无法通过系统自带的功能来关闭。必须要再写一个关闭的功能用来关闭它。

7.2 窗口位置 using System.Drawing;

这里有很多例子,很详细

窗体位置
CenterScreen正中心
Manual手动
this.StartPosition = FormStartPosition.CenterScreen;//窗口显示的位置处于屏幕的正中心
this指这个窗口;FormStartPosition表示的屏幕;

例如以下
MainForm m = new MainForm();//这是实例化了一个主窗口的对象
m..StartPosition = FormStartPosition.CenterScreen;//这个主窗口在屏幕的正中央
LoginForm login = new LoginForm();//再来一个登录窗口
login.StartPosition = m.CenterScreen;//登录窗口的位置在主窗口的正中心

login.ShowDialog();//表示必须先操作完登录窗口,才能操作后面的主窗体
MainForm m = new MainForm();
1、必须把窗体的显示位置设置为手动。
m.StartPosition=FormStartPosition.Manual;
2、获取屏幕的分辨率,也就是显示器屏幕的大小。 
int xWidth = SystemInformation.PrimaryMonitorSize.Width;//获取显示器屏幕宽度
int yHeight = SystemInformation.PrimaryMonitorSize.Height;//高度
3、设置窗体位置(这里设为一半)
m.Location = new Point(xWidth/2, yHeight/2);//这里需要再减去窗体本身的宽度和高度的一半
4、显示窗体
m.Show();

7.3 Showdialog 模态显示

添加链接描述

Form2 chuangti = new Form2();
chuangti.Showdialog();
  1. Showdialog 模态显示后,
    弹出窗口阻止调用窗口的所有消息响应。
    只有在弹出窗口结束后调用窗口才能继续。
    在模态窗口“关闭”后,可以读取模态窗口中信息,包括窗口的返回状态,窗口子控件的值。

  2. show 非模态显示后,
    可以在弹出窗口和调用窗口之间随意切换。
    调用窗口调用show方法后,下面的代码可以立即执行。
    在非模态窗口关闭后,窗口的所有资源被释放,窗口不存在,无法获取窗口的任何信息。

7.4 窗体推出

触发窗体推出事件

窗体推出不同使用

  1. this.Close();仅仅是关闭当前窗口,若不是主窗体的话程序无法退出。
  2. Application.Exit();强制所有消息终止,退出所有的窗体。
  3. Application.ExitThread();强制终止调用线程上的所有消息。
  4. System.Environment.Exit(0);最彻底的退出方式,不管什么线程都可以被强制退出。

7.5 MessageBox

添加链接描述

8.控件

8.1 RichTextBox

string s
RichTextBox1.Focus();//获取焦点(感觉可用可不用的,直接进行底下的也行)
RichTextBox1.AppendText(s + "\r\n");//在文本末尾追加字符串s,并换行
RichTextBox1.Select(RichTextBox1.TextLength,0);//选择到最后一行文本
RichTextBox1.ScrollToCaret();//滚动条滚到光标处

注意:这个ScrollToCaret()会造成阻塞请看这里

int s = RichTextBox1.Text.Length;
RichTextBox1.SelectionStart = s;//当前选择的起始位置的字符索引。
(也就是在s这个位置放了个屁股,这里选择是当前文本末尾)
然后可以在这个中间进行一些增加AppendText
RichTextBox1.SelectionLength = s2.Length;//增加文本长度
RichTextBox1.SelectionColor = Color.Red;//把增加的这部分文字标红

8.2 toolStrip 工具栏控件

还没看
toolStrip 是用来提供工具栏、菜单和状态栏等视觉元素的容器控件。ToolStrip 可以包含多个 ToolStripItem 控件,如 ToolStripButton、ToolStripTextBox 和 ToolStripSeparator 等等。

ToolStripStatusLabel.ToolTipText = ToolStripStatusLabel.Text;

8.3 ToolStripTextBox


//设置 toolStripComboBox2 的自动完成功能
toolStripComboBox2.ComboBox.AutoCompleteMode = AutoCompleteMode.None;// SuggestAppend;
 toolStripComboBox2.ComboBox.AutoCompleteSource = AutoCompleteSource.ListItems;

 //获取任务 ID 数据并绑定到组合框
 DataView dv = new DataView(DatabaseFunc.GetTasksID());
 toolStripComboBox2.ComboBox.DataSource = dv;
 toolStripComboBox2.ComboBox.DisplayMember = "Taskscode";

8.4 textBox

 textBox1.TextAlign = HorizontalAlignment.Center;//文本框居中对齐

8.5 控件触发状态

更多

  1. Click 点击时触发
  this.comboBox_serialPort.Click += new System.EventHandler(this.comboBox_serialPort_DropDown);   
  1. DropDown 下拉时触发
  this.comboBox_serialPort.DropDown += new System.EventHandler(this.comboBox_serialPort_DropDown);
  1. SelectedIndexChanged 选择后触发
  this.comboBox_serialPort.SelectedIndexChanged += new System.EventHandler(this.comboBox_serialPort_SelectedIndexChanged);          

8.6 ComboBox 控件

有很多属性,但没有具体举例,看不懂

  1. AutoCompleteMode 属性能让控件实现自动提示自动补全功能
    添加自动提示
this.ComboBox.AutoCompleteMode = AutoCompleteMode.None;
//---
None: 不启用自动提示和补全功能;
Append:将有可能出现的字符追加到现有字符,并突出显示;
Suggest:显示下拉列表, 列表中填充建议完成的字符串;
SuggestAppend: Append与Suggest的结合,
  1. AutoCompleteSource 获取或设置一个值,该值指定用于自动完成的完整字符串的源。

9.Thread 线程

  1. 创建Thread类的实例 t,并传递fun方法作为参数
//创建线程
Thread t = new Thread (fun);//fun为启动时运行的函数
//启动线程
t.Start();
t.Join();//用于主线程中等待新线程完成
t.IsBackground = true;//默认是 false。true表示在主线程推出后,该子线程也推出。如果是false则表示主线程退出,子线程不推出。

void fun(){...}
  1. 当创建的线程用另一个class里的函数来作为启动函数
Class C
{
	int i;
	void fun(){}
}
C c = new C();
c.i =10;//这个i的值也会被导入进去
Thread t = new Thread(c.fun);

10.Equals和==

10.1是比较两个值是否相等
对于
值类型==(如int、float、struct等),它比较的是的内容;
对于引用类型(如类、接口等),它比较的是引用是否指向内存中的同一对象(即地址是否相同)。所以即使两个对象的内容完全相同,如果它们是不同的实例,使用 == 也会返回 false。

int i = 10;
int j = 10;
if(i == j)//true

string s1 = "abc";
string s2 = "abc";
if(s1 == s2)//true

10.2 equals 比较两个对象的内容是否相等
这里有解释,,但是涉及到重写啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

11.重写???继承???=>???

继承可以使用被继承类里的所有东西吧?class a:b 这个是指a继承b吗
那a和b里的内容都不一样,继承到底是个什么东西???????????这里b应该是个基类??干啥的
而且甚至是可以Class a:b,c,d
那class d:Control
这个Control是什么????????????????????
头疼

12.File 文件

File.Exists(文件路径)//检查指定路径的文件是否存在。
File.ReadAllLines(文件路径,文件的编码格式);//读取文件的所有行
例如
string fileload ="c:\\hi"
if(File.Exists(fileload))//存在为true
string[] lines = File.ReadAllLines(fileload, System.Text.Encoding.GetEncoding("GB2312")); //指定文件的编码格式为 GB2312。

遍历 lines 数组中的每一行
foreach (string line in lines)
{
	if(line.Contains("LossPacket"))//检查当前行是否包含 "LossPacket" 字符串。
}

13、(object sender, EventArgs e)

1、object类型的sender:用于传递指向事件源对象的引用。简单来讲就是当前的对象。(例如button点击事件里的sender指button自己)
2、EventArgs类型的e:记录事件传递过来的额外信息。一般用于传递用户点击的位置啊,键盘按下的键等事件的额外信息。

private void btn_Click(object sender, EventArgs e)
{
	 System.Windows.Forms.Button button = (System.Windows.Forms.Button)sender;
}

14、锁

添加链接描述

14.1互斥锁

定义:
private static readonly object m_objLock = new object();
使用:
Monitor.Enter(m_objLock);
//todo
Monitor.Exit(m_objLock);
作用:将会锁住代码块的内容,并阻止其他线程进入该代码块,直到该代码块运行完成,释放该锁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值