C#学习随笔
1、字符串变量不能赋值给字符变量。
2、Math函数输出尽量取舍,一般用ToString("f4"),否则显示误差。
3、针对短时间内大量random产生重复问题(http://www.cnblogs.com/rupeng/p/3723018.html)
可以使用c#.net中的RNGCryptoServiceProvider产生任意范围强随机数的办法
//这样产生0 ~ 100的强随机数(含100) int max = 100; int rnd = int.MinValue; decimal _base = (decimal)long.MaxValue; byte[] rndSeries = new byte[8]; System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider(); rng.GetBytes(rndSeries); //不含100需去掉+1 rnd = (int)(Math.Abs(BitConverter.ToInt64(rndSeries, 0)) / _base * (max+1)); //这个rnd就是你要的随机数, //但是要注意别扔到循环里去,实例化RNG对象可是很消耗资源的
4、代码快速格式化Ctrl+K+D
5、全部通过代码新建窗体
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 Charpter3_6 { public partial class Form1 : Form { int PicNum = 1; public Form1() { InitializeComponent(); this.StartPosition = FormStartPosition.CenterScreen; } private void Form1_Load(object sender, EventArgs e) { PictureBox pic = new PictureBox(); pic.Width = 400; pic.Height = 300; pic.Top = 3; pic.Left = 5; pic.SizeMode = PictureBoxSizeMode.StretchImage; pic.ImageLocation = "1.jpg"; pic.Name = "Pic1"; Controls.Add(pic); Button btn1 = new Button(); btn1.Text = "上一张"; btn1.Name = "b1"; btn1.Enabled = false; btn1.Click += new EventHandler(btn_Click); Button btn2 = new Button(); btn2.Text = "下一张"; btn2.Name = "b2"; btn2.Enabled = true; btn2.Click += new EventHandler(btn_Click); btn1.Top = btn2.Top = pic.Height + 10; btn1.Left = (this.Width - btn1.Width - btn2.Width - 20) / 2; btn2.Left = btn1.Left + btn1.Width + 20; Controls.Add(btn1); Controls.Add(btn2); } private void btn_Click(object sender,EventArgs e) { Button b = (Button)sender; if(b.Text=="上一张") { PicNum = PicNum - 1; } else { PicNum = PicNum + 1; } PictureBox p = (PictureBox)Controls.Find("Pic1", true)[0]; p.ImageLocation = PicNum + ".jpg"; this.Text = "这是第" + PicNum.ToString() + "张图片"; Button b1 = (Button)Controls.Find("b1", true)[0]; Button b2 = (Button)Controls.Find("b2", true)[0]; switch(PicNum) { case 1: b1.Enabled = false; b2.Enabled = true; break; case 4: b1.Enabled = true; b2.Enabled = false; break; default: b1.Enabled = true; b2.Enabled = true; break; } } } }
6、关于C#静态构造函数的几点说明
静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次。也就是在创建第一个实例或引用任何静态成员之前,由.NET自动调用。
在使用静态构造函数的时候应该注意几点:
(1)、静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。
(2)、是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
(3)、一个类只能有一个静态构造函数。
(4)、无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
(5)、最多只运行一次。
(6)、静态构造函数不可以被继承。
(7)、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
class SimpleClass { // Static constructor static SimpleClass() { // } }
(1)、静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。
(2)、是在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
(3)、一个类只能有一个静态构造函数。
(4)、无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
(5)、最多只运行一次。
(6)、静态构造函数不可以被继承。
(7)、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
7、调用带参数的基类构造函数时,应使用base关键字。
C# 参考之方法参数关键字:params、ref及out(http://www.cnblogs.com/hunts/archive/2007/01/13/619620.html)
8、(1)、结构与数组:结构可以有不同数据类型的成员组成;结构的各成员还可以定义各自的访问权限。
(2)、集合与数组:在数据个数确定的情况下,可以采用数组来存储处理数据。但数据的个数不能确定的是,可以采用集合,在程序运行时动态地改变存储长度、添加或删除元素(近似认为集合是动态数组)。
(3)、数组的Clone与CopyTo:
1)CopyTo目标数组必须实例化,Clone不需;
2)CopyTo需要制定开始位置,Clone不需要。
(4)、数组Array类与ArrayList类;